utilitaire éditeur
Directement inspiré de Vi, Vim (Vi IMproved) est un des plus connus éditeurs de texte du monde libre.
Il est composé de 2 modes : le mode insertion et le mode commande. On passe en mode commande en pressant esc
(échappement) et en mode insertion de diverses manières :
i
(insert) insérer du texte avant le curseur ; I
insérer en début de lignea
(append) insérer du texte après le curseur ; A
insérer en fin de ligneo
insérer du texte après la ligne courante ; O
insère du texte avant la ligne courante
Le mode insertion permet de taper du texte, le mode commande permet de faire tout le reste (tout ce qui suit). Il faut noter que en mode commande, la touche <tab>
permet l'auto-complétion comme en console.
-R
readonly : pour ouvrir un fichier en lecture seulectrl+p
complétion automatique du mot courant sur la base des buffers ouverts et du/des fichiers .ctags
:
permet de lancer une commande et place le curseur en bas de la fenêtre. :q
(quit) permet de quitter un fichier. Si le fichier à été modifié il faut utiliser :q!
:w
(write) permet de sauvegarder le fichier ; :wq
permet de sauvegarder et quitter ; :w <fic>
permet de sauvegarder sous un nouveau fichier nommé <fic>:e <fic>
(edit) sauvegarde le fichier courant et ouvre <fic> ; :e! <fic>
ouvre <fic> fichier sans sauvegarder l'ancien fichier.0
et $
permettent de placer le curseur en début et en fin de lignegg
et G
permet d'aller au début / à la fin du fichier<nb>G
aller à la ligne <nb> (équivalent à :<nb>
)w
avance le curseur d'un mot ; W
avance le curseur après le prochain espaceb
recule le curseur d'un mot ; B
recule le curseur après le dernier espace{
et }
permettent de changer de paragraphe(
et )
permettent de changer de phraseF
et n
suivi d'une lettre pour se rendre à la prochaine occurrence de cette lettreh
, j
,k
, l
(resp. gauche, bas, haut, droite).x
suppression de caractère (équivalent à <suppr> en mode insertion)D
suppression de fin ligne courante (située à droite du curseur)dd
ou D
couper la ligne (ou la supprimer si on ne la recolle pas..)yy
ou Y
copier la ligne
Les 2 commandes ci-dessus peuvent être précédées d'une nombre permettant d'affecter l'action à <nb> lignes à la fois. Par exemple 3dd
(ou 3D
permet de couper les 3 lignes suivant le curseur. Cette factorisation fonctionne avec certaines autres commandes (l'expérience vous dira lesquelles :))
p
(paste ?) coller après la ligne couranteP
coller avant la ligne courante:r <fic>
pour ajouter le contenu du fichier <fic> après la ligne couranteIl existe un mode visuel permettant de sélectionner du texte visuellement pour faire une action dessus.
v
permet de sélectionner caractère par caractèreV
permet de sélectionner ligne par lignectrl+v
permet de sélectionner par bloc (tableau)Une fois le bon texte surligné, on choisi une action à appliquer :
d
pour coupery
pour copierc
pour le changer
On peut le coller par la suite avec p
.
Pour supprimer un texte, on le coupe sans le coller derrière.
/<motif>
permet de rechercher et mettre en surbrillance un <motif> dans tout le fichier ouvert. la touche n
permet de passer au motif suivant, N
au précédent. On peut rechercher à l'envers (de bas en haut) de la même façon avec ?<motif>
.
Si on presse la touche *
, on fait une recherche sur le mot sur lequel est positionné le curseur.
On peut remplacer du texte avec une syntaxe plus ou moins similaire à sed.
Par exemple je veux remplacer tous les “e” par des “E” sur les lignes 10 à 20 : :10,20s/e/E/g
.
C'est barbare mais logique : en mode commande on tape :
10,20
pour déterminer la portion de texte visée (de la ligne 10 à la ligne 20). Le caractère 0 indique le début du fichier et $ la fin. On peut contracter 0,$
par % qui a une fonction indentique.s
pour la substitution de chaine/e/E/
répond à la syntaxe /<motif recherché>/<motif de remplacement>/
g
indique que l'on veut remplacer toutes les occurences du <motif recherché> (par défaut on ne modifie que la première).
Pour supprimer toutes les lignes contenant le motif *toto*, en mode commande : :g/toto/d
Pour appliquer une commande non pas sur le fichier courant mais sur tous les buffers, il faut utiliser le préfixe :bufdo!
. Pour faire un remplacement de chaine par exemple :
:bufdo! %s/init/final/g
u
undo, annuler la dernière opération ou <nb>u
pour annuler les <nb> dernières opérations:U
Undo, annuler toutes les opérations faites sur le ligne courantectrl+r
redo restaure la dernière modification annulée[<nb>] ctrl+r
redo restaure les <nb> dernières opérations:!<cmd>
exécute la commande <cmd>ctrl+g
affiche des information sur le fichier dans la barre d'état^M
) : on utilise la syntaxe de sed, en mode commande :<echap> :%s/^M//g
Notez que le ^M s'écrit ctrl+v, ctrl+m
.
vimdiff toto.sh toto2.sh
vim +startinsert
ou vim +start
en plus courtet pas forcément très utiles..
h j k l
: normalement les flèches directionnelles fonctionnent, mais comme sous vi, on peut se déplacer dans le fichier, respectivement gauche, bas, haut, droite. J'avoue que ce n'est pas très avancé mais ça évite d'encombrer les commandes princpales..
répéter l'actionr
replace, remplacer le caractère~
change la casse du caractère courant=
indente la ligne suivant le curseur:wJ
concatène la ligne courante avec la ligne suivanteVIM permet de diviser (splitter) la fenêtre de façon à travailler simultanément sur 2 fichiers (ou plus..). Pour lancer vim directement splitté :
# Ouvrir fic1 et fic2 en partage horizontal (split) vim -o fic1 fic2 # Ouvrir fic1 et fic2 en partage vertical (vsplit) vim -O fic1 fic2
Dans une fenêtre vim, en mode commande taper :split
pour diviser l'écran horizontalement, et :vsplit
verticalement. Si on spécifie en paramètre un nom de fichier (:split <fic>
, en sachant que vous pouvez utiliser l'auto-complétion avec <tab> comme en console), ce dernier sera ouvert dans le nouveau cadre ; sinon le cadre sera rempli par le même fichier que l'original. Les opérations sur les fenêtres commencent par Controle + w : Ctrl+w s
pour splitter (horizontalement) et Ctrl+w v
pour “vsplitter” (verticalement).
On sélectionne un cadre avec:
Ctrl+w
w
pour sélectionner le suivant ;Ctrl+w
+ j
, k
, h
ou l
pour sélectionner celui respectivement celui du bas, du haut, de gauche ou de droite.On peut redimensionner le cadre courant avec :
Ctrl+w +
et Ctrl+w -
pour agrandir ou rétrécir le split d'une ligne, ouCtrl+w >
et Ctrl+w <
pour agrandir ou rétrécir le vsplit d'une colonne
On peut ajouter un facteur devant le +/-/>/<
pour augmenter la taille de X lignes/colonnes, par ex: Ctrl+w 5+
pour agrandir de 5 lignes. On annule le dernier redimensionnement avec un Ctrl+w x
.
Pour fermer le split courant : Ctrl+w q
; pour fermer tous les splits sauf le courant : Ctrl+w o
.
Quand on veut modifier une option, soit on édite le ~/.vimrc
pour une modification permanante, soit on lance la commande set
suivi de la modification, qui ne prend effet que pour la session courante de vim.
:set ts=4
les tabulations représentent 4 espaces:set mouse=a
active la souris (je ne conseille pas d'activer cette option car elle désactive les copier/coller avec le bouton du milieu):set paste
désactive l'indentation automatique (:set nopaste
pour la réactiver)
C'est le fichier de préférence lu au démarrage de vim. Il recherche par défaut dans la home de l'utilisateur courant (~/.vimrc
) puis dans /etc/vimrc
.
Exemple de fichier .vimrc :
" pt3u's .vimrc " " sources d'inspiration : " http://people.via.ecp.fr/~alexis/formation-linux/config/vimrc " http://linux-attitude.fr/post/Vimrc-collaboratif " raccourcis pour les tabulations " src: " http://forum.hardware.fr/hfr/Programmation/PHP/editeur-linux-ssh-sujet_103584_1.htm#t1545786 map <C-Right> :tabn<CR> imap <C-Right> <C-O>:tabn<CR> map <C-Left> :tabp<CR> imap <C-Left> <C-O>:tabp<CR> map <C-Up> :tabnew<CR> imap <C-Up> <C-O>:tabnew<CR> map <C-Down> :tabc<CR> imap <C-Down> <C-O>:tabc<CR> " Ne pas assurer la compatibilité avec l'ancien Vi = utiliser les vraies touches set nocompatible " Nombre de commandes dans l'historique set history=50 "coloration syntaxique syntax on " config des couleurs " precise la couleur de la fonte/bg des commentaires "" choix : term=none|blod "" cterm{fg|bg}=couleur highlight Comment ctermfg=6 " choix d'un theme " colorscheme delek "surligner les recherches set hlsearch "turn off match highlighting map <F10> :noh<CR> "afficher la position du curseur en bas set ruler " affiche la barre de status set laststatus=2 " contenu de la barre de status "set statusline=%<%f%h%m%r%=%l,%c\ %P set statusline= " buffer number set statusline+=%-3.3n\ " file name set statusline+=%f\ " flags set statusline+=%h%m%r%w " filetype set statusline+=\[%{strlen(&ft)?&ft:'none'}, " encoding set statusline+=%{&encoding}, " file format set statusline+=%{&fileformat}] set statusline+=%= " current char set statusline+=0x%-8B\ " offset set statusline+=%-14.(%l,%c%V%)\ %<%P "set nu " visual bell = avertissements visuels plutot que sonores set vb " remplace les tabs par x espaces set tabstop=4 "set softtabtop=4 " indentation automatique "set autoindent " espace indent auto set shiftwidth=4 " active la touche backspace "set backspace=2 " more powerful backspacing ? "set backspace=indent,eol,start " remplace les tab par des espaces "set expandtab "souligne la ligne active (src : Linux mag #110) set cursorline "highlight cursorline ctermfg=black ctermbg=gray " affiche x lignes en dessous du curseur set scrolloff=2 set smartindent set showmode " surligne les paires de paranthèses set showmatch " affiche les commandes dans la barre de status set showcmd " essaye de garder le curseur dans la même colonne quand on change de ligne set nostartofline " Option de la complétion automatique set wildmode=list:full "filetype indent on " ecriture du buffer automatique avant une action spéciale set autowrite set linebreak " rechch insensitives si en minuscules ; si contient une majuscule alors rechch sensitive set smartcase " affiche les numéros de ligne "set number " Utilise la souris pour les terminaux qui le peuvent (tous ?) " pratique si on est habitué à coller sous la souris et pas sous le curseur ; " attention fonctionnement inhabituel "set mouse=a " Envoyer le curseur sur la ligne suivante/précédente après usage des flèches droite/gauche en bout de ligne : set whichwrap=<,>,[,] " auto-backup files (*~) set backup "set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp set backupdir=~/.vim/backup " make backup before overwriting a file, to avoid lost of the file because of a write error " backup file is deleted unless \"set backup\" is on "set writebackup "set backupskip=/tmp/*,/private/tmp/* "swap files (*.swp) - default "set directory=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp " spécifier des retraits de ligne spécifiques pour certains fichiers "autocmd BufEnter *.py set tabstop=4 softtabstop=4 shiftwidth=4 "autocmd BufEnter *.json set tabstop=2 softtabstop=2 shiftwidth=2 "autocmd BufEnter *.yml set tabstop=2 softtabstop=2 shiftwidth=2
Malgré mon .vimrc aux petits oignons, j'ai un soucis pour saisir les chiffres du numpad (pavé numérique) qui affichent de mauvais caractères lorsque j'utilise Kitty/Putty sous Windows.
La solution est de se rendre dans les options de Kitty/Putty, dans : Terminal/Features et de cocher l'option “Disable application keypad mode”.
L'auto-indentation c'est pratique lorsqu'on écrit du code mais lorsqu'on copie/colle du texte ça devient infernal car chaque nouvelle ligne se décale un peu plus pour devenir une suite informe de bouts de mots.
ligne 1 ligne 2 ligne 3
Pour éviter cela il suffit d'activer l'option :set paste
, qui désactive toute initiative de vim d'auto-indenter quoi que ce soit. On copie/colle le contenu, puis on réactive : :set nopaste
.
Un premier niveau de sagesse consiste à mapper ce switch sur une touche, comme par exemple F3
:
set pastetoggle=<F3>
Un second niveau d'érudition est d'activer ce switch automatiquement lors du copier/coller (lignes à ajouter dans le vimrc) :
let &t_SI .= "\<Esc>[?2004h" let &t_EI .= "\<Esc>[?2004l" inoremap <special> <expr> <Esc>[200~ XTermPasteBegin() function! XTermPasteBegin() set pastetoggle=<Esc>[201~ set paste return "" endfunction
source: Automatically set paste mode in Vim when pasting in insert mode
Quand on copie du texte à la souris alors que les numéros de lignes sont affichés, on les copie (bêtement) avec le texte. On peut certes utiliser les raccourcis v
/V
, y
pour copier, et enfin p
pour coller mais cela ne fonctionne qu'en interne dans vi, pas si on veut coller le texte dans une autre appli.
Un contournement est de désactiver les numéros de ligne au moment de copier :/ :
:set nonu