Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[vim] Avoir un split avec plusieurs onglets (tab) en haut et toujours le même fichier en bas

9 réponses
Avatar
Francois Lafont
Bonjour à tous,

J'essaye d'apprendre vim et j'ai une question principale (la première) et 4 autres petites questions un peu annexes mais dont j'aimerais bien connaître une solution optimale. J'ai fait des recherches sur le Web mais je n'ai pas trouvé de réponses.

1. Si j'ouvre 3 fichiers comme ça :

vim -p f1 f2 f3

j'ai trois onglets dans vim, un par fichier, et je peux basculer de l'un à l'autre avec "gt" par exemple. Ok. Maintenant je souhaiterais, via un split, garder constamment sous mes yeux le fichier f1 dans vim tout en conservant la possibilité de basculer sur mes 3 onglets f1, f2 et f3. En fait, j'aimerais avoir ça :

+------------------------------------------+
| f1 | f2 | *f3* | |
+------------------------------------------+
| |
| Nous sommes dans le fichier f3. |
| |
| |
| |
| |
+------------------------------------------+
| f3 |
+------------------------------------------+
| |
| Nous sommes dans le fichier f1. |
| |
| |
| |
| |
+------------------------------------------+
| f1 |
+------------------------------------------+
|:w |
+------------------------------------------+

La fenêtre est splittée dans 2 sous-fenêtres :

- celle du bas affiche *toujours* le fichier f1.
- dans celle du haut, j'ai mes 3 onglets qui me permettent de basculer entre f1, f2 et f3, *mais* je souhaite que lorsque je bascule de l'un à l'autre (de l'onglet f2 à l'onglet f3 par exemple), la fenêtre du bas contenant f1, elle, reste présente.

J'ai tenté ça :

vim -p f1 f2 f3

Je suis alors dans l'onglet de f1. Je lance dans vim la commande « :split ». En apparence, ça semble bien correspondre à ce que je veux mais dès que je bascule de l'onglet f1 à celui de f2, mon split disparaît. En effet ce split fait partie de l'onglet f1 mais pas des autres onglets f2 et f3, du coup ça ne correspond pas à ce que je souhaite.

Voici mes questions annexes.

2. Pour copier toutes les lignes à partir du curseur jusqu'à la fin du fichier, je fais ça :
- v (pour être un mode visuel)
- 100% (pour aller directement à la fin du fichier)
- y (pour copier)
Est-ce qu'il y a plus simple ?

3. Pour copier toutes les lignes à partir du curseur jusqu'au début du fichier, je fais ça :
- v (pour être en mode visuel)
- 1G (pour aller directement à la ligne 1)
- y (pour copier)
Est-ce qu'il y a plus simple ?

4. Pour copier toutes les lignes de la ligne 45 à la ligne 545, je fais ça :
- 45G (pour aller directement à la ligne 45)
- v (pour être en mode visuel)
- 546G (pour aller directement à la ligne 546 et donc sélectionner la ligne 545)
- y (pour copier)
Est-ce qu'il y a plus simple ?

5. Pour copier toutes les lignes d'un fichier (de la ligne 1 à la dernière), je vois laisse imaginer ce que je fais... 1G -> 100% etc.)
Est-ce qu'il y a plus simple ?

Merci d'avance pour votre aide.


--
François Lafont

9 réponses

Avatar
Dominique ROUSSEAU
Le dim., 12 mai 2013 at 17:20 GMT, Francois Lafont a écrit :
[...]

pour le debut, je sais pas :)

Voici mes questions annexes.

2. Pour copier toutes les lignes à partir du curseur jusqu'à la fin du fichier, je fais ça :
- v (pour être un mode visuel)
- 100% (pour aller directement à la fin du fichier)
- y (pour copier)
Est-ce qu'il y a plus simple ?



:,$ y

3. Pour copier toutes les lignes à partir du curseur jusqu'au début du fichier, je fais ça :
- v (pour être en mode visuel)
- 1G (pour aller directement à la ligne 1)
- y (pour copier)
Est-ce qu'il y a plus simple ?



:0, y

4. Pour copier toutes les lignes de la ligne 45 à la ligne 545, je fais ça :
- 45G (pour aller directement à la ligne 45)
- v (pour être en mode visuel)
- 546G (pour aller directement à la ligne 546 et donc sélectionner la ligne 545)
- y (pour copier)
Est-ce qu'il y a plus simple ?



:45,545 y

5. Pour copier toutes les lignes d'un fichier (de la ligne 1 à la dernière),
je vois laisse imaginer ce que je fais... 1G -> 100% etc.)
Est-ce qu'il y a plus simple ?



