Mason, comment installer facilement des LSP, des linters, des formatteurs... sur NeoVim

NeoVim, le Vim du futur, sait parfaitement gérer des LSP (Language Server Protocol), des linters, des formateurs, des snippets, etc. Avec CoC, on est à deux doigts d’avoir un VSCode en mode terminal. Mais installer un LSP (Language Server Protocol), demandait de faire deux ou trois choses manuellement pour chaque langage. C’était sans compter sur “Mason”.
Mason est un utilitaire simple et proprement pensé, avec un registre de langages bien fourni, qui permet d’installer facilement des LSP, des linters, des formateurs, des snippets, etc. pour NeoVim.
Je vous l’avoue, j’ai eu un peu de mal à comprendre comment on l’initialise, d’où ce billet. Mais dans les faits, c’est super simple.
Installation
Il faut installer le plugin dans NeoVim. Personnellement, j’utilise vim-plug. C’est simple et efficace, ça s’installe en deux temps trois mouvements. Et je n’ai qu’à ajouter une ligne dans mon fichier de configuration pour que le plugin soit pris en compte.
Plug 'williamboman/mason.nvim'
On doit alors taper :PlugInstall
pour installer le plugin.
Ensuite, il faut initialiser Mason. Pour cela, il faut ajouter une ligne dans votre fichier de configuration, plus bas, en fin de configuration si vous le voulez.
lua require('mason').setup()
C’est cette ligne qui n’est pas dans la documentation (je suis étonné, et j’ai ouvert cette issue pour le signaler).
À partir de là, le chemin d’installation des LSP et autres outils est ~/.local/share/nvim/mason/bin/
au sein de NeoVim.
Ce qui a plusieurs avantages :
- D’abord, cela ne va pas polluer votre “PATH” dans les terminaux. Par exemple quand je tape “
helm
” en ligne de commande, je ne veux pas voirhelm_ls
apparaître dans la completion - D’autre part, cela ne pollue pas le système. Les LSP sont dans un répertoire personnel, facile à dégager, géré par Mason et c’est tout.
- Et le fait que le PATH soit “local à neovim” fait que vous n’avez pas à spécifier le chemin complet des exécutables dans vos configurations.
En bref, c’est déjà bien pensé.
Installer un LSP
Reste à installer un LSP. Prenons par exemple un LSP pour helm.
Ouvrez NeoVim et tapez :MasonInstall helm-ls
Va alors s’ouvrir cette fenêtre (fermez en pressant la touche “Echap”) :
Et voilà, c’est tout. Mason va télécharger le LSP, l’installer dans le répertoire ~/.local/share/nvim/mason/bin/
.
Pour que NeoVim sache ce qu’est un fichier helm
(on parle du “type de fichier”, parce que c’est un fichier YAML mais avec des balises de template, et que NeoVim ne peut pas le comprendre tout seul), il faut ajouter un plugin (et on n’oublie pas de taper :PlugInstall
pour l’installer) :
Plug 'towolf/vim-helm'
Vous pouvez ensuite définir comment l’utiliser. Moi, j’utilise le plugin “Coc” pour des milliers de raisons. Et une des raisons est que je peux utiliser des LSP sans me prendre la tête. Il suffit de taper :CocConfig
et d’ajouter une ligne dans le fichier de configuration de CoC.
{
"languageserver": {
"helm": {
"command": "helm_ls",
"args": ["serve"],
"filetypes": ["helm"],
"rootPatterns": ["Chart.yaml"],
}
}
}
Et voilà, vous avez un LSP pour helm. Il va vous engueuler quand vous faites des erreurs, vous donner des suggestions, autocompléter les valeurs en prenant en compte le fichier de “Values”, etc.
Conclusion
De mon point de vue, NeoVim est quasi parfait avec une configuration simple :
- Nerdtree pour la navigation https://github.com/preservim/nerdtree ainsi que quelques “plugins” pour avoir les icônes, la couleur, l’état “Git”…
- CoC pour les plugins et les LSP https://github.com/neoclide/coc.nvim
- Mason pour installer les LSP https://github.com/williamboman/mason.nvim
J’ai quelques autres plugins, pour la correction grammaticale (ce qui ne m’empêche pas d’en laisser passer, je suis vraiment pas rigoureux sur ce point), pour les snippets, j’ai aussi Copilot (parce que bon sang, c’est pratique), etc. Vraiment, NeoVim permet d’avoir un IDE complet.
Avec quelques astuces voilà à quoi ressemble mon NeoVim, dans mon terminal :
Je pense qu’un jour, je ferai un billet sur ma configuration NeoVim, voir une vidéo…