Next revision | Previous revision |
informatique:logiciels:vim [2008/11/15 21:23] – créée pteu | informatique:logiciels:vim [2025/01/02 15:48] (current) – [Divers] Thèmes pteu |
---|
* ''i'' (**i**nsert) insérer du texte avant le curseur ; ''I'' insérer en début de ligne | * ''i'' (**i**nsert) insérer du texte avant le curseur ; ''I'' insérer en début de ligne |
* ''a'' (**a**ppend) insérer du texte après le curseur ; ''A'' insérer en fin de ligne | * ''a'' (**a**ppend) insérer du texte après le curseur ; ''A'' insérer en fin de ligne |
* ''o'' insérer du texte après la ligne courante ; ''O'' insère du texte avant le ligne courante | * ''o'' insérer du texte après la ligne courante ; ''O'' insère du texte avant la ligne courante |
* ''I'' et ''A'' pour ajouter en début et fin de phrase | |
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. | 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. |
| |
| |
| =====Les options===== |
| |
| * ''-R'' **r**eadonly : pour ouvrir un fichier en lecture seule |
| |
| |
* ''0'' et ''$'' permettent de placer le curseur en début et en fin de ligne | * ''0'' et ''$'' permettent de placer le curseur en début et en fin de ligne |
* ''gg'' et ''G'' permet d'aller au début / à la fin du fichier | * ''gg'' et ''G'' permet d'aller au début / à la fin du fichier |
* ''<nb>G<'' aller à la ligne //<nb>// (équivalent à '':<nb>'') | * ''<nb>G'' aller à la ligne //<nb>// (équivalent à '':<nb>'') |
* ''w'' avance le curseur d'un mot ; ''W'' avance le curseur après le prochain espace | * ''w'' avance le curseur d'un mot ; ''W'' avance le curseur après le prochain espace |
* ''b'' recule le curseur d'un mot ; ''B'' recule le curseur après le dernier espace | * ''b'' recule le curseur d'un mot ; ''B'' recule le curseur après le dernier espace |
* ''('' et '')'' permettent de changer de phrase | * ''('' et '')'' permettent de changer de phrase |
* ''F'' et ''n'' suivi d'une lettre pour se rendre à la prochaine occurrence de cette lettre | * ''F'' et ''n'' suivi d'une lettre pour se rendre à la prochaine occurrence de cette lettre |
| * normalement //de nos jours// on peut bouger le curseur avec les flèches directionnelles ; à l'origine c'était les touches ''h'', ''j'' ,''k'', ''l'' (resp. gauche, bas, haut, droite). |
| |
=====Manipulation de chaines===== | =====Manipulation de chaines===== |
* ''d'' pour couper | * ''d'' pour couper |
* ''y'' pour copier | * ''y'' pour copier |
| * ''c'' pour le **c**hanger |
On peut le //coller// par la suite avec ''p''. | On peut le //coller// par la suite avec ''p''. |
Pour supprimer le texte, on le coupe sans le coller derrière. | Pour supprimer un texte, on le coupe sans le coller derrière. |
| |
| |
====Recherche de chaine==== | ====Recherche de chaine==== |
''/<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>''. | ''/<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. |
| |
====Remplacement de chaine==== | ====Remplacement de chaine==== |
* ''g'' indique que l'on veut remplacer toutes les occurences du //<motif recherché>// (par défaut on ne modifie que la première). | * ''g'' indique que l'on veut remplacer toutes les occurences du //<motif recherché>// (par défaut on ne modifie que la première). |
| |
| ====Supprimer les lignes contenant un motif==== |
| Pour supprimer toutes les lignes contenant le motif *toto*, en mode commande : '':g/toto/d'' |
| ====Commande sur tous les buffers==== |
| |
| 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 : |
| <code bash> |
| :bufdo! %s/init/final/g |
| </code> |
| |
=====Divers===== | =====Divers===== |
* ''u'' **u**ndo, annuler la dernière opération ou ''<nb>u'' pour annuler les <nb> dernières opérations | * ''u'' **u**ndo, annuler la dernière opération ou ''<nb>u'' pour annuler les <nb> dernières opérations |
* '':U'' **U**ndo, annuler toutes les opérations faites sur le ligne courante | * '':U'' **U**ndo, annuler toutes les opérations faites sur le ligne courante |
* ''[<nb>] ctrl+r'' **r**edo [les <nb> dernières opérations] | * ''ctrl+r'' **r**edo restaure la dernière modification annulée |
| * ''[<nb>] ctrl+r'' **r**edo restaure les <nb> dernières opérations |
* '':!<cmd>'' exécute la commande //<cmd>// | * '':!<cmd>'' exécute la commande //<cmd>// |
* ''ctrl+g'' affiche des information sur le fichier dans la barre d'état | * ''ctrl+g'' affiche des information sur le fichier dans la barre d'état |
Notez que le ^M s'écrit ''ctrl+v, ctrl+m''. | Notez que le ^M s'écrit ''ctrl+v, ctrl+m''. |
| |
| * comparer 2 fichiers avec **vimdiff** : très pratique car beaucoup plus visuel que le traditionnel diff |
| <code> |
| vimdiff toto.sh toto2.sh |
| </code> |
| |
| * pour lancer vim en mode insertion : ''vim +startinsert'' ou ''vim +start'' en plus court |
| |
| =====Thèmes===== |
| |
| * afficher les thèmes installés: '':colorscheme ?'' ou '':colorscheme ^D'' |
| * changer le thème: '':colorscheme <theme>'' |
=====Commandes avancées===== | =====Commandes avancées===== |
| |
| |
| |
====Diviser la fenêtre==== | ====Diviser la fenêtre (split)==== |
VIM permet de diviser la fenêtre de façon à travailler simultanément sur 2 fichiers (ou plus..). | |
| |
En mode commande, taper '':split'' permet de 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être commencent par ''ctrl+w''. | VIM permet de diviser (splitter) la fenêtre de façon à travailler simultanément sur 2 fichiers (ou plus..). Pour lancer vim directement splitté : |
| <code bash> |
| # Ouvrir fic1 et fic2 en partage horizontal (split) |
| vim -o fic1 fic2 |
| |
On passe d'un cadre à l'autre avec ''<ctrl+w> w'' (les touches control et w simultanément, puis w). On peut redimentionner le cadre courant avec ''ctrl+w +'' et ''ctrl+w -'' pour respectivement agrandir ou rétrécir le cadre d'une ligne. On peut ajouter un facteur devant le **+** et le **-** : ''ctrl+w 5+'' augmentera la taille du cadre courant de 5 lignes. On annule le dernier redimentionnement avec un ''ctrl+w x''. | # Ouvrir fic1 et fic2 en partage vertical (vsplit) |
| vim -O fic1 fic2 |
| </code> |
| |
| 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, ou |
| * ''Ctrl+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''. |
| |
| |
* '':set paste'' désactive l'indentation automatique ('':set nopaste'' pour la réactiver) | * '':set paste'' désactive l'indentation automatique ('':set nopaste'' pour la réactiver) |
| |
| ====.vimrc==== |
| |
| 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 : |
| <code vim> |
| " 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 |
| </code> |
| |
| |
| =====Problèmes===== |
| |
| ====Pavé numérique inutilisable==== |
| |
| 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". |
| |
| ====Désactiver l'indentation pour coller du texte==== |
| |
| 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. |
| <code bash> |
| ligne 1 |
| ligne 2 |
| ligne 3 |
| </code> |
| 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'' : |
| <code bash> |
| set pastetoggle=<F3> |
| </code> |
| |
| Un second niveau d'érudition est d'activer ce switch automatiquement lors du copier/coller (lignes à ajouter dans le vimrc) : |
| <code bash> |
| 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 |
| </code> |
| |
| source: [[https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode|Automatically set paste mode in Vim when pasting in insert mode]] |
| |
| ====Ne pas copier les numéros de ligne==== |
| |
| 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 :/ : |
| <code bash> |
| :set nonu |
| </code> |
=====Liens===== | =====Liens===== |
| |
* [[http://www.linux-france.org/article/appli/vi/faq/index.html|FAQ VIM]] | * [[http://www.linux-france.org/article/appli/vi/faq/index.html|FAQ VIM]] |
| * [[https://vimawesome.com|Awesome Vim plugins (from across the Universe)]] |