Les différents mode en Vim:
Visual mode
Visual line mode : SHIFT + V
Command mode
Pour entrer en command mode, il faut taper les deux points « : »
Replace mode
Pour remplacer plusieurs occurrences d’un mot sous le curseur (opération assez courante) voici les combinaisons de touche, supposons que vous vouliez remplacer toto par tata :
# mettre le mot sur toto
# appuyer sur * pour aller à la prochaine occurence
# faire ciw (change inner word) puis entrez tata puis ESC
# puis autant de fois que nécessaire : appuyer sur n pour aller à la prochaine occurrence puis . (recommencer la dernière action)
Remplacer un seul caractère (sous le curseur)
Appuyer sur ‘r’ et taper la nouvelle lettre
Passer en Replace mode
SHIFT + r , permet de taper en mode remplacement, les caractère tapés remplacent les précédents caractères.
Visual Char mode : pour y entrer appuyer sur v
, ça permet de sélectionner du texte
Obtenir de l’aide sur une commande
:help <command>
Edit mode
Comment faire une commande en navigation mode puis revenir de suite en edit mode
#il faut faire CTRL + o en edit mode pour temporairement être en normal mode, pratique pour aller en fin de ligne et continuer à éditer par exemple, <CTRL>+o rentre en normal mode pour une commande.
<CTRL>+o
#copier un mot sous le curseur, le curseur est au début du mot
yw
#copier un mot même si le curseur n'est pas au début du mot
yaw
#pour les nom de variable préfixée par un $ (ex: $this), yaw ne suffira pas dans ce cas utiliser le big word W (SHIFT + w)
yaW
#répéter un caractère 'J' 10 fois
<ESC>10iJ<ESC><ESC>
Changer la casse
Changer en minuscule ou en majuscule
~ : Changes the case of current character
guu : Change current line from upper to lower.
gUU : Change current LINE from lower to upper.
guw : Change to end of current WORD from upper to lower.<<utile
guaw : Change all of current WORD to lower. <<utile
gUw : Change to end of current WORD from lower to upper.<<utile
gUaw : Change all of current WORD to upper. <<utile
g~~ : Invert case to entire line
g~w : Invert case to current WORD
guG : Change to lowercase until the end of document.
Insert mode
Pour annuler une action, revenir sur normal mode en appuyant sur ESC
ou CTRL+C
, appuyer sur u
en
Insérer un caractère plusieurs fois
<ESC> //nnormal mode
10 // nombre de fois
i // insert mode
a // le caractère
<ESC> // quitter Insert mode
Bouger une ligne vers le haut ou vers le bas
Il faut utiliser la commande move
.
:m 12 //bouge le ligne courante vers la ligne 12
:m 0 //bouge vers le début du fichier
:m $ // bouge après la dernière ligne du fichier
:5,7m 21 //bouge les ligne 5 à 7 à la ligne 21
Recherche
Rechercher une chaîne de caractères
Pour chercher un mot le plus simple est de rentrer le slash et de tapez la chaine à chercher
/motachercher
#s'il y a plusieurs occurences, appuyer sur n pour passer au suivant et SHIFT + n pour le précédent
Pour naviguer dans les occurrences trouvées utiliser les touches #
(chercher en arrière)et *
chercher en avant.
Rechercher le mot sous le curseur
#placer le curseur sur le mot et *
Rechercher la définition d’ue fonction
#placer le curseur sur le no de la fonction et
gd
Navigation mode
Naviguer dans Vim
CTRL + y : défile d'une ligne vers le haut
CTRL + e : défile d'une ligne vers le bas
CTRL + f : défile d'une page vers le bas
CTRL + b : défile d'une page vers le haut
CTRL + d : défile d'une 1/2 page vers le bas
CTRL + u : défile d'une 1/2 page vers le haut
Placement du curseur sur l’écran
# position du curseur haut,milieu et bas (bouge le curseur)
H, M , L
#centrage du curseur dans la vue (ne bouge pas le curseur)
zt, zb ou zz
Placement du curseur au sein d’une ligne
#aller au dernier caractère et être en mode édition
SHIFT + A
#aller au dernier caraxtère
$
#aller au premier caractère et être en mode édition
SHIFT + I
# aller au premier caractère et curseur sur le 1er caractère
^^
#aller au premier caractère et curseur avant le 1er caractère
SHIFT + 0
Navigation par mot
#déplacer de mot en mot
w
#déplacer de mot en mot reverse
b
#déplacer de mot en mot en plus rapide (d'espace en espace en fait)
SHIFT + w
#reverse
SHIFT + b
#aller à la fin d'un mot
e
#aller début d'un mot
w
Navigation par bloc (paragraphe…)
#les paragraphes sont séparés par une ligne vide ou des accolades
{ ou }
# aller au matching brace, trouver le } correspondant le plus immédiat de {, marche pour ( et [
%
# vous pouvez en profiter pour sélectionner le texte entre la paire de {}
v%
#voir le } correspondant, pour cela activer une option
:set showmatch
#Comment aller au {{[ le plus proche lorsque vous n'êtes pas dessus
[{ ou [[ ou [(
#pour trouver celui qui est au dessus. Pour celui du dessous
]} ou ]] ou ])
Navigation par marks (signets)
Les signets (marks) permettent de mémoriser une ligne avec un raccourci (register), mais ne mémorise pas la colonne
#enregistrer un mark (les mark sont spécifiques à un fichier)
me // e devient le raccourcis vers le marks
#naviguer au mark
`m // backticks ou
'm // apostrophe (ideaVim ne connait pas backtick je crois)
#lister les marks
:marks
#revenir à la position précédente
``
#Les jumps
vous pouvez rejouer les positions du curseur avec CTRL + i et CTRL + o
#lister les positions passées du curseur
:jumps
# https://www.linux.com/news/vim-tips-moving-around-using-marks-and-jumps/
Copier Coller avec les registers
sous Vim
Alors que la plupart des programmes ne disposent que d’une copie dans le clipboard, Vim en possède une dizaine, on se demande pourquoi par défaut ce n’est pas proposé dans les autres IDE.
Le registre par défaut est ""
, le contenu y est présent lorsque vous faites un d,c,s,x,y
"
est utilisé pour accéder au register,
# utilisation basique copier coller, utilisez une lettre pour stocker le contenu copié
"ey // copier le contenu dans le register e y=yank
"ep // coller le contenu du register e
#voir les contenus des register
:reg
:reg e f h // que les registers cités
https://www.brianstorti.com/vim-registers/
Effacer avec VIM
Effacer et combinaison avec d’autre commandes
Effacer en avant ou en arrière
$ phrase exemple : "ceci est une phrase de pour illustrer le propos"
#curseur sur h de phrase
#effacer jusqu'à la lettre 'd'
dtd
#effacer en arrière jusqu'à 'u'
dTu
#effacer un mot sous le curseur, attention à la position du curseur, l'effacement se fait depuis le curseur jusqu'à la fin du mot
dw
#efface le mot entier quelque soit la position du curseur sur le mot
diw
#effacer le contenu à l'intérieur des parenthèses ou crochet ou accolade, remplacer <char> par (,{,[
di<char>
#effacer jusqu'à un caractère
dt<char>
Les sources:
https://opensource.com/article/19/2/getting-started-vim-visual-mode
Déplacer des lignes
Sans doute une de mes commandes préférée, vous pouvez bouger une ou des lignes, en absolue sans forcément depuis la position de votre curseur
#déplacer la ligne courante à la ligne 23
:m 23
:m 0
:m $
#déplacer un bloc
:m5,7m 21 // bouge block lignes 5à7 à la ligne 21
Déplacer des lignes en mode relatif
Lorsque vous avez activé le display des ligne en relatif, vous n’avez plus les numéros absolu cela peut être une gêne, mais il est possible de déplacer les lignes en relatif depuis la position de votre curseur.
#sélectionner votre ou vos lignes en mode visual block (SHIFT + V), taper :m, puis le nombre de ligne en relatif, donc pour déplacer en amont de une ligne
:'<,'>m-2 // oui -2 et pas -1
#remarquez la syntaxe assez compliquée avec les chevrons, ne vous en faites pas, ils se font automatiquement si vous vous placez en mode Visual Block
Visual block mode ou mode colonne
Le visual block mode est l’équivalent du mode colonne dans une EDI classique. Pour y basculer CTRL + v
. un fois ceci fait, il faut sélectionner les lignes avec j
. Exemple faire attention, l’exemple ci-dessous permet d’insérer sur toutes les lignes sélectionnées un même texte, mais c’est avec SHIFT + i
qu’on va insérer et pas seulement i
comme en mode normal.
#exemple de texte
Vim is a text editor
Vim is a text editor
Vim is a text editor
Vim is a text editor
#on veut ajouter great entre "a" et "text"
#curseur sur la première ligne et devant "text" puis CTRL + v
#j 4 fois, puis SHIFT + i, on insère "great", deux fois <ESC> pour sortir du visual block mode.
#pour effacer, sélectionner c'est intuitif.
Bonus : Utiliser vi sur la ligne de commande bash
Il est possible en faisant simplement une commande pour avoir la sensation d’être dans vi, le curseur ne change pas quelquesoit les modes.
set -o vi
Utiliser les macros en Vim
Les macros je n’ai pas besoin de vous expliquer, ce sont des suites d’actions que vous pouvez réappliquer
# démarrer l'enregistrement de la macro et lui assigner un raccourci lettre a
qa
....vous commandes
#arrêt de l'enregistrement de la macro vim
q
#exécuter votre macro
@a
#répéter l'exécution de votre macro
Pour faire de bonnes macros, il faut réfléchir un peu, si par exemple vous devez appliquer une action sur une liste (typique) commencer par placer votre curseur de façon tactique pour le début et la fin.
Normal mode
https://betterprogramming.pub/50-vim-mode-tips-for-ide-users-f7b525a794b3
Il y a de la redite mais, il y a des commandes additionnelles que je trouve intéressantes :
r en normal mode permet d'éditer le caractère sous le curseur tout en restant en normal mode, alors que s vous met en insert mode.
cw en normal mode permet de changer un mot (bascule en insert mode), alors que dw efface le mot (vous restez en normal mode)
% permet de trouver le (,{,[ matchant celui sous le curseur. % n'importe où va jusqu'au prochain ),],}.
H,M,L permet de déplacer le viewport, le curseur reste immobile
zz,zt,zb bouge le curseur dans le viewport
Text Object : permet d'agir sur le mot où qu'on soit dans le mot (évite d'aller au début du mot poru effacer le mot par exemple)
daw : supprime le mot où que soit le curseur dans le mot
ciw : efface le mot et passe en insert mode
Insérer un newline sous le cursor en normal mode : il faut faire un remap qui correspond à i<Entrée>
nnoremap <Enter> i<Enter><Esc>k$
Changer les caractères entourant un mot (" ou ') (suround)
"Hello" => 'Hello' : cs"'
Replace mode : R, remplace les caractère en normal mode.<Es> pour en sortir.
u et CTRL + R : undo et redo
Voir aussi la section sur Splitting Windows
Navigation occasionnel en insert mode:
CTRL + o puis f g (recherche de la lettre 'g') vous restez en insert mode, on n'y gagne rien.
Efface ligne et reste en insert mode : c$ (en fait depuis n'importe quelle position dans la ligne.
Efface depuis le curseur vers la fin du mot et reste en insert mode : cw
#effacer en arrière
d<flècheGauche> efface le caractère à gauche
d$ efface depuis le curseur jusqu'à la fin de la ligne
d^ efface en arrière depuis le curseur jusqu'au caractère non espace
d0 efface depuis le curseur en arrière jusqu'au début de la ligne
dw efface depuis le curseur jusqu'à la fin du mot
db efface en arrière depuis le curseur jusqu'au début du mot
#effacer en arrière et basculer en edit mode, remplace d par c
c<flècheGauche> efface le caractère à gauche
c$ efface depuis le curseur jusqu'à la fin de la ligne
c^ efface en arrière depuis le curseur jusqu'au caractère non espace
c0 efface depuis le curseur en arrière jusqu'au début de la ligne
cw efface depuis le curseur jusqu'à la fin du mot
cb efface en arrière depuis le curseur jusqu'au début du mot
VIM pour le HTML
Travailler en HTML supppose certaines actions que l’on rencontre peux en mode texte normal, par exemple aller à l’intérieur de tag HTML, effacer l’intérieur de tag HTML
effacer le texte entre les tags HTML ex:
<h1>Le sous titre</h1>
se placer entre les tags et faire : dit
cit pour passer en mode insertion après
effacer entre les parenthèses: di( ou ci(
effacer entre les guillemet : di" ou encore mieux ci"
idem avec [,{,',<...
Les différents modes de VIM
- normal mode
- Insert mode
- command mode
- visual mode
- select mode
Diverses commandes
SHIFT + j : supprime les retours chariot,
Mode colonne, CTRL + V, puis j ou k, passer en INSERT MODE