HervéRenault.fr

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)
  • La dernière modif : u
  • Toutes les modifs de la ligne : U
  • Sans sortir du mode insertion : Ctrl o u cf :help i_Ctrl-O
  • Tout ce qu'on a ajouté à la ligne, à gauche du curseur (c'est précis !) Ctrl u
    Par exemple on entre en mode insertion pour compléter une ligne, on tape 3 ou 4 mots mais on change d'avis et on veut recommencer ⇒ on fait Ctrl u sans sortir du mode insertion. Et si on fait Ctrl u une deuxième fois, on efface toute la ligne à gauche du curseur. Ne pas confondre avec le Ctrl u en mode normal qui fait défiler l'écran vers le haut (upwards), cf :help i_ctrl-u
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 :123Entré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 puis
activer 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 pfoo
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 :fzTabulation
Et 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\C

Tout 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 :setc...
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

  1. Supprimer le mot 1 par diw par exemple
  2. Marquer l'emplacement par ma par exemple
  3. Aller au mot 2
  4. Sélectionner le mot 2 par viw par exemple
  5. Coller le mot 1 par p
  6. Retourner à l'ancien emplacement du mot 1 par `a
  7. Coller le mot 2 par P (majuscule)

Méthode 2

  1. Anticiper… en mettant le mot 1 dans le registre a par exemple "adiw
  2. Marquer l'emplacement par ma par exemple
  3. Aller au mot 2
  4. Supprimer le mot 2 par diw par exemple
  5. Coller le mot 1 par "aP
  6. Retourner à l'ancien emplacement du mot 1 par `a
  7. Coller le mot 2 par P
Notes :
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 echo $matches[3]."/".$Ctrl p[1]."/".$Ctrl p[2]; c'est plus rapide que de re-saisir matches deux fois.

Pour tous les types de complétion, voir :help ins-completion

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 . i
cf. :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
call matchadd('RedundantSpaces', '\(\s\+$\| \+\ze\t\|\t\zs \+\)\(\%#\)\@!')
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 .vimrc
nmap =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
  • :Breakpoint ou F10 à la ligne souhaitée pour un point d'arrêt simple.
    Pour mémoriser un point d'arrêt sur plusieurs sessions de Vim pendant un développement long, il est toujours possible de mettre xdebug_break(); dans le code source directement.
  • Pour un point d'arrêt conditionnel :Breakpoint conditional $foo == 'bar'
    puis :BreakpointWindow pour voir le point d'arrêt parce que la ligne n'est pas surlignée en vert comme avec F10
    Lire :help VdebugBreakpoints pour les autres types de point d'arrêt
  • F5 pour lancer le débogueur
  • F5 pour aller au premier breakpoint ou au suivant
  • F9 pour aller jusqu'au curseur (plus simple qu'un breakpoint)
  • F2, F3, F4 pour avancer (step over, in, out)
  • F12 pour évaluer la variable sous le curseur, par exemple $foo->bar
  • \e pour évaluer l'expression sélectionnée par v
  • :VdebugChangeStack pour revenir au contexte
    (F11 est prise par la fonction plein écran du terminal, que je ne veux pas changer)
  • :VdebugTrace $foo['bar'] suivre l'évolution d'une variable
  • F7 pour continuer l'exécution sans passer par les breakpoints
  • F6 pour tout arrêter

On peut soit ajouter XDEBUG_SESSION_START=1 à l'URL, soit ajouter xdebug.remote_autostart = 1 dans le xdebug.ini, soit plus simplement installer dans Firefox l'extension Xdebug-ext (pour l'activer sur l'onglet choisi, il faut cliquer sur le bouton des extensions et cliquer pour que la coccinelle soit rouge)

En ligne de commande, exporter la variable XDEBUG_SESSION avec la valeur de xdebug.trigger_value indiquée dans le xdebug.ini
Par exemple, j'ai mis xdebug.trigger_value=Vim dans mon xdebug.ini donc je lance le script à débuguer par XDEBUG_SESSION=Vim php mon_script.php
(si on ne définit pas de valeur pour trigger_value, il suffit de faire XDEBUG_SESSION=1)

Voir les lignes modifiées par rapport à git

Avec le plugin vim-gitgutter
Pour aller à la prochaine ligne modifiée : ]c

Pour intégrer encore mieux git dans Vim, installer le plugin vim-fugitive et pour bien gérer les noms de fichiers avec des accents, mettre dans ~/.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 ~/.vimrc
wincmd 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 s
ou verticalement:vsplitou:vsouCtrl 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 Ctrl w f en scindant la fenêtre
ou Ctrl w gf dans un onglet

Ou avec le plugin ctrlp.vim : Ctrl p Ctrl \ f
Utile si le chemin du fichier sous le curseur n'est pas complet

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 f
modifier 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 🙂