Mon aide-mémoire Vim
J'ai commencé à utiliser Vim en stage de fin d'études en 1996 parce qu'on m'a dit « si tu veux travailler sur Unix, il faudra que tu apprennes à utiliser Vi ». J'ai trouvé ce logiciel bizarre mais je m'y suis mis. Pendant des années, j'avoue que je me suis contenté d'en savoir le minimum. J'apprenais au fur et à mesure, mais sans passion. Puis j'ai essayé Emacs (XEmacs pour être précis) mais je suis revenu à Vim car je préférais la concision de ses "raccourcis clavier" (commandes). Quelques années plus tard, on m'a dit qu'Eclipse était beaucoup plus "pro" que Vim, alors je l'ai essayé aussi. C'était alors un logiciel qui mettait de longues secondes à démarrer et qui consommait beaucoup de mémoire. Puis le matériel est devenu puissant, alors j'ai commencé à l'apprécier. Mais finalement je suis encore revenu à Vim pour sa rapidité et parce qu'il est sur tous les serveurs accessibles en SSH. Eclipse m'a quand même permis de découvrir des fonctions d'aide à la programmation qui manquaient dans Vim, à l'époque. Eclipse est un IDE fourni en une seule pièce alors que pour avoir la même chose avec Vim, il faut assembler les pièces de son choix. C'est la bonne vieille idée du produit fourni en kit : chronophage mais fun.
On remarquera que les commandes de Vim ont une signification en anglais, par exemple ct< signifie change till < (changer jusqu'au caractère <), yiw signifie yank in word (copier * l'intérieur du mot), va" signifie visual around " (faire une sélection visuelle entourant les caractères ")
J'ai indiqué les touches par cette présentation et les commandes Vim ou le code par cette présentation
.
J'ai respecté la convention de la doc de Vim pour les majuscules, c'est-à-dire que j'ai écrit H et pas Maj h. Quand il y a un risque de confondre la lettre majuscule et la minuscule comme C et c, j'ai précisé majuscule.
Aller à la ligne numéro 123 | :123 ou 123G |
---|---|
Aller à la colonne numéro 45 | 45| |
Numéroter les lignes ou pas | :set number ou :set nonumber |
Aller de la parenthèse fermante à l'ouvrante et réciproquement | % (fonctionne aussi sur des balises HTML/XML avec le plugin matchit) |
Aller au prochain caractère a | fa (forward) met le curseur sur a, ta (till) met le curseur sur le caractère à gauche de a |
Aller au précédent caractère a | Fa met le curseur sur a, Ta met le curseur sur le caractère à droite de a |
Aller au début du bloc { } | [{ |
Aller à la fin du bloc { } | ]} |
Aller au début de la fonction courante | [m |
Aller à la fonction précédente/suivante | [[ et ]] (la doc de Vim parle de section) |
Aller au prochain paragraphe | } |
Aller au milieu de la fenêtre | M (Middle) |
Aller en bas de la fenêtre | L (Low) |
Aller en haut de la fenêtre | H (High) |
Aller en début de ligne de texte en tenant compte de l'indentation éventuelle |
^ |
Aller en colonne zéro | 0 |
Aller en bout de ligne | $ |
Marquer une ligne pour y revenir plus tard |
ma pour la nommer a mais on peut la nommer b, c, etc. |
Aller à la marque a |
`a ou 'a pour la nuance, cf :help mark-motions
|
Lister les marques |
:marks |
Écraser/changer le texte jusqu'à la fin de la ligne | C ou c$ |
Effacer jusqu'à la fin de la ligne | D ou d$ |
Remplacer un caractère et saisir typiquement un espace à remplacer par <br> et passer à la ligne |
s puis saisir (ou x puis i) |
Remplacer toute la ligne | S ou cc |
Insérer en début de ligne en tenant compte de l'indentation éventuelle |
I |
Insérer en bout de ligne | A |
Insérer une ligne |
o sous la ligne courante ou O au-dessus (o majuscule) Un détail énervant quand on utilise la commande O avec le réglage par défaut de Vim, c'est qu'il fait une pause d'une seconde pour distinguer O de l'émulation des touches flèchées (une vieille histoire de terminaux Unix ?). Ça peut se régler en mettant l'option set ttimeoutlen=100 dans ~/.vimrc(ce sont des millisecondes) |
Insérer la même chose qu'à la ligne précédente/suivante, caractère par caractère au lieu de dupliquer la ligne et modifier la partie qui change | en mode insertion Ctrl y pour la ligne du dessus Ctrl e pour la ligne du dessous |
Aller à la ligne suivante/précédente |
flèche ou g flèche avec g, la flèche déplace le curseur d'une ligne d'écran, comme dans un traitement de texte, y compris s'il s'agit de la même ligne qui déborde de la largeur de fenêtre avec l'option :set wrap
|
Liste des fichiers ouverts récemment |
:browse oldfiles Pour filtrer : :browse filter /bidule/ oldfiles ou avec le plugin ctrlp.vim (liste mru) ou plus rapide encore avec le plugin fzf.vim :History
|
Aller au dernier endroit modifié dans le fichier |
g;
on peut remonter plusieurs fois en arrière Liste avec :changes (info sauvée dans .viminfo) |
Revenir à l'endroit modifié suivant | g, on peut le faire plusieurs fois |
Répéter la dernière opération (insertion, remplacement, indentation…) | . |
Répéter 10 fois la dernière opération | 10. |
Répéter le dernier mouvement f ou F ou t ou T |
; pour répéter dans le même sens , pour répéter dans le sens inverse |
Répéter la dernière commande du type :s/foo/bar/gc |
@:
une première fois puis
@@
les fois suivantes (mais je préfère faire :s ↑ pour remonter dans l'historique)
|
Annuler (undo) |
|
Rétablir (redo) | Ctrl r |
Supprimer le caractère sous le curseur | x |
Supprimer le caractère à gauche du curseur | X |
Supprimer le mot à gauche du curseur |
en mode insertion ou sur la ligne de commande : Ctrl w en mode normal : db (delete till beginning of word) |
Supprimer une ligne | dd |
Supprimer toutes les lignes qui commencent par foo |
:g/^foo/d globalement, cherche ^foo et delete |
Supprimer 5 lignes | 5dd |
Dupliquer 5 lignes | 5yyP |
Déplacer une ligne vers le bas |
ddp
ou avec la commande :move
:m +1
|
Déplacer une ligne vers le haut |
dd ⬆ P
ou avec la commande :move
:m -2
|
Copier une ligne dans un registre (une sorte de presse-papiers alternatif, :registers pour les lister) |
"ayy (où a est le nom du registre) |
En particulier, copier dans le presse-papiers de Linux | "+yy (+ est le registre presse-papiers) |
Coller une ligne en respectant l'indentation à l'endroit où on colle |
p ou P ne suffisent pas pour l'indentation ]p pour coller après la ligne courante ]P pour coller avant la ligne courante |
Coller du texte depuis le presse-papiers |
en mode commande "+p en insertion Ctrl r + (en insertion, Ctrl r + ou Maj Ctrl v du terminal est lent parce que Vim interprète chaque caractère collé, un par un) |
Coller du texte depuis la sélection X11 |
"*p en mode commande Ctrl r * en insertion ou Maj Inser ou clic bouton du milieu mais même problème que Maj Ctrl v |
Coller tel quel sans indenter |
:set paste
puis
p
|
Indenter le texte qu'on vient de coller |
`[v`]= Explication : `[ pour aller au début de ce qu'on vient de coller (marque spéciale créée automatiquement par Vim lorsqu'on colle) v pour commencer la sélection visuelle `] pour aller à la fin de ce qu'on vient de coller (autre marque spéciale automatique) = pour indenter |
Sélectionner toute la ligne | V (majuscule) |
Sélectionner tout le paragraphe | vip (visual in paragraph) |
Sélectionner entre les lignes 123 et 456 |
:123 Entrée ou 123G pour aller à la ligne 123 puis V 456G
|
Sélection rectangulaire (verticale) | Ctrl v puis flèche ou } |
Insérer sur plusieurs lignes | Faire une sélection rectangulaire puis I puis saisir puis Echap |
Ajouter à la fin sur plusieurs lignes | Faire une sélection rectangulaire puis $A puis saisir puis Echap |
Déplacer le curseur au début ou à la fin de la sélection active |
o et aussi O (majuscule) pour une sélection rectangulaire |
Remplacer un caractère par un autre, par exemple i | r i |
Remplacer chaque caractère de la sélection par un autre caractère, par exemple = |
D'abord sélectionner par v ou V puis gr = Idéal pour souligner une ligne en texte pur en la dupliquant puis… sans recourir à :s/./=/g Commande à lire comme global replace |
Écraser au lieu d'insérer |
en mode commande R en mode insertion Inser passe du mode insertion au mode écrasement |
Joindre deux lignes en une seule |
J
reformate avec un espace entre deux gJ ne reformate pas |
Joindre plus de deux lignes | VJ ou VgJ |
Replier tous les blocs de code |
zM Se lit comme pliage (z) Maximal Pour PHP : dans .vimrc ajouter let php_folding = 1
|
Déplier tous les blocs de code |
zR Se lit comme pliage (z) Réduit |
Déplier/replier le bloc sous le curseur |
za Se lit comme pliage (z) alterné |
Déplier récursivement sous le curseur une classe et ses méthodes, par exemple |
zO (o majuscule) |
Replier les lignes sélectionnées |
zf il faut d'abord être en méthode de pli manuelle :set foldmethod=manual
|
Correction orthographique du mot sous le curseur |
mettre dans ~/.vimrc set spelllang=fr puisactiver la correction orthographique avec :set spell puis z=désactiver la correction orthographique avec :set nospell
|
Reformater un texte à 75 caractères de large | Sélectionner les lignes puis :!fmt Vim va transformer en :'<,'>!fmt Ou la ligne sous le curseur :.!fmt |
Désactiver le retour au début dans la fonction chercher |
:set nowrapscan
|
Chercher un fichier dont le nom contient foo |
:e **/*fooTabulation Plus pratique avec l'option :set wildmenu et avec :set wildmode=list:full Plus pratique avec le plugin ctrlp.vim : Ctrl p foo Pour chercher dans les buffers déjà ouverts Ctrl ↑ Et s'il ne trouve toujours rien, c'est peut-être que le buffer est sous tes yeux :b Encore plus rapide avec le plugin fzf.vim :FZF ou :fz TabulationEt dans les buffers ouverts :Buffers Et dans l'historique :History
|
Chercher une classe ou une variable ou une fonction |
Avec le programme ctags et le plugin vim-gutentags :tselect MaClasse Fonctionne sur une portion du nom avec :ts /lass Pour chercher sur des morceaux de tags, par exemple pour chercher MaClasseAvecUnNomTresTresLong en saisissant seulement clanomtre, utiliser le plugin ctrlp.vim Ctrl p puis Ctrl ↑ pour aller à l'onglet des tags Plus rapide avec le plugin fzf.vim :Tags Plus moderne avec un language server tel que Phpactor + Vim-ALE : :ALESymbolSearch bidule
|
Chercher les utilisations de la classe, la variable ou la fonction sous le curseur |
Pour du C, avec cscope ou GNU Global. Ou sinon, palliatif : :vimgrep Ctrl r Ctrl w **/*.php | cwindow Plus moderne et exact : installer le plugin ALE et un language server puis utiliser :ALEFindReferences (cherche le mot sous le curseur)
|
Visualiser les classes, variables, fonctions |
Avec le plugin Tagbar:Tagbar
|
Chercher foo dans l'éditeur |
/foo puis :noh pour désactiver la surbrillance jusqu'à la prochaine recherche
mais pas :set nohlsearch qui désactive la surbrillance pour toute la session
|
Chercher uniquement dans la sélection courante |
/\%Vfoo
(ne pas oublier de faire Échap avant, pour quitter le mode sélection) |
Chercher en ignorant la casse |
Juste une fois : /foo\c Tout le temps : :set ignorecase ou :set ic
|
Chercher en respectant la casse |
Juste une fois, si on a fait :set ic : /foo\CTout le temps : :set noignorecase ou :set noic
|
Savoir si on est sensible à la casse ou pas |
:set ic?
|
Chercher le mot sous le curseur | * (pas besoin de le sélectionner) |
Chercher le texte sélectionné |
Echap pour sortir du mode sélection puis / Ctrl r * Le registre * de la sélection X11 (voir :help <C-R> pour les autres)
|
Chercher le texte entre guillemets, par exemple dans <p id="foo-bar"> |
Mettre le curseur entre les guillemets, puis / Ctrl r Ctrl f En fait Ctrl fc'est pour les fichiers mais ça marche très bien avec ce genre de truc cf :help ctrl-r_ctrl-f (l'underscore entre les deux est important)Autre méthode moins rapide : yi" puis / Ctrl r " |
Chercher le mot sous le curseur dans tous les fichiers |
:vimgrep Ctrl r Ctrl w ** puis :cwindow ou :vimgrep Ctrl r Ctrl w ** | cw plus rapide avec un grep externe :grep -nri Ctrl r Ctrl w . puis :cw encore plus rapide avec ripgrep et le plugin vim-ripgrep (utilise la "quickfix window") :Rg ou encore avec ripgrep et le plugin FZF (présente les résultats autrement) :Rg Ctrl r Ctrl w
|
Chercher dans le fichier/buffer courant et afficher la liste des correspondances |
:vimgrep foo % | cw puis aller à la correspondance suivante avec :cnext
|
Mettre en surbrillance toutes les occurences de la recherche |
:set hls
(highlight search)
|
Remplacer foo par bar dans tout le fichier |
:%s/foo/bar/g
|
Remplacer foo par bar dans tout le fichier avec confirmation |
:%s/foo/bar/gc
|
Remplacer foo par bar dans la sélection | Sélectionner puis :s/foo/bar/g |
Renommer une variable dans un bloc |
D'abord chercher la variable avec * puis sélectionner le bloc avec va{ puis commencer à saisir la commande :s/
récupérer la recherche de variable par Ctrl r / et enfin pour confirmer chaque occurence /gc
Mis bout à bout, ça donne quelque chose comme:'<,'>s/\<foo\>/bar/gc Ou installer le plugin vim-php-refactoring-toolbox Mieux : avec le plugin Phpactor :PhpactorContextMenu Dans ~/.vimrc autocmd FileType php noremap <Leader>c :PhpactorContextMenu<CR>
|
Faire un autre remplacement dans la même sélection | gv pour faire réapparaître la sélection puis :s etc... |
Refaire un remplacement antérieur |
:s
⬆
|
Passer un mot tout en majuscules | gUw (go Uppercase word) |
Passer un mot tout en minuscules | guw |
Remplacer jusqu'au prochain caractère < sans l'inclure | ct< |
Remplacer le contenu d'une balise XML/HTML | cit (change in tag) |
Remonter à la balise (tag) parente dans du HTML/XML |
vatat(visual around tag around tag… autant de fois que de niveaux parents souhaités) puis v ou Echappour sortir du mode visuel |
Sélectionner jusqu'au prochain caractère < sans l'inclure | vt< |
Sélectionner le texte entre guillemets |
vi"(visual in ") Y compris les guillemets : va"(visual around ") |
Sélectionner le mot sous le curseur | viw (visual in word) |
Effacer un mot quand le curseur est sur le dernier caractère |
daw(delete around word) mais pas diw(delete in word) qui laisse l'espace derrière le mot donc on se retrouve avec deux espaces consécutifs et encore moins db qui laisse le dernier caractère |
Effacer une chaîne de caractères y compris ses guillemets | da" (delete around ") |
Effacer tout du curseur à la prochaine occurence de alt= par exemple dans <img class="foo" alt="bar"> |
d/alt= |
Échanger des mots à des endroits éloignés |
Méthode 1
Méthode 2
Comme ce n'est pas facile d'anticiper, la méthode 1 est plus naturelle Si j'oublie de marquer l'endroit, je peux y revenir par g;g; (ou 2g;) |
Compter le nombre d'occurence de foo |
:%s/foo/&/gn
|
Compter le nombre de mots et de lignes de la sélection | g Ctrl g |
Insérer la date du jour |
En mode insertion Ctrl r puis = et entrer strftime('%d/%m/%Y') (seulement la première fois, ensuite il suffit de faire Ctrl r = ↑ pour remonter l'historique) |
Ajouter <b> </b> autour de la première lettre de plusieurs mots |
Avec une macro : qa affiche Enregistrement @a puis i saisir <b> puis se déplacer d'un caractère à droite et saisir </b> Échap pour sortir du mode insertion q pour finir d'enregister la macro puis se positionner devant chaque lettre à mettre en gras et faire @a
|
Ajouter <b> </b> autour de la sélection courante |
s,\%V.*\%V,<b>&</b>, Beaucoup plus simple avec le plugin vim-surround S <b> (c'est un S majuscule) |
Ajouter un if ou une boucle for autour de quelques lignes |
Avec le plugin vim-surround V pour sélectionner les lignes puis S } puis i et saisir le if ou le for |
Remplacer <b> </b> par <a href="…"> </a> |
Avec le plugin vim-surround cst <a href="…"> (change surrounding tag) |
Supprimer <a href="…"> </a> |
Avec le plugin vim-surround dst (delete surrounding tag) |
Remplacer les guillemets simples par des doubles | Avec le plugin vim-surround cs'" |
Ajouter des guillemets autour du mot sous le curseur | Avec le plugin vim-surround ysiw" |
Ajouter <li> </li> autour de plusieurs lignes |
Avec le plugin vim-surround Sélectionner les lignes avec V puis :normal yss<li> :normal permet d'appliquer la commande yss sur plusieurs lignes
|
Ajouter des parenthèses autour de la sélection |
Avec le plugin vim-surround Sans espaces S) Avec espaces S( |
Supprimer les espaces inutiles dans maFonction( $truc ) | Avec le plugin vim-surround cs() |
Scroller l'éditeur sans déplacer le curseur |
Vers le bas Ctrl e Vers le haut Ctrl y |
Déplacer le curseur d'un mot |
w(word) ou b(beginning) ou e(end) ou Maj flèche gauche/droite La ponctuation sert de séparateur. Par exemple : <a href="foo" class="bar"> <a href="foo" class="bar"> |
Déplacer le curseur d'un bloc de caractères (seuls les espaces sont comptés comme séparateurs) |
W ou B ou E ou Ctrl flèche gauche/droite Par exemple : <a href="foo" class="bar"> <a href="foo" class="bar"> |
Retourner à la position précédente du curseur |
Ctrl o
(rouvre les fichiers si besoin) (liste avec :jumps )
|
Retourner à la position suivante du curseur | Ctrl i |
Sur une fonction : afficher sa documentation |
Kouvre le manuel pour le C, sinon il faut mettre dans .vimrc quelque chose comme nnoremap K :exe '!firefox http://php.net/manual-lookup.php?pattern=<cword>&scope=quickref'<CR><CR> Mieux : installer le plugin ALE et un language server puis utiliser :ALEHover
ou un raccourci comme noremap <Leader>o<CR> ou noremap ]o :ALEHover Pour éviter d'utiliser une preview window qu'il faut fermer ensuite, on peut mettre dans .vimrc let g:ale_floating_preview = 1 et pour que la floating window (ou popup) soit agréable à voir, let g:ale_floating_window_border = ['│', '─', '┌', '┐', '┘', '└', '│', '─']
|
Dans le même esprit : traduire en anglais le texte sélectionné |
Mettre dans .vimrc vnoremap <Leader>tr y:exe '!firefox "https://translate.google.com/\#fr/en/' . substitute(strtrans(@"), '\^@', ' ', 'g') . '"'<CR><CR> puis utiliser avec
\tr
|
Sur une fonction ou une variable : aller à sa déclaration |
Sans plugin, aller à la première déclaration dans le fichier : gd Avec le programme ctags et le plugin vim-gutentags : Ctrl ] ou g] ou dans une nouvelle fenêtreCtrl w ] Plus précis, en tenant compte du langage de programmation, par exemple PHP : installer le plugin ALE et un language server comme par exemple Phpactor puis utiliser :ALEGoToDefinition (cherche le mot sous le curseur)Plus pratique : mapperCtrl ] sur cette fonction Pour revenir en arrière, après : Ctrl t |
Sur une fonction : afficher la hiérarchie de classes (héritage, parents et descendants) | (?) |
Compléter le nom de la fonction ou la variable |
Ctrl x Ctrl o (sans sortir du mode insertion) |
Compléter le mot (quel que soit le contexte) |
Ctrl npour next ou Ctrl pprevious (sans sortir du mode insertion) Pour annuler la complétion : Ctrl e Peut servir aussi à répéter le dernier mot saisi, par exemple Pour tous les types de complétion, voir |
Compléter par plusieurs mots précédents |
Ctrl x Ctrl p
(sans sortir du mode insertion) Autant de fois que de mots à ressortir |
Compléter le nom de fichier | Ctrl x Ctrl f |
Fermer automatiquement les parenthèses, crochets, accolades, guillemets |
Installer le plugin Auto Pairs Note : il y a un bug avec les circonflexes Mieux : installer le plugin delimitMate Note : pour sortir de bidule('foobar').truc() et mettre le curseur derrière la parenthèse fermante de bidule sans sortir du mode insertion, on peut faire Ctrl g g qui est un mapping de delimitMate et qui est plus rapide que Échap f . icf. :h delimitMate
|
Insérer les imports |
En PHP avec le plugin vim-php-namespace, en mode insertion, derrière la classe à importer
\u Mieux avec le plugin Phpactor : :PhpactorImportClass Dans mon ~/.vimrc : autocmd FileType php noremap <Leader>u :PhpactorImportClass<CR>
|
Trier les imports |
En PHP avec le plugin vim-php-namespace\s ou plus simplement sélectionner les lignes "use" et faire !sort Mieux avec le plugin Phpactor : :PhpactorImportMissingClasses .vimrc : autocmd FileType php noremap <Leader>U :PhpactorImportMissingClasses<CR>
|
Utiliser des snippets (bribes de code) |
Installer UltiSnips Voir cette note pour bien l'utiliser |
Créer ses abréviations ou snippets |
Utiliser UltiSnips (:help UltiSnips )ou sinon mettre dans .vimrc abbreviate HR Hervé Renault <adresse@mail> puis pour utiliser saisir HR suivi d'un espace |
Commenter la ligne | Avec le plugin NERD Commenter \cc |
Décommenter la ligne | Avec le plugin NERD Commenter \cu |
Commenter un bloc |
Avec le plugin NERD Commenter
\cm (de multiples lignes) |
Décommenter un bloc | Avec le plugin NERD Commenter \cu |
Commenter toutes les lignes qui contiennent FOO pour du PHP dans cet exemple |
:g,FOO,normal I// cherche globalement FOO et applique la commande du mode normal I (insère en début de ligne) //espace |
Indenter une ligne | >> |
Désindenter une ligne | << |
Indenter une sélection | > |
Corriger l'indentation |
D'une sélection de lignes = Du fichier entier gg=G |
Remplacer l'indentation tabulation par 4 espaces |
:%!expand -i -t 4
|
Remplacer les passages à la ligne du DOS (retours chariot) = remplacer CRLF par LF en anglais |
:set fileformat=unix ou en abrégé :set ff=unix
|
Afficher les espaces et tabulations en trop |
Mettre dans .vimrc :
highlight RedundantSpaces term=standout ctermbg=Grey guibg=#ffddcc
|
Vérifier la syntaxe |
:!php -l % Plutôt utiliser le plugin Syntastic (et pour le désactiver temporairement :SyntasticToggleMode )Plus moderne : installer le plugin ALE qui lance php -l et d'autres analyseurs au choix, en asynchrone |
Contrôler la qualité du code PHP |
Installer phpcs, phpmdet le plugin Syntastic
Plus moderne : installer le plugin ALE qui lance php -l et d'autres analyseurs au choix, en asynchrone |
Reformater le code PHP (pas seulement l'indentation) |
:%!phpcbf Le plugin ALE peut lancer phpcbf par :ALEFix
|
Reformater du JSON |
Mettre dans .vimrcnmap =j :%!python -m json.tool<cr> ou nmap =j :%!jq .<cr> puis utiliser par =j |
Aller à l'erreur suivante / précédente |
Avec les plugins Syntastic ou ALE, et des analyseurs tels que phpcs, phpmd et Phpstan:lr (lrewind) pour aller à la première erreur:lne et :lp (lnext et lprevious) pour naviguer :laf et :lbe (lafter et lbefore) pour aller à l'erreur la plus proche du curseur Plus pratique, dans ~/.vimrc : nmap ]e :lafter<CR> nmap [e k :lbefore<CR>
|
Run | Utiliser Ctrl z ou un autre terminal ou screen pour scinder le terminal ou tmux |
Debug |
Avec le plugin Vdebug
On peut soit ajouter
En ligne de commande, exporter la variable |
Voir les lignes modifiées par rapport à git |
Avec le plugin vim-gitgutter ~/.gitconfig
[core] quotePath = false(a priori inutile à partir de git 2.34 mais je n'ai pas vérifié) |
Voir la différence entre la version de travail et la version commitée |
Avec le plugin vim-fugitive :Gvdiffsplit (plus simplement :Gv Tab)La version de travail se trouve à droite, ce qui est logique du point de vue temporel : la version de travail vient après la version commitée. Note : J'ai un bug quelque part (mon terminal ? mon colorscheme ?) qui affiche les chaines de caractères modifiées en rouge sur rouge, donc j'ai mis dans mon .vimrc highlight DiffText ctermfg=white ctermbg=red
|
Voir la diff entre la version courante et la version antérieure du commit abcdef |
:Gvdiffsplit abcdef Par contre, la version courante s'affiche à gauche, ce n'est pas chronologique. |
Changer d'onglet (tab) |
Créer un onglet :tabnew puis passer à l'onglet suivant ou précédent gt gT |
Afficher l'explorateur de fichiers |
Avec Netrw, l'explorateur par défaut : :Explore Avec le plugin NERD Tree :NERDTree
Je me suis fait un raccourci \n avec map <Leader>n :NERDTree<bar> wincmd p<CR> dans ~/.vimrcwincmd p sert à ne pas garder le curseur dans NERDTree |
Afficher la liste des derniers fichiers ouverts |
:browse old
|
Afficher le fichier courant dans l'explorateur de fichiers |
:NERDTreeFind Je me suis fait un raccourci \f avec map <Leader>n :NERDTreeFind<CR> dans ~/.vimrc
|
Éditer un fichier sur un serveur distant |
Avec Netrw, l'explorateur de fichiers par défaut ::e scp://le-serveur/le/fichier/quelque/part Marche aussi en ligne de commande vi scp://le-serveur/le/fichier/quelque/part (il faut penser à taper scp:// et non ssh:// !) |
Passer d'une fenêtre à l'autre (buffer, Tagbar, explorateur, etc) | Ctrl w flèche |
Revenir à la fenêtre précédente | Ctrl w p |
Fermer une fenêtre de Vim |
Ctrl w qou plus simplement:q Pour fermer une fenêtre de type preview ou brouillon, pas besoin que le curseur soit dans la fenêtre, Ctrl w z fonctionne de partout |
Fermer tout sauf la fenêtre courante | :only ou Ctrl w o |
Déplacer la fenêtre courante dans un nouvel onglet | Ctrl w T |
Maximiser la fenêtre |
Ctrl w _ pour une fenêtre horizontale Ctrl w | pour une fenêtre verticle ou sinon en activant la souris : :set mouse=a puis déplacer la ligne de séparation
|
Donner une hauteur de 10 lignes à une fenêtre |
:10wincmd_
|
Scinder une fenêtre |
:split ou Ctrl w sou verticalement :vsplit ou:vs ouCtrl w v
|
Passer d'une séparation verticale à horizontale |
Ctrl w H envoie la fenêtre tout à gauche Ctrl w L envoie la fenêtre tout à droite (comme les touches de déplacement h et l en mode normal mais avec Maj en plus) |
Passer d'une séparation horizontale à verticale |
Ctrl w J envoie la fenêtre tout en bas Ctrl w K envoie la fenêtre tout en haut (comme les touches de déplacement j et k en mode normal mais avec Maj en plus) |
Faire tourner une fenêtre |
Ctrl w r vers la droite ou vers le bas Ctrl w R vers la gauche ou vers le haut (quand elle arrive au bout, elle "boucle" pour revenir à l'autre bout) |
Intervertir deux fenêtres |
Ctrl w x Pour tous ces mouvements de fenêtres, cf :help window-moving
|
Ouvrir un fichier en scindant la fenêtre |
:new foo/bar.php
ou verticalement
:vnew
|
Ouvir un ficher dans un nouveau buffer |
:e fichier
|
Ouvrir plusieurs buffers |
:e *.php
|
Passer à l'onglet = au buffer suivant / précédent |
:bn :bp (pour changer de buffer sans avoir à sauver les modifs en cours :set hidden )
|
Lister les buffers |
:ls ou :buffers ou avec le plugin ctrlp.vim : Ctrl p Ctrl ↑ jusqu'à afficher l'onglet des buffers ou avec le plugin fzf.vim : :Buffers Pour afficher les buffers en permanence, on peut utiliser un plugin tel que vim-airline |
Aller à un buffer par son nom |
:b nom
ou par son numéro n
:bn
|
Aller au dernier buffer visité | :b# ou Ctrl ^ |
Fermer un buffer |
:bd Pour fermer les buffers 3 à 5 : :3,5bd Pour fermer les buffers 2, 4, et 7 : :bd 2 4 7
|
Ouvrir un fichier dont le chemin est sous le curseur |
gf dans la fenêtre courante
Ou avec le plugin ctrlp.vim : Ctrl p Ctrl \ f |
Ouvrir un fichier dont le chemin et le numéro de ligne sont sous le curseur du style /foo/bar:123 |
gF dans la fenêtre courante ou Ctrl w F en scindant la fenêtre ou Ctrl w gF dans un onglet |
Sauver la session en cours (fichiers ouverts) |
:mksession ma_session.vim Récupérer la session : vim -S ma_session.vim ou dans Vim :source ma_session.vim Ne fonctionne bien qu'avec les buffers, pas avec NERDTree ou Tagbar donc il faut faire :tabdo NERDTreeClose avant :mksession
|
Rendre une fenêtre / un buffer "readonly" (en lecture seule) |
:set nomodifiable Plus rapide avec :set nomo Tab autant de fois que nécessaire |
Naviguer dans la liste "quickfix" des résultats de vimgrep | :cn en avant, :cp en arrière |
Chercher avec vimgrep en ignorant la casse | :vimgrep /\cTruc/ ** (c minuscule) |
Au contraire, tenir compte de la casse | :vimgrep /\CTruc/ ** (c majuscule) |
Modifier une commande dans l'historique |
q:
ou dans la ligne de commande
Ctrl fmodifier puis Entrée pour exécuter ou :q
|
Démarrer Vim avec les réglages par défaut, sans plugins (pratique pour éditer des fichiers énormes) |
vim -u NONE fichier
|
Ou juste sans plugins (pratique pour éditer des fichiers énormes) |
vim --noplugin fichier
|
Ou juste sans les analyseurs de code (pratique pour lire des fichiers énormes en gardant un certain confort) |
vim -c ':ALEToggle' woocommerce-stubs.php parce que même si ALE est asynchrone, ça charge le CPU pour rien |
* Note sur la commande y (yank) : En réalité, yank ne signifie par "copier" mais "arracher". Pour une raison historique que j'ignore, le créateur de Vi a choisi le mot yank au lieu de copy et donc la commande y au lieu de c. On peut toutefois se raccrocher à l'idée que c'est le y de copy. Un détail qui ajoute de la confusion, c'est que Emacs et Bash utilisent le mot yank pour coller et non pour copier 🙂