Sur NixOS, on ne laisse pas vim installer ses greffons lui-même. On décrit la liste dans un fichier .nix, et on obtient un vim complet, identique sur toutes ses machines, reconstruit à l'identique après une réinstallation. Plus de Vundle, plus de vim-plug, plus de dossier ~/.vim à sauvegarder. Voici comment, et surtout ce qui change par rapport à une installation classique.
Remarque
Cet article fait partie d'une série sur les modules à importer danscustomConfig. Si vous n'avez jamais édité ces fichiers, lisez d'abord Ajouter vos programmes et Configuration personnalisée.
Ce que vous obtenez
- la commande
vimavec vos greffons déjà présents, pour tous les comptes de la machine ; - votre
vimrcversionné avec le reste de la configuration ; - aucun gestionnaire de greffons à installer, à mettre à jour ou à réparer.
Le fichier
Créez /etc/nixos/customConfig/vim.nix :
{ pkgs, ... }:
{
environment.systemPackages = [
pkgs.universal-ctags
(pkgs.vim-full.customize {
name = "vim";
vimrcConfig.customRC = builtins.readFile ./vimrc;
vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; {
start = [
nerdtree
ctrlp-vim
tagbar
vim-airline
vim-airline-themes
vim-commentary
vim-surround
vim-fugitive
vim-colorschemes
];
};
})
];
}
Et à côté, dans le même dossier, un fichier vimrc :
set nocompatible
filetype plugin indent on
packloadall
silent! helptags ALL
syntax on
colorscheme monokai
set number
set encoding=utf-8
set expandtab shiftwidth=2 tabstop=2
set ignorecase smartcase
set incsearch hlsearch
set clipboard=unnamedplus
set mouse=a
let g:airline_powerline_fonts = 1
let g:airline_theme = 'dark'
nnoremap <C-n> :NERDTreeToggle<CR>
nnoremap <F8> :TagbarToggle<CR>
nnoremap <leader>h :nohlsearch<CR>
Ce que fait chaque ligne
pkgs.vim-full est la variante complète de vim : interface graphique, prise en charge du presse-papiers système, interpréteurs embarqués. C'est elle qu'il faut si vous voulez que set clipboard=unnamedplus fonctionne, car le vim minimal est compilé sans le support X11.
.customize enveloppe le paquet pour y injecter votre configuration. Les parenthèses autour de l'expression entière sont indispensables : sans elles, Nix croirait que vous listez trois éléments distincts.
name = "vim" décide du nom de la commande produite. Avec "vim", votre version devient celle que vous obtenez en tapant vim.
vimrcConfig.customRC reçoit le contenu du fichier de configuration. builtins.readFile ./vimrc lit le fichier voisin, ce qui vous laisse écrire du vimscript normal, avec la coloration syntaxique de votre éditeur, plutôt que de l'enfermer dans une chaîne Nix.
vimrcConfig.packages.myVimPackage.start est la liste des greffons chargés au démarrage. Le nom myVimPackage est arbitraire, c'est juste une étiquette.
pkgs.universal-ctags n'est pas un greffon, c'est un programme externe. Tagbar, qui affiche la liste des fonctions du fichier courant, l'appelle pour analyser le code. Sans lui, Tagbar s'ouvre sur un panneau vide en affichant un message que l'on ne lit pas toujours.
Les greffons retenus ici :
| Greffon | Ce qu'il apporte |
|---|---|
nerdtree |
un explorateur de fichiers en panneau latéral |
ctrlp-vim |
ouverture d'un fichier par recherche approximative sur son nom |
tagbar |
la structure du fichier courant, fonctions et classes |
vim-airline |
une barre d'état complète, avec la branche git |
vim-airline-themes |
les habillages de cette barre |
vim-commentary |
gcc commente une ligne, gc une sélection |
vim-surround |
ajouter, changer ou retirer des guillemets et des balises autour d'un texte |
vim-fugitive |
git dans vim, :Git status, :Git blame |
vim-colorschemes |
environ trois cents jeux de couleurs, dont monokai |
Les deux pièges du passage à Nix
packloadall en début de vimrc. Les greffons fournis par Nix sont des paquets natifs de vim, et vim les charge normalement après avoir lu votre vimrc. Si vous appelez colorscheme monokai sans avoir forcé le chargement, vim répond E185: Cannot find color scheme 'monokai', alors que le greffon est bel et bien installé. La ligne packloadall remet les choses dans l'ordre, et silent! helptags ALL construit au passage l'index de l'aide.
Plus aucune ligne Vundle. Les Plugin '...', les call vundle#begin() et les call vundle#end() doivent disparaître de votre vimrc. Les greffons sont déjà là, et Vundle chercherait à les réinstaller dans votre dossier personnel, ce qui aboutit à deux versions concurrentes et à des comportements incompréhensibles.
Activer le module
Dans /etc/nixos/customConfig/default.nix :
{
imports = [ ./vim.nix ];
environment.systemPackages = [
# Add your stable apps here (exemple: pkgs.btop)
Puis :
glf-update
Vérifiez ensuite depuis un nouveau terminal :
vim --version | head -1
vim -c ':echo &runtimepath' -c ':q'
Les options que vous pouvez changer
- Garder le vim d'origine à côté. Mettez
name = "monvim". Vous aurez alorsmonvimpour votre version etvimpour celle du système. - Des greffons chargés à la demande. À côté de
start, la listeoptdéclare des greffons que vim ne charge pas au démarrage. Vous les activez dans la session avec:packadd nom. Pratique pour un greffon lourd dont vous vous servez rarement.vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; { start = [ vim-airline ]; opt = [ vimtex ]; }; - Trouver le nom d'un greffon. Sur search.nixos.org, ou en ligne de commande :
Les noms reprennent en général celui du dépôt, avec les points remplacés par des tirets :nix search nixpkgs vimPlugins.nerdtreectrlp.vimdevientctrlp-vim. - De la complétion et du diagnostic.
syntasticest le vétéran, mais il vieillit. Regardez plutôtvim-lspoucoc-nvim, qui parlent aux serveurs de langage modernes. Attention, ces greffons demandent des programmes externes, à déclarer eux aussi dansenvironment.systemPackages. - Pour Neovim, la même mécanique existe :
{ programs.neovim = { enable = true; defaultEditor = true; configure = { customRC = builtins.readFile ./init.vim; packages.myPlugins.start = with pkgs.vimPlugins; [ nerdtree vim-airline ]; }; }; } - Faire de vim l'éditeur par défaut du système, ce qui profite à
sudoedit, à git et à sops :{ environment.variables.EDITOR = "vim"; }
En cas de problème
E185: Cannot find color scheme:packloadallmanque en début de vimrc, ou le greffon de couleurs n'est pas dans la liste.- attribute 'xxx' missing à la construction : le nom du greffon n'existe pas tel quel dans
vimPlugins. Cherchez-le avecnix search, les tirets et les points se ressemblent mais ne s'écrivent pas pareil. - Tagbar s'ouvre vide : il manque
pkgs.universal-ctagsdans les paquets du système. - La barre airline affiche des symboles bizarres :
g:airline_powerline_fonts = 1demande une police Nerd Font, à installer et à sélectionner dans le terminal. Voyez l'article sur zsh et Powerlevel10k, qui traite la même question. - path does not exist à l'évaluation :
builtins.readFile ./vimrcexige que le fichier existe. Si vous l'avez supprimé ou renommé, le système ne se construit plus tant que la ligne pointe dans le vide. - Le presse-papiers système ne suit pas : vérifiez que vous utilisez bien
vim-fullet nonvim.