:% y


En fait, toutes ces commandes utilisent le meme principe : tu indiques un
"range" de lignes sur lequel la commande va être appliquée (y, d, s, ...)

Y'a tout, là (en anglais) :

http://vim.wikia.com/wiki/Ranges
Avatar
Francois Lafont
Le 12/05/2013 19:58, Dominique ROUSSEAU a écrit :

2. Pour copier toutes les lignes à partir du curseur jusqu'à la fin du fichier, je fais ça :
- v (pour être un mode visuel)
- 100% (pour aller directement à la fin du fichier)
- y (pour copier)
Est-ce qu'il y a plus simple ?



:,$ y

3. Pour copier toutes les lignes à partir du curseur jusqu'au début du fichier, je fais ça :
- v (pour être en mode visuel)
- 1G (pour aller directement à la ligne 1)
- y (pour copier)
Est-ce qu'il y a plus simple ?



:0, y

4. Pour copier toutes les lignes de la ligne 45 à la ligne 545, je fais ça :
- 45G (pour aller directement à la ligne 45)
- v (pour être en mode visuel)
- 546G (pour aller directement à la ligne 546 et donc sélectionner la ligne 545)
- y (pour copier)
Est-ce qu'il y a plus simple ?



:45,545 y

5. Pour copier toutes les lignes d'un fichier (de la ligne 1 à la dernière),
je vois laisse imaginer ce que je fais... 1G -> 100% etc.)
Est-ce qu'il y a plus simple ?



:% y


En fait, toutes ces commandes utilisent le meme principe : tu indiques un
"range" de lignes sur lequel la commande va être appliquée (y, d, s, ...)



Ok. En fait, moi je cherchais des possibilités avec la touche "y" lorsqu'on est en mode "normal", mais en mode "commande" la commande "y" admet une autre syntaxe si je comprends bien.

Y'a tout, là (en anglais) :

http://vim.wikia.com/wiki/Ranges



Super merci beaucoup.


--
François Lafont
Avatar
Lucas Levrel
Le 12 mai 2013, Francois Lafont a écrit :

Le 12/05/2013 19:58, Dominique ROUSSEAU a écrit :
:,$ y
:0, y
:45,545 y
:% y



Ok. En fait, moi je cherchais des possibilités avec la touche "y"
lorsqu'on est en mode "normal",



Tu peux faire yG, y1G, 45Gy545G et 1GyG.

Un autre truc pratique, quand tu veux couper un bloc, pour ne pas devoir
mémoriser les numéros de ligne : ma (ou mb, mc...) sur la ligne de départ,
puis y'a (ou y'b, y'c...) sur la ligne d'arrivée (qui peut être avant
celle de départ).

--
LL
Avatar
Francois Lafont
Le 14/05/2013 11:31, Lucas Levrel a écrit :

Le 12/05/2013 19:58, Dominique ROUSSEAU a écrit :
:,$ y
:0, y
:45,545 y
:% y



Ok. En fait, moi je cherchais des possibilités avec la touche "y"
lorsqu'on est en mode "normal",



Tu peux faire yG, y1G, 45Gy545G et 1GyG.



Merci Lucas pour ces remarques.

Si je comprends bien la logique, G en mode dit "normal" permet de nous déplacer. Par exemple 45G pour aller à la ligne 45 avec la convention que si on ne précise pas la ligne ("G" tout court) on va à la dernière ligne du fichier. Ensuite, on a <XXX>y<XXX> avec <XXX> le début de la copie (si vide c'est la ligne courante) et <YYY> la fin (si vide c'est la ligne courant aussi).

Je n'arrive pas trop à faire le lien logique avec la syntaxe « y3y » par contre (qui permet de copier la ligne où je me trouve et les 2 suivantes).

Un autre truc pratique, quand tu veux couper un bloc, pour ne pas devoir
mémoriser les numéros de ligne : ma (ou mb, mc...) sur la ligne de
départ, puis y'a (ou y'b, y'c...) sur la ligne d'arrivée (qui peut être
avant celle de départ).



Je connaissais les marques pour se déplacer mais je ne savais pas qu'on pouvait les utiliser pour la copie aussi. Donc, là aussi c'est la même logique apparemment, « y'a » va copier tout ce qui va de la ligne courante jusqu'à la ligne de la marque a. En revanche à la différence de « y45G », mon curseur sera déplacé au niveau de la marque.

Tant qu'on est sur ces questions là, il y a un truc que j'arrive pas à faire. Soit ce fichier texte :

