linux:vim

Ceci est une ancienne révision du document !


Vim

Via SSH

vim scp://remoteuser@server.tld//absolute/path/to/document

Préciser la ligne

vim file.txt +324

  • =: réajuste l'indentation
  • Ctrl+A: incrémente le nombre sous le curseur, Ctrl+X décrémente
  • L: place le curseur en haut de l'écran, H en bas et M au milieu
  • cf_: édite jusqu'à l'underscore inclus
  • ct_: édite jusqu'à l'underscore exclus
  • 3s: édite trois caractères (pareil que c3l)
  • en mode insertion, Ctrl+R % insère le nom du fichier courant (Source)
  • Ctrl+L permet de rafraîchir l'affichage, et donc la coloration syntaxique (utile s'il y avait avant une ligne qui la fait planter).
  • en mode visuel, g C-g permet d'avoir des statistiques sur ce qui est sélectionné (nombre de lignes, … source)
  • Maj+R passe en mode remplacement: équivalent du mode insertion, mais le curseur écrase ce qui est déjà présent.

Fichiers sous le curseur

source

  • gf ouvre le fichier dans un nouveau buffer. Ctrl+O permet de revenir au fichier précédemment ouvert.
  • Ctrl+w f: ouvre le fichier dans une nouvelle fenêtre
  • Ctrl+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.

Source

Utiliser le mot sous le curseur dans une commande

En saisissant une commande, utiliser le raccourci Ctrl+R, Ctrl+W.

Source

Recharger un fichier

Recharger dans Vim un fichier ouvert, mais modifié par un autre programme:

:e # raccourci pour :edit

Déplacements

Source

Aller à l'accolade/parenthèse/crochet correspondant: %.

Manipuler les onglets

Source

Ouvrir plusieurs fichiers, chacun dans un onglet:

vim -p file1 file2 ...
  • :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: ouvre filename en scindant la fenêtre verticalement
  • Ctrl+w flèche: change la fenêtre sélectionnée
  • Ctrl+w Ctrl+w: change la fenêtre sélectionnée en cyclant sur les fenêtres
  • Ctrl+w _: maximize la fenêtre maintenant
  • Ctrl+w =: rend chaque fenêtre de taille identique
  • Ctrl+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: ouvre file mais 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ée
  • Ctrl+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

Source

Sélectionner la zone de texte dont on souhaite avoir les statistiques, g puis Ctrl+g.

Lier les curseurs de plusieurs splits

Source

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

Source

  1. Ctrl+V permet de passer en mode Visual Block.
  2. DOWN pour sélectionner les lignes.
  3. Shift+i pour passer en mode Insertion sur la première ligne.
  4. Faire la modification.
  5. Echap pour 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 avec i

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
  • :bfirst et :blast

Formater un fichier JSON

source

:%!python -m json.tool

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

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 % -

Lister les derniers fichiers édités avec Vim

Source

:ol

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. A 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

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

Copier vers le presse-papier du système

Source 1, Source 2

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

Source

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

Source

Dans le .vimrc et .gvimrc si besoin:

set belloff=all

Ignorer les fichiers de configuration

Source

vim -u NONE fichier

Installer Vundle pour gérer les plugins

Source

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

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'
      \ },
      \ }

Source

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.

Documentation

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:

  • o ou enter ouvre le fichier sous le curseur dans la fenêtre précédente
  • F ouvre le fichier sous le curseur dans un split horizontal, au-dessus de la fenêtre actuelle
  • f ouvre le fichier sous le curseur dans un split horizontal, en-dessous de la fenêtre actuelle
  • V ouvre le fichier sous le curseur dans un split vertical, à gauche de la fenêtre actuelle
  • v ouvre le fichier sous le curseur dans un split vertical, à droite de la fenêtre actuelle
  • t ouvre le fichier sous le curseur dans un nouvel onglet
  • u affiche/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 Twig

Autres plugins à essayer

  • linux/vim.1639239938.txt.gz
  • Dernière modification : 2021/12/11 17:25
  • de phsw