vim: Allow setting init.vim config alongside plugins + neovim test (#876)

* neovim: allow setting init.vim config alongside plugins
* neovim: add test for neovim plugins
* neovim: make pluginWithConfigType a have type submodule
This commit is contained in:
Joe Hermaszewski 2020-09-25 08:08:39 +08:00 committed by GitHub
parent 43ab2f40b9
commit abfb4cde51
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 100 additions and 7 deletions

View file

@ -24,12 +24,35 @@ let
merge = mergeOneOption; merge = mergeOneOption;
}; };
pluginWithConfigType = types.submodule {
options = {
plugin = mkOption {
type = types.package;
description = "vim plugin";
};
config = mkOption {
type = types.lines;
description = "vimscript for this plugin to be placed in init.vim";
default = "";
};
};
};
# A function to get the configuration string (if any) from an element of 'plugins'
pluginConfig = p:
if builtins.hasAttr "plugin" p && builtins.hasAttr "config" p then ''
" ${p.plugin.pname} {{{
${p.config}
" }}}
'' else "";
moduleConfigure = moduleConfigure =
optionalAttrs (cfg.extraConfig != "") { optionalAttrs (cfg.extraConfig != "" || (lib.filter (hasAttr "config") cfg.plugins) != []) {
customRC = cfg.extraConfig; customRC = cfg.extraConfig +
pkgs.lib.concatMapStrings pluginConfig cfg.plugins;
} }
// optionalAttrs (cfg.plugins != []) { // optionalAttrs (cfg.plugins != [] ) {
packages.home-manager.start = cfg.plugins; packages.home-manager.start = map (x: x.plugin or x) cfg.plugins;
}; };
in in
@ -178,11 +201,20 @@ in
}; };
plugins = mkOption { plugins = mkOption {
type = with types; listOf package; type = with types; listOf (either package pluginWithConfigType);
default = [ ]; default = [ ];
example = literalExample "[ pkgs.vimPlugins.yankring ]"; example = literalExample ''
with pkgs.vimPlugins; [
yankring
vim-nix
{ plugin = vim-startify;
config = "let g:startify_change_to_vcs_root = 0";
}
]
'';
description = '' description = ''
List of vim plugins to install. List of vim plugins to install optionally associated with
configuration to be placed in init.vim.
</para><para> </para><para>

View file

@ -57,6 +57,7 @@ import nmt {
./modules/programs/ncmpcpp ./modules/programs/ncmpcpp
./modules/programs/ne ./modules/programs/ne
./modules/programs/neomutt ./modules/programs/neomutt
./modules/programs/neovim
./modules/programs/newsboat ./modules/programs/newsboat
./modules/programs/nushell ./modules/programs/nushell
./modules/programs/qutebrowser ./modules/programs/qutebrowser

View file

@ -0,0 +1 @@
{ neovim-plugin-config = ./plugin-config.nix; }

View file

@ -0,0 +1,37 @@
{ config, lib, pkgs, ... }:
with lib;
{
config = {
programs.neovim = {
enable = true;
extraConfig = ''
" This should be present in vimrc
'';
plugins = with pkgs.vimPlugins; [
vim-nix
{
plugin = vim-commentary;
config = ''
" This should be present too
autocmd FileType c setlocal commentstring=//\ %s
autocmd FileType c setlocal comments=://
'';
}
];
};
nmt.script = ''
vimrc=$(grep -Po "(?<=-u )[^ ]*" < "${
builtins.toJSON config.programs.neovim.finalPackage
}/bin/nvim")
# We need to remove the unkown store paths in the config
TESTED="" assertFileContent \
<( ${pkgs.perl}/bin/perl -pe "s|\Q$NIX_STORE\E/[a-z0-9]{32}-|$NIX_STORE/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-|g" < "$vimrc"
) \
"${./plugin-config.vim}"
'';
};
}

View file

@ -0,0 +1,22 @@
" configuration generated by NIX
set nocompatible
set packpath^=/nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-vim-pack-dir
set runtimepath^=/nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-vim-pack-dir
filetype indent plugin on | syn on
" This should be present in vimrc
" vim-commentary {{{
" This should be present too
autocmd FileType c setlocal commentstring=//\ %s
autocmd FileType c setlocal comments=://
" }}}