---------------------------------
111111111111111111
222222222222222222
333333333333333333
444444444444444444
555555555555555555
666666666666666666
777777777777777777
888888888888888888
999999999999999999
---------------------------------

Mettons que je veuille copier les lignes 3 et 4 et les insérer juste après la ligne 7. Je place par exemple mon curseur au niveau de la ligne 3, je fais « y2y » (en mode normal), je place mon curseur au niveau de la ligne 7, et je fais « p ». Ça marche, ça me donne bien ça :

(*)
---------------------------------
111111111111111111
222222222222222222
333333333333333333
444444444444444444
555555555555555555
666666666666666666
777777777777777777
333333333333333333
444444444444444444
888888888888888888
999999999999999999
---------------------------------

En revanche, pour copier certaines lignes j'aime bien utiliser le mode visuel. Alors je tente cette manip là : Je place mon curseur au début de la ligne 3 et je passe en mode visuel afin de sélectionner la totalité de la ligne 3 et de la ligne 4 (mon curseur est alors à la fin de la ligne 4). Là, je copie avec "y" et ensuite je place mon curseur au début de la ligne 8 et je fais "p". Et là je n'obtiens pas ce que je veux car j'ai :

---------------------------------
111111111111111111
222222222222222222
333333333333333333
444444444444444444
555555555555555555
666666666666666666
777777777777777777
8333333333333333333
444444444444444444
88888888888888888
999999999999999999
---------------------------------

Si j'essaye de faire la copie en fin de ligne 7, j'ai ça :

---------------------------------
111111111111111111
222222222222222222
333333333333333333
444444444444444444
555555555555555555
666666666666666666
777777777777777777333333333333333333
444444444444444444

888888888888888888
999999999999999999
---------------------------------

Bref, j'ai beau essayer un peu tout, avec une copie de lignes via le mode visuel, je n'arrive pas à obtenir un "coller" comme dans le cas (*). Y a t-il moyen de le faire en passant par le mode visuel pour la partie copie ? Parce que parfois ça peut être plus rapide de passer par le mode visuel pour la copie qu'en comptant les lignes.

--
François Lafont
Avatar
Lucas Levrel
Le 16 mai 2013, Francois Lafont a écrit :

Si je comprends bien la logique, G en mode dit "normal" permet de nous
déplacer. Par exemple 45G pour aller à la ligne 45 avec la convention
que si on ne précise pas la ligne ("G" tout court) on va à la dernière
ligne du fichier. Ensuite, on a <XXX>y<XXX> avec <XXX> le début de la
copie (si vide c'est la ligne courante) et <YYY> la fin (si vide c'est
la ligne courant aussi).



En gros, y suivi d'une commande de déplacement copie l'intervalle couvert.
y$ copie tout jusqu'à la fin de ligne, y0 jusqu'au début, yW jusqu'au
début du mot suivant, etc.

Je n'arrive pas trop à faire le lien logique avec la syntaxe « y3y » par
contre (qui permet de copier la ligne où je me trouve et les 2
suivantes).



Effectivement. Moi je fais plutôt 2yy, car je me représente yy comme une
commande à part entière, que je répète n fois.

En revanche, pour copier certaines lignes j'aime bien utiliser le mode
visuel. Alors je tente cette manip là : Je place mon curseur au début de
la ligne 3 et je passe en mode visuel afin de sélectionner la totalité
de la ligne 3 et de la ligne 4 (mon curseur est alors à la fin de la
ligne 4). Là, je copie avec "y" et ensuite je place mon curseur au début
de la ligne 8 et je fais "p". Et là je n'obtiens pas ce que je veux car
j'ai :

---------------------------------
111111111111111111
222222222222222222
333333333333333333
444444444444444444
555555555555555555
666666666666666666
777777777777777777
8333333333333333333
444444444444444444
88888888888888888
999999999999999999
---------------------------------

Si j'essaye de faire la copie en fin de ligne 7, j'ai ça :

---------------------------------
111111111111111111
222222222222222222
333333333333333333
444444444444444444
555555555555555555
666666666666666666
777777777777777777333333333333333333
444444444444444444

888888888888888888
999999999999999999
---------------------------------

Bref, j'ai beau essayer un peu tout, avec une copie de lignes via le
mode visuel, je n'arrive pas à obtenir un "coller" comme dans le cas
(*). Y a t-il moyen de le faire en passant par le mode visuel pour la
partie copie ? Parce que parfois ça peut être plus rapide de passer par
le mode visuel pour la copie qu'en comptant les lignes.



