Vim
Ouvrir un fichier
Via SSH
vim scp://remoteuser@server.tld//absolute/path/to/document
Préciser la ligne
vim file.txt +324
Raccourcis
=: réajuste l'indentationCtrl+A: incrémente le nombre sous le curseur,Ctrl+Xdécrémente
L: place le curseur en haut de l'écran,Hen bas etMau milieu
cf_: édite jusqu'à l'underscore inclusct_: édite jusqu'à l'underscore exclus3s: édite trois caractères (pareil quec3l)
- en mode insertion,
Ctrl+R %insère le nom du fichier courant (Source)
Ctrl+Lpermet de rafraîchir l'affichage, et donc la coloration syntaxique (utile s'il y avait avant une ligne qui la fait planter).
Maj+Rpasse en mode remplacement: équivalent du mode insertion, mais le curseur écrase ce qui est déjà présent.- Pour coller tout en remplaçant :
Maj+R C-r “(source)
- en mode insertion,
C-x C-gpermet de compléter les chemins/noms de fichiers.
Fichiers sous le curseur
gfouvre le fichier dans un nouveau buffer.Ctrl+Opermet de revenir au fichier précédemment ouvert.Ctrl+w f: ouvre le fichier dans une nouvelle fenêtreCtrl+w gf: ouvre le fichier dans un nouvel onglet
Rechercher / remplacer
Dans tout le document:
:%s/old/new/g
Ajouter c demande confirmation avant chaque remplacement.
\C juste avant old permet de rechercher en respectant la casse.
% signifie tout le document (en réalité un raccourci pour 1,$). Il est possible d'utiliser .,$ pour chercher uniquement entre le curseur et la fin du document (. indique la ligne courante du curseur). Il est également possible de sélectionner des lignes en mode Visuel et ensuite appuyer sur :. Source
\<mot\>: recherche exactement mot (sans caractères alphanumériques avant ou après).
Pour remplacer par un retour à la ligne, utiliser \r.
Désactiver le surlignage de la recherche
:noh
Rechercher dans plusieurs fichiers
:vimgrep /pattern/ file
Recherche récursive: utiliser ./**/*.c
Ensuite, pour afficher les résultats, utiliser :cw ou :copen.
Utiliser un ancien yank
Tous les yanks sont placés dans des registres.
Utiliser :reg pour les visualiser.
Pour coller un ancien yank, il faut insérer le contenu du registre: “2p pour coller le contenu du registre #2.
Utiliser le mot sous le curseur dans une commande
En saisissant une commande, utiliser le raccourci Ctrl+R, Ctrl+W.
Recharger un fichier
Recharger dans Vim un fichier ouvert, mais modifié par un autre programme:
:e # raccourci pour :edit
Déplacements
Aller à l'accolade/parenthèse/crochet correspondant: %.
Manipuler les onglets
Ouvrir plusieurs fichiers (source) :
vim -p file1 file2 ... # un fichier par onglet vim -o file1 file2 ... # un fichier split horizontal vim -O file1 file2 ... # un fichier split vertical
:tabnew [fichier]: ouvre un nouvel onglet:tabn: aller à l'onglet suivant:tabp: aller à l'onglet précédent:tabr: aller au premier onglet:tabl: aller au dernier onglet:tabs: affiche la liste des onglets ouverts:wa: sauvegarde tous les onglets:xa: sauvegarde tous les onglets et quitte:q: ferme un onglet
Multi-fenêtrage
:split filename: ouvrefilenameen scindant la fenêtre verticalementCtrl+w flèche: change la fenêtre sélectionnéeCtrl+w Ctrl+w: change la fenêtre sélectionnée en cyclant sur les fenêtresCtrl+w _: maximize la fenêtre maintenantCtrl+w =: rend chaque fenêtre de taille identiqueCtrl+w +/-: augmente/réduit la taille de la fenêtre de une ligne (préfixer du nombre de lignes souhaités)Ctrl+x >/<: augmente/réduit la taille de la fenêtre de une colonne (préfixer du nombre de colonnes souhaités):vsplit file: ouvrefilemais en scindant la fenêtre horizontalement:hide: ferme la fenêtre actuelle:only: garde uniquement la fenêtre actuelle ouverte:ls: liste les buffers:b 2: ouvre le deuxième buffer dans la fenêtre sélectionnéeCtrl+w Maj+H/J/K/L: déplace la fenêtre vers la direction de la lettre (Source). Utile pour passer d'un split horizontal vers vertical ou vice-versa.
Statistiques
Sélectionner la zone de texte dont on souhaite avoir les statistiques, g puis Ctrl+g.
Lier les curseurs de plusieurs splits
Avec deux splits déjà ouverts, on peut générer un diff de ces splits, ce qui liera les curseurs des deux splits. Il faut alors faire :diffthis dans chaque split. On annule avec :diffoff pour chaque split ou :diffoff! prendra effet sur tous les splits.
Si on ne veut pas de diff, il faut faire :set scrollbind dans chaque split. Ainsi les splits déroulent de façon synchronisée, mais pas la ligne indiquant l'emplacement du curseur. On annule avec :set noscrollbind.
Insérer sur plusieurs lignes
Ctrl+Vpermet de passer en mode Visual Block.DOWNpour sélectionner les lignes.Shift+ipour passer en mode Insertion sur la première ligne.- Faire la modification.
Echappour appliquer à toutes les lignes sélectionnées.
Utiliser le terminal depuis Vim
Accès au terminal avec :term ou :terminal.
Ctrl+w Maj+N: convertit la fenêtre en mode Normal, utile pour pouvoir copier du texte par exemple. Retour au mode Insertion aveci
Pour que le raccourci , t ouvre le terminal dans un split vertical, ajouter au fichier ~/.vimrc:
nnoremap <silent> ,t :vert term<CR>
Sessions
Sauvegarder sa session de travail: :mks (il est possible de donner un nom de fichier en paramètre dans lequel la session sera sauvegardée)
Restaurer sa session: vim -S ou vim -S [fichier de session] ou :source [fichier de session].
Limiter la largeur d'un texte
https://thoughtbot.com/blog/wrap-existing-text-at-80-characters-in-vim
:set textwidth=80
Sélectionner en mode Visuel le texte à reformater et reformater avec le raccourci gq.
Désactiver le retour à la ligne automatique
Listes Quickfix et Location
https://medium.com/@lakshmankumar12/quickfix-and-location-list-in-vim-ca0292ac894d
La liste Quickfix contient les erreurs rapportées par make et ce genre d'outils.
:copen:cnext:cprev:cclose
La liste Location contient une liste d'emplacements, que ce soient les résultats de :vimgrep ou Syntastic:
:lopen:lnext:lprev
Buffers
Sans utiliser le plugin BufExplorer:
:buffers,:ls,:files: liste les buffers ouverts:bprevious,:bp: bascule sur le buffer précédent:bnext,:bn: bascule sur le buffer suivant:bfirstet:blast
Formatages
Un fichier JSON (source) :
:%!python -m json.tool
Pour un fichier XML, sélectionner les lignes en mode visuel, puis (source) :
!xmllint --format -
Changer le format d'un fichier
Basculer entre les formats DOS/Unix.
Connaître le format actuel du fichier:
:set ff?
Changer le format:
:set ff=unix :set ff=dos
Changer l'encodage
Pour enregistrer un fichier en UTF-8 (source) :
:write ++enc=utf-8
Préciser la syntaxe d'un fichier pour la coloration syntaxique
Un fichier foo.c.bar ne sera pas colorié car il n'a pas la bonne extension finale. On peut alors exécuter (source):
:set syntax=c
On peut configurer la coloration syntaxique pour les fichiers avec une extension particulière:
autocmd BufNewFile,BufRead *.gnuplot set syntax=gnuplot
Voir les modifications qui vont être enregistrées
Faire un diff entre ce qu'il y a dans le buffer, et ce qui est sur le disque (source):
:w !diff % -
Sauvegarder en sudo
:w !sudo tee %
Lister les derniers fichiers édités avec Vim
:ol
Convertir les formats d'indentation
Convertir 4 espaces en tabulations (source) :
:set tabstop=4 " To match the sample file :set noexpandtab " Use tabs, not spaces :%retab! " Retabulate the whole file
Indiquer des options à Vim par fichier
Pour par exemple préciser le langage utilisé dans un fichier, ajouter un commentaire :
# vim: ft=ruby
ctags
Sous Debian, installer le paquet exuberant-ctags.
Ensuite, à la racine du projet, faire:
ctags -R .
Possibilité d'exclure des dossiers avec --exclude=folder (rajouter autant que besoin).
Placer le fichier dans un dossier particulier:
ctags --tag-relative=yes -R -f ./.git/ctags .
--tag-relative=yes permet d'utiliser des chemins relatifs par rapport à où est exécutée la commande. À utiliser si on indique à Vim que le fichier de tags est dans un sous-dossier d'un projet.
Ajouter dans la configuration de Vim
set tags=./tags,tags,.git/ctags; " cherche le fichier tags dans le dossier du fichier en cours d'édition, puis cherche tags dans tous les dossiers parents, finalement cherche .git/ctags dans tous les dossiers parents
vimdiff
Cf Lier les curseurs des splits
Raccourcis (source):
do: utiliser le diff de l'autre split (obtain)dp: utiliser ce diff dans l'autre split (push)- les raccourcis pour passer d'un changement Git à l'autre sont utilisables
Configuration
Copier vers le presse-papier du système
Vérifier avec vim –version que xterm_clipboard est activé (un + devant). Si ce n'est pas le cas, installer le paquet vim-gtk3.
Ensuite, il suffit d'utiliser les commandes classiques de Vim pour copier.
Créer des commandes
Ajouter dans le vimrc:
command DeleteFirst 1delete " la commande :DeleteFirst appellera :1delete, qui supprime la première ligne
Fichier de configuration
- /etc/vim/vimrc
let mapleader = "," let g:mapleader = "," let maplocalleader = "," " for vimtex (see http://learnvimscriptthehardway.stevelosh.com/chapters/06.html) set hidden set number set tabstop=4 set expandtab set shiftwidth=4 set smartindent set autoindent set backspace=indent,eol,start set shiftround set ignorecase set showmode set ruler set cursorline " souligne la ligne actuelle syntax on colorscheme desert "set colorcolumn=80 "display a vertical line set hlsearch "highlight search results set incsearch set showmatch "show matching parenthesis set mouse=a "support mouse set splitbelow " ouvre les splits horizontaux en bas de l'écran set splitright " ouvre les splits verticaux à droite de l'écran set wildmenu set wildmode=longest:full,full map <leader><Left> :tabp<cr> map <leader><Right> :tabn<cr> map <leader>h :tabp<cr> map <leader>l :tabn<cr> " Display hidden chars: set list set listchars=tab:>.,trail:.,extends:#,nbsp:. " Creates a group ExtraWhitespace hi ExtraWhitespace ctermbg=red guibg=red " Highlight trailing whitespaces autocmd Syntax * syn match ExtraWhitespace /\s\%#\@<!$/
On peut faire un retour à la ligne dans le fichier de configuration en plaçant un antislash au début des nouvelles lignes (source).
Sources:
Désactiver les sons
Ignorer les fichiers de configuration
vim -u NONE fichier
Plugins
Installer Vundle pour gérer les plugins
git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
Adapter son .vimrc:
- ~/.vimrc
set nocompatible " Nécessaire filetype off " Nécessaire " Ajout de Vundle au runtime path et initialisation set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " On indique à Vundle de s'auto-gérer :) Plugin 'gmarik/Vundle.vim' " Nécessaire " " C'est ici que vous allez placer la liste des plugins que Vundle doit gérer " call vundle#end() " Nécessaire filetype plugin indent on " Nécessaire " ... " Le reste de votre .vimrc " ...
Sauvegarder le fichier, puis, depuis Vim (A faire pour installer les plugins):
:source ~/.vimrc :PluginInstall
Pour supprimer un plugin : enlever la ligne Plugin … dans le fichier ~/.vimrc et lancer :PluginClean.
lightline.vim
Une barre en bas plus sympa. Source
Ajouter dans le fichier ~/.vimrc:
Plugin 'itchyny/lightline.vim'
Si la barre n'est pas correcte, ajouter dans le ~/vimrc:
set laststatus=2
Afficher la branche Git dans la barre: installer le plugin itchyny/vim-gitbranch et rajouter à la fin de ~/.vimrc:
let g:lightline = { \ 'active': { \ 'left': [ [ 'mode', 'paste' ], \ [ 'gitbranch', 'readonly', 'filename', 'modified' ] ] \ }, \ 'component_function': { \ 'gitbranch': 'gitbranch#name' \ }, \ }
vim-gitgutter
https://github.com/airblade/vim-gitgutter
Ajouter le plugin airblade/vim-gitgutter, l'installer, et réduire le temps d'actualisation dans le .vimrc:
set updatetime=100
]c: va à la zone modifiée suivante (next hunk)[c: va à la zone modifiée précédente (previous hunk)<leader>hu: restaure le hunk tel qu'il était avant la modification
Si la colonne est toujours noire (constaté sur MacOS, avec un thème blanc) (source):
highlight clear SignColumn highlight GitGutterAdd ctermfg=green highlight GitGutterChange ctermfg=yellow highlight GitGutterDelete ctermfg=red highlight GitGutterChangeDelete ctermfg=yellow
NERDTree et nerdtree-git-plugin
Plugin 'scrooloose/nerdtree' Plugin 'Xuyuanp/nerdtree-git-plugin' autocmd vimenter * NERDTree " automatically open NERDTree " NERDTree starts when vim is called without argument autocmd StdinReadPre * let s:std_in=1 autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif autocmd StdinReadPre * let s:std_in=1 autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif " Close vim if NERDTree is the last open autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif let NERDTreeMapActivateNode='<space>' " ouvre un fichier et un noeud avec espace map <leader>nn :NERDTreeToggle<cr> " ouvre et ferme NERDTree avec :nn let NERDTreeIgnore=['\.o$', '^__pycache__$[[dir]]'] " n'affiche pas les fichier .o et les dossiers __pycache__
BufExplorer
Facilite la gestion des plugins ouverts.
Ajouter le plugin jlanzarotta/bufexplorer.
let g:bufExplorerDefaultHelp=0 let g:bufExplorerShowRelativePath=1 let g:bufExplorerFindActive=1 let g:bufExplorerSortBy='name' map <leader>o :BufExplorer<cr>
Le plugin s'active avec :o.
Ensuite:
oouenterouvre le fichier sous le curseur dans la fenêtre précédenteFouvre le fichier sous le curseur dans un split horizontal, au-dessus de la fenêtre actuellefouvre le fichier sous le curseur dans un split horizontal, en-dessous de la fenêtre actuelleVouvre le fichier sous le curseur dans un split vertical, à gauche de la fenêtre actuellevouvre le fichier sous le curseur dans un split vertical, à droite de la fenêtre actuelletouvre le fichier sous le curseur dans un nouvel ongletuaffiche/cache les fichiers cachés
CtrlP
Permet de trouver facilement des fichiers.
Installer le plugin kien/ctrlp.vim
let g:ctrlp_working_path_mode = 'ra' let g:ctrlp_max_height = 20 let g:ctrlp_custom_ignore = 'node_modules\|^\.DS_Store\|^\.git\|^\.coffee' map <leader>b :CtrlPBuffer<cr> map <leader>m :CtrlPMRUFiles<cr> map <leader>f :CtrlP<cr>
Le plugin s'active avec Ctrl+P.
NERDCommenter
Permet de facilement commenter du code.
Installer le plugin scrooloose/nerdcommenter.
" Use compact syntax for prettified multi-line comments let g:NERDCompactSexyComs = 1
Raccourcis:
[count]<leader>c<space>toggle les commentaires
YouCompleteMe
Plugin de complétion automatique du code.
Installer le plugin ycm-core/YouCompleteMe.
cd ~/.vim/bundle/YouCompleteMe python3 install.py --clangd-completer
(plus de détails sur le dépôt GitHub)
let g:ycm_autoclose_preview_window_after_completion = 1 let g:ycm_auto_hover = '' " désactive l'affichage du type de la variable lors du passage du curseur
Activation avec Tab en mode Insertion.
VimTeX
Permet de faire du LaTeX avec Vim.
Installer le plugin lervag/vimtex et le programme latexmk.
Compilation automatique lors de la sauvegarde avec le raccourci <leader>ll.
Voir ceci pour les raccourcis.
VimMarkdown
Le plugin plasticboy/vim-markdown ajoute le support du Markdown.
let g:vim_markdown_folding_disabled = 1 " désactive le folding par défaut de tout le document let g:vim_markdown_no_default_key_mappings = 1 " désactive les raccourcis de cette extention, qui est en conflit avec ]c
Syntastic
https://github.com/vim-syntastic/syntastic
Le plugin vim-syntastic/syntastic permet une analyse syntaxique des fichiers.
set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%* let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 1 let g:syntastic_check_on_open = 1 let g:syntastic_check_on_wq = 0
Préciser le chemin des includes:
let g:syntastic_c_include_dirs = ['/usr/local/opt/gtk+3/include/gtk-3.0/', '/usr/local/opt/pango/include/pango-1.0/']
Ignorer certains messages (source):
let g:syntastic_quiet_messages = { "regex": "file not found" }
Préciser la version Python à utiliser pour l'analyse syntaxique (source):
let g:syntastic_python_python_exec = 'python3' let g:syntastic_python_checkers = ['python']
Plugins sans configuration
tpope/vim-sleuth: détecte automatiquement l'indentation du fichier et configure les tabs/…nelsyeung/twig.vim: coloration syntaxique pour les fichiers Twigluochen1990/rainbow: coloration des parenthèses (presque sans configuration)wsdjeg/vim-fetch: permet d'ouvrir le fichier à la lignenquand on demande à ouvrirfoo.txt:n
Autres plugins à essayer
Coloration syntaxique avec LaTeX
Corriger la coloration syntaxique cassée dès qu'un dollar est saisi dans un environnement lstlisting ou \lstinline{} :
syn region texZone matchgroup=texBeginEnd start="\\begin{lstlisting}" matchgroup=texBeginEnd end="\\end{lstlisting}\|%stopzone\>" syn match texInputFile "\\lstinline\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt