[vim] Avoir un split avec plusieurs onglets (tab) en haut et toujours le même fichier en bas
Le
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
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
pour le debut, je sais pas :)
:,$ y
:0, y
:45,545 y
:% 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
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.
Super merci beaucoup.
--
François Lafont
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
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).
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
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.
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.
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
le 16/05/2013 à 01:17, Francois Lafont a écrit dans le message
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
Pourquoi ne pas faire 2yy pour copier 2 lignes en entier ?
le 18/05/2013 à 01:29, ST
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
Moi j'ai découvert le mode visuel. Ça va bien me servir (surtout le mode
visuel caractères), merci à toi !
--
LL