Je pense que P au lieu de p en début de ligne 7 fera l'affaire. Je ne
connais pas le mode visuel, mais apparemment la copie se fait alors sur un
mode « caractère » et non sur un mode « ligne » comme avec yy. p signifie
coller après le curseur. En mode « ligne », ça donne « la ligne d'après »,
alors qu'en mode caractère ça copie comme le ferait un traitement de texte
wysiwyg (dans ton deuxième essai, le buffer est inséré entre le dernier 7
et le caractère de fin de ligne).

P signifie coller avant le curseur. Du coup si tu colles avant le premier
7, soit après le caractère fin de ligne 6, ça devrait aller.

--
LL
Avatar
Benoit Izac
Bonjour,

le 16/05/2013 à 01:17, Francois Lafont a écrit dans le message
<5194179f$0$3740$ :

En revanche, pour copier certaines lignes j'aime bien utiliser le mode
visuel. Alors je tente cette manip là : Je place mon curseur au début
de la ligne 3 et je passe en mode visuel afin de sélectionner la
totalité de la ligne 3 et de la ligne 4 (mon curseur est alors à la
fin de la ligne 4). Là, je copie avec "y" et ensuite je place mon
curseur au début de la ligne 8 et je fais "p". Et là je n'obtiens pas
ce que je veux car j'ai :

---------------------------------
111111111111111111
222222222222222222
333333333333333333
444444444444444444
555555555555555555
666666666666666666
777777777777777777
8333333333333333333
444444444444444444
88888888888888888
999999999999999999
---------------------------------

Si j'essaye de faire la copie en fin de ligne 7, j'ai ça :

---------------------------------
111111111111111111
222222222222222222
333333333333333333
444444444444444444
555555555555555555
666666666666666666
777777777777777777333333333333333333
444444444444444444

888888888888888888
999999999999999999
---------------------------------

Bref, j'ai beau essayer un peu tout, avec une copie de lignes via le
mode visuel, je n'arrive pas à obtenir un "coller" comme dans le cas
(*). Y a t-il moyen de le faire en passant par le mode visuel pour la
partie copie ? Parce que parfois ça peut être plus rapide de passer
par le mode visuel pour la copie qu'en comptant les lignes.



Tu peux utiliser le mode visuel par lignes (avec « V » au lieu de
« v »). Sinon en mode visuel classique, c'est « P » pour coller avant là
ou se trouve le curseur.

--
Benoit Izac
Avatar
ST
On 2013-05-16, Benoit Izac wrote:
En revanche, pour copier certaines lignes j'aime bien utiliser le mode
visuel. Alors je tente cette manip là : Je place mon curseur au début
de la ligne 3 et je passe en mode visuel afin de sélectionner la
totalité de la ligne 3 et de la ligne 4 (mon curseur est alors à la
fin de la ligne 4). Là, je copie avec "y" et ensuite je place mon
curseur au début de la ligne 8 et je fais "p". Et là je n'obtiens pas
ce que je veux car j'ai :





Pourquoi ne pas faire 2yy pour copier 2 lignes en entier ?
Avatar
Benoit Izac
Bonjour,

le 18/05/2013 à 01:29, ST a écrit dans le message
:

On 2013-05-16, Benoit Izac wrote:
En revanche, pour copier certaines lignes j'aime bien utiliser le mode
visuel. Alors je tente cette manip là : Je place mon curseur au début
de la ligne 3 et je passe en mode visuel afin de sélectionner la
totalité de la ligne 3 et de la ligne 4 (mon curseur est alors à la
fin de la ligne 4). Là, je copie avec "y" et ensuite je place mon
curseur au début de la ligne 8 et je fais "p". Et là je n'obtiens pas
ce que je veux car j'ai :





Pourquoi ne pas faire 2yy pour copier 2 lignes en entier ?



Attention, ta manière de citer prête à confusion (je ne suis pas
l'auteur du paragraphe ci-dessus).

Concernant la réponse à ta question, il suffit de prendre la première
phrase pour y répondre :
« En revanche, pour copier certaines lignes j'aime bien utiliser le mode
visuel. »

--
Benoit Izac
Avatar
Lucas Levrel
Le 30 mai 2013, Francois Lafont a écrit :
Quoi qu'il en soit je ne regrette pas d'avoir lancé ce fil, j'y a appris
plein de petits « trucs » pour mieux utiliser vim. Merci encore.



Moi j'ai découvert le mode visuel. Ça va bien me servir (surtout le mode
visuel caractères), merci à toi !

--
LL