VIM est un éditeur de texte très puissant et très apprécié de la communauté des Rubyistes. En revanche, par défaut, il peut lui manquer certaines fonctionnalités indispensables. Heureusement il est possible d’installer des plugins pour combler nos besoins.

Dans cet article vous découvrirez 17 plugins qui pourront vous faire gagner du temps et rendre l’utilisation de VIM plus agréable.

vim-plug

Pour gérer mes plugins j’ai utilisé pathogen puis je suis passé à Vundle et récemment je suis tombé sur vim-plug.

Les deux principaux avantages de vim-plug sont:

  • l’installation et la mise à jour des plugins en parallèle: plus rapide
  • la possibilité de charger les plugins à la demande: VIM démarre plus vite

Pour vous donner une idée, l’installation de mes 16 plugins prend 4,18 secondes et leur mise à jour prend 1,92 seconde.

Pour la configuration, vim-plug ressemble beaucoup à Vundle mais avec des options en plus:

call plug#begin('~/.vim/plugged')

" Raccourci, équivalent à https://github.com/tpope/vim-rails
Plug 'tpope/vim-rails'

" L'URL complète est aussi acceptée
Plug 'https://github.com/tpope/vim-rails.git'

" Gestion des dépendances: ultisnips dépend de vim-snippets
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'

" Chargement à la demande
Plug 'scrooloose/nerdtree', { 'on':  'NERDTreeToggle' }
Plug 'tpope/vim-rails', { 'for': 'ruby' }

call plug#end()

Retrouvez la documentation complète sur Github.

fzf

fzf est un fuzzy finder développé en Go, beaucoup plus rapide que ctrlp.

Pour l’installation:

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

Et ajoutez ceci dans votre .vimrc:

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }

Puis :PlugInstall pour installer le plugin. Relancez VIM puis exécutez :FZF pour commencer à rechercher dans les fichiers:

fzf VIM

Le plus simple est d’avoir un mapping du genre:

nnoremap <Leader>p :FZF<cr>

En réalité, fzf n’est pas uniquement un plugin pour VIM, il peut également faire de l’auto-complétion pour bash/zsh ou encore:

fzf

Retrouvez la documentation complète sur Github.

vim-fugitive

Si vous utilisez Git, Fugitive est LE plugin qu’il vous faut. Grâce à lui vous n’aurez plus à quitter VIM pour faire des commits ou des pushs. Plusieurs commandes seront mises à votre disposition: :Gstatus, :Gcommit, :Gmove, :Gremove, :Glog

Un exemple de :Gdiff:

Fugitive diff

Si vous utilisez Github, :Gbrowse ouvrira le fichier courant sur Github dans votre navigateur.

Retrouvez la documentation complète sur Github.

Rails.vim

Rails.vim est le plugin essentiel si vous développez avec Ruby On Rails. Ce plugin apporte plusieurs commandes qui permettent de naviguer de manière contextualisée dans un projet.

Pour vous donner une idée:

  • dans users_controller.rb avec le curseur sur la méthode show, gf ouvrira views/users/show.html.xxx
  • dans user.rb, :R ouvrira schema.rb avec le curseur placé au niveau du create_table "users"
  • dans user.rb, :A ouvrira user_spec.rb
  • dans une vue, si vous sélectionnez une portion de code, un :Rextract {file} va extraire le code, le placer dans un partial et remplacer ce code par render '{file}'
  • dans user.rb avec le curseur sur has_many :articles, gf ouvrira article.rb
  • dans routes.rb avec le curseur sur resources :articles, gf ouvrira articles_controller.rb
  • :Rails qui appelle la commade rails
  • :Rgenerate model Article va générer le moèle Article
  • :Emodel user ouvrira user.rb
  • dans users_controller.rb, :Eview index ouvrira views/users/index.html.xxx
  • il y a beaucoup d’autres possibilités

vim-endwise

vim-endwise est un plugin tout simple qui va placer des end à votre place:

VIM endwise

Ce plugin supporte d’autres langages que Ruby.

vim-test

vim-test va vous permettre de lancer vos tests directement depuis VIM. Concernant Ruby, vim-test supporte RSpec, Minitest et Cucumber.

Ce plugin apporte 5 commandes:

  • :TestNearest: dans un fichier de test, lance le test le plus proche du curseur
  • :TestFile: dans un fichier de test, lance tous les tests de ce fichier
  • :TestSuite: lance la suite de tests complète
  • :TestLast: lance le dernier test
  • :TestVisit: ouvre le dernier test lancé

vim-test

splitjoin.vim

splitjoin.vim permet de passer d’une déclaration sur une ligne à une déclaration multi-lignes avec gS, et de faire l’inverse avec gJ.

Par exemple en Ruby, passer de:

puts "ok" if true

à:

if true
  puts "ok"
end

et inversement.

VIM splitjoin

Plusieurs langages sont supportés:

This currently works for:

  • Various constructs in Ruby and Eruby
  • Various constructs in Coffeescript
  • Various constructs in Perl
  • Various constructs in Python
  • PHP arrays
  • Javascript object literals and functions
  • Tags in HTML/XML
  • CSS, SCSS, LESS style declarations.
  • YAML arrays and maps
  • Lua functions and tables
  • Go structs
  • Vimscript line continuations
  • TeX blocks
  • C if clauses and function calls
  • Do-blocks in Elixir

