I had a need to deploy vim and my particular preferred configuration both system-wide and across multiple systems (via NixOps).
I started by creating a file named vim.nix
that would be imported into either
/etc/nixos/configuration.nix
or an appropriate NixOps Nix file. This example
is a stub that shows a number of common configuration items:
with import <nixpkgs> {};
vim_configurable.customize {
name = "vim"; # Specifies the vim binary name.
# Below you can specify what usually goes into `~/.vimrc`
vimrcConfig.customRC = ''
" Preferred global default settings:
set number " Enable line numbers by default
set background=dark " Set the default background to dark or light
set smartindent " Automatically insert extra level of indentation
set tabstop=4 " Default tabstop
set shiftwidth=4 " Default indent spacing
set expandtab " Expand [TABS] to spaces
syntax enable " Enable syntax highlighting
colorscheme solarized " Set the default colour scheme
set t_Co=256 " use 265 colors in vim
set spell spelllang=en_au " Default spell checking language
hi clear SpellBad " Clear any unwanted default settings
hi SpellBad cterm=underline " Set the spell checking highlight style
hi SpellBad ctermbg=NONE " Set the spell checking highlight background
match ErrorMsg '\s\+$' "
let g:airline_powerline_fonts = 1 " Use powerline fonts
let g:airline_theme='solarized' " Set the airline theme
set laststatus=2 " Set up the status line so it's coloured and always on
" Add more settings below
'';
# store your plugins in Vim packages
vimrcConfig.packages.myVimPackage = with pkgs.vimPlugins; {
start = [ # Plugins loaded on launch
airline # Lean & mean status/tabline for vim that's light as air
solarized # Solarized colours for Vim
vim-airline-themes # Collection of themes for airlin
vim-nix # Support for writing Nix expressions in vim
];
# manually loadable by calling `:packadd $plugin-name`
# opt = [ phpCompletion elm-vim ];
# To automatically load a plugin when opening a filetype, add vimrc lines like:
# autocmd FileType php :packadd phpCompletion
};
}
I then needed to import this file into my system packages stanza:
environment = {
systemPackages = with pkgs; [
someOtherPackages # Normal package listing
(
import ./vim.nix
)
];
};
This will then install and configure Vim as you've defined it.
If you'd like to give this build a run in a non-production space, I've written vim_vm.nix with which you can build a VM, ssh into afterwards and test the Vim configuration:
$ nix-build '<nixpkgs/nixos>' -A vm --arg configuration ./vim_vm.nix
...
$ export QEMU_OPTS="-m 4192"
$ export QEMU_NET_OPTS="hostfwd=tcp::18080-:80,hostfwd=tcp::10022-:22"
$ ./result/bin/run-vim-vm-vm
Then, from a another terminal:
$ ssh nixos@localhost -p 10022
And you should be in a freshly baked NixOS VM with your Vim config ready to be used.
There's an always current example of my production Vim configuration in my mio-ops repo.