Configurer vim et ses greffons avec un module customConfig

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.

:information_source: Remarque
Cet article fait partie d'une série sur les modules à importer dans customConfig. Si vous n'avez jamais édité ces fichiers, lisez d'abord Ajouter vos programmes et Configuration personnalisée.


Ce que vous obtenez

  • la commande vim avec vos greffons déjà présents, pour tous les comptes de la machine ;
  • votre vimrc versionné 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 alors monvim pour votre version et vim pour celle du système.
  • Des greffons chargés à la demande. À côté de start, la liste opt dé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 :
    nix search nixpkgs vimPlugins.nerdtree
    
    Les noms reprennent en général celui du dépôt, avec les points remplacés par des tirets : ctrlp.vim devient ctrlp-vim.
  • De la complétion et du diagnostic. syntastic est le vétéran, mais il vieillit. Regardez plutôt vim-lsp ou coc-nvim, qui parlent aux serveurs de langage modernes. Attention, ces greffons demandent des programmes externes, à déclarer eux aussi dans environment.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 : packloadall manque 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 avec nix search, les tirets et les points se ressemblent mais ne s'écrivent pas pareil.
  • Tagbar s'ouvre vide : il manque pkgs.universal-ctags dans les paquets du système.
  • La barre airline affiche des symboles bizarres : g:airline_powerline_fonts = 1 demande 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 ./vimrc exige 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-full et non vim.

Voir aussi