vim-easy-align

vim-easy-align permet d’aligner rapidement des blocs de texte. Les raccourcis peuvent faire peur au premier abord, mais une fois habitué il est difficile de s’en passer.

VIM vim-easy-align

VIM vim-easy-align

vim-capybara

vim-capybara est une collection de snippets pour écrire des tests avec Capybara.

Je ne conseille pas forcément d’utiliser ce plugin tel quel, car il est peu probable qu’il réponde exactement à vos besoins. Les snippets répondent surtout aux besoins de celui qui les a crées. Par contre n’hésitez pas à vous en inspirer pour créer vos propres snippets.

vim-commentary

Commentary permet de commenter et décommenter des blocs de code très rapidement. Vous sélectionnez la portion de code à commenter et vous tapez gc.

Commentary utilisera l’extension du fichier pour déterminer comment commenter le code. Si votre langage n’est pas supporté, vous pouvez spécifier le format dans votre .vimrc:

au FileType ocaml setlocal commentstring=(*\  %s\ *)

syntastic

Syntastic permet de détecter les erreurs de syntaxe dans votre code. Il supporte la plupart des langages:

ActionScript, Ada, Ansible configurations, API Blueprint, AppleScript, AsciiDoc, ASM, BEMHTML, Bro, Bourne shell, C, C++, C#, Cabal, Chef, CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart, DocBook, Dockerfile, Dust, Elixir, Erlang, eRuby, Fortran, Gentoo metadata, GLSL, Go, Haml, Haskell, Haxe, Handlebars, HSS, HTML, Jade, Java, JavaScript, JSON, JSX, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, Markdown, MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, Perl POD, PHP, gettext Portable Object, OS X and iOS property lists, Puppet, Python, QML, R, Racket, Relax NG, reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Sphinx, SQL, Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Vala, Verilog, VHDL, VimL, xHtml, XML, XSLT, XQuery, YACC, YAML, z80, Zope page templates, and zsh

VIM syntastic

Ce plugin comporte beaucoup d’options et celles par défaut ne sont pas forcément appropriées si vous installez ce plugin pour la première fois. Pour cela il est conseillé d’ajouter cette configuration basique dans votre .vimrc:

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

vim-vinegar

vim-vinegar peut être vu comme une alternative à NERDTree.

Un simple - permet d’ouvrir l’arborescence et de naviguer dedans:

VIM syntastic

vim-multiple-cursors

J’utilise aussi Sublime Text ou Atom et j’ai pris l’habitude d’utiliser les curseurs multiples. Heureusement il existe vim-multiple-cursors qui permet d’obtenir un comportement similaire:

VIM multiple cursors

VIM multiple cursors

vim-dispatch

Si vous faites un :grep ou si vous lancez vos tests depuis VIM, vous ne pourrez pas utiliser VIM tant que ce processus n’est pas fini.

Grâce à vim-dispatch vous pouvez lancer des processus de manière asynchrone en continuant à éditer vos fichiers. Par exemple: :Dispatch bundle install ou :Dispatch rspec.

Ce plugin est surtout intéressant si vous utilisez tmux: dispatch exécutera le processus dans un nouveau split. Sinon le plugin fonctionne également avec iTerm, screen ou en mode headless.

Vous pouvez voir une vidéo de démonstration du plugin par Tim Pope, son créateur.

auto-pairs

auto-pairs permet d’insérer ou de supprimer automatiquement les paires de { }, ( ), " ", ' ', ` ` et [ ].

Par exemple:

input: [
output: [|]
input: foo[<BS>]
output: foo
input: {|} (press <CR> at |)
output: {
  |
}
input: {|} (press <SPACE> at |)
output: { | }

vim-eunuch

eunuch ajoute plusieurs commandes qui permettent de manipuler les fichiers “à la UNIX”. Vous aurez par exemple :Rename qui permet de renommer un fichier sans avoir à le fermer. :Find qui lance la commande find, de même pour :Locate, :Chmod ou encore :Mkdir.

Une autre commande très pratique: :SudoWrite. Lorsque vous modifiez un fichier sur lequel vous n’avez pas les droits, vous obtiendrez une erreur au moment de vouloir l’enregistrer. En utilisant cette commande, le mot de passe sudo vous sera demandé et la sauvegarde du fichier sera effectuée sans risque de perdre vos modifications.

Retrouvez la liste complète des commandes sur Github.

vim-mundo

vim-mundo qui est un fork de gundo.vim permet de conserver une trace de vos modifications automatiquement. Cela peut être très utile même si vous utilisez Git.

La fonctionnalité qui permet de sauvegarder les modifications automatiquement est présente de base dans VIM avec la commande :undolist, mais ce plugin la rend plus simple d’utilisation.

Vous devrez d’abord créer un dossier ~/.vim/undo et ajouter ceci dans votre .vimrc:

" Enable persistent undo so that undo history persists across vim sessions
set undofile
set undodir=~/.vim/undo

Puis :GundoShow pour ouvrir mundo:

VIM Mundo

Vous trouverez la documentation complète sur le site du projet initial: Gundo.