coq-nvim: init plugin

still need to add most options, but this is enough to be usable
right now! This also sets up the work needed for other completion
frameworks, notably things like nvim-cmp and compe.
This commit is contained in:
Pedro Alves 2022-01-09 23:00:19 +00:00
parent 6de23559d7
commit f8b70a30ea
4 changed files with 140 additions and 14 deletions

View file

@ -0,0 +1,47 @@
{ pkgs, lib, config, ... }:
with lib;
let
cfg = config.programs.nixvim.plugins.coq-nvim;
helpers = import ../helpers.nix { lib = lib; };
plugins = import ../plugin-defs.nix { inherit pkgs; };
in {
options = {
programs.nixvim.plugins.coq-nvim = {
enable = mkEnableOption "Enable coq-nvim";
installArtifacts = mkEnableOption "Install coq-artifacts";
autoStart = mkOption {
type = with types; nullOr (oneOf [bool (enum ["shut-up"])]);
default = null;
description = "Auto-start or shut up";
};
recommendedKeymaps = mkOption {
type = with types; nullOr bool;
default = null;
description = "Use the recommended keymaps";
};
};
};
config = let
settings = {
auto_start = cfg.autoStart;
"keymap.recommended" = cfg.recommendedKeymaps;
};
in mkIf cfg.enable {
programs.nixvim = {
extraPlugins = [
plugins.coq-nvim
] ++ optional cfg.installArtifacts plugins.coq-artifacts;
plugins.lsp = {
preConfig = ''
vim.g.coq_settings = ${helpers.toLuaObject settings}
local coq = require 'coq'
'';
setupWrappers = [(s: ''coq.lsp_ensure_capabilities(${s})'')];
};
};
};
}

View file

@ -9,6 +9,8 @@
./colorschemes/onedark.nix ./colorschemes/onedark.nix
./colorschemes/tokyonight.nix ./colorschemes/tokyonight.nix
./completion/coq.nix
./git/fugitive.nix ./git/fugitive.nix
./git/gitgutter.nix ./git/gitgutter.nix

View file

@ -40,33 +40,49 @@ in
default = ""; default = "";
}; };
capabilities = mkOption { setupWrappers = mkOption {
type = with types; listOf (functionTo str);
description = "Code to be run to wrap the setup args. Takes in an argument containing the previous results, and returns a new string of code.";
default = [];
};
preConfig = mkOption {
type = types.lines; type = types.lines;
description = "A lua function defining the capabilities of a new LSP buffer."; description = "Code to be run before loading the LSP. Useful for requiring plugins";
default = ""; default = "";
}; };
}; };
}; };
config = mkIf cfg.enable { config = let
runWrappers = wrappers: s:
if wrappers == [] then s
else (head wrappers) (runWrappers (tail wrappers) s);
in mkIf cfg.enable {
programs.nixvim = { programs.nixvim = {
extraPlugins = [ pkgs.vimPlugins.nvim-lspconfig ]; extraPlugins = [ pkgs.vimPlugins.nvim-lspconfig ];
# Enable all LSP servers # Enable all LSP servers
extraConfigLua = '' extraConfigLua = ''
-- LSP {{{ -- LSP {{{
local __lspServers = ${helpers.toLuaObject cfg.enabledServers} do
local __lspOnAttach = function(client) ${cfg.preConfig}
${cfg.onAttach} local __lspServers = ${helpers.toLuaObject cfg.enabledServers}
end local __lspOnAttach = function(client)
${cfg.onAttach}
end
for i,server in ipairs(__lspServers) do local __setup = ${runWrappers cfg.setupWrappers "{
if type(server) == "string" then on_attach = __lspOnAttach
require('lspconfig')[server].setup { }"}
on_attach = __lspOnAttach
} for i,server in ipairs(__lspServers) do
else if type(server) == "string" then
require('lspconfig')[server.name].setup(server.extraOptions) require('lspconfig')[server].setup(__setup)
else
local options = ${runWrappers cfg.setupWrappers "server.extraOptions"}
require('lspconfig')[server.name].setup(options)
end
end end
end end
-- }}} -- }}}

View file

@ -23,4 +23,65 @@
sha256 = "1y3l2c7h8czhw0b5m25iyjdyy0p4nqk4a3bxv583m72hn4ac8rz9"; sha256 = "1y3l2c7h8czhw0b5m25iyjdyy0p4nqk4a3bxv583m72hn4ac8rz9";
}; };
}; };
coq-nvim = pkgs.vimUtils.buildVimPlugin rec {
pname = "coq-nvim";
version = "2699492a1b8716c59ade7130dc354e53944b6a7f";
src = pkgs.fetchFromGitHub {
owner = "ms-jpq";
repo = "coq_nvim";
rev = version;
sha256 = "sha256-tjniIWe1V4vGuao5no+3YB9WtiNaMehEjffJyNpFgd8=";
};
passthru.python3Dependencies = ps: [
ps.pynvim
ps.pyyaml
(ps.buildPythonPackage rec {
pname = "pynvim_pp";
version = "01dc0f58d4e71a98c388e1f37bda3d1357089fa2";
src = pkgs.fetchFromGitHub {
owner = "ms-jpq";
repo = "pynvim_pp";
rev = version;
sha256 = "sha256-/m4Paw6AvDzTMWWCWpPnrdI4gsjIDSJPvGCMV7ufbEA=";
};
propagatedBuildInputs = [ pkgs.python3Packages.pynvim ];
})
(ps.buildPythonPackage rec {
pname = "std2";
version = "48bb39b69ed631ef64eed6123443484133fd20fc";
doCheck = false;
src = pkgs.fetchFromGitHub {
owner = "ms-jpq";
repo = "std2";
rev = version;
sha256 = "sha256-nMwNAq15zyf9ORhFGo0sawQukOygYoVWtT7jH68MIkI=";
};
})
];
# We need some patches so it stops complaining about not being in a venv
postPatch = ''
substituteInPlace coq/consts.py \
--replace "VARS = TOP_LEVEL / \".vars\"" "VARS = Path.home() / \".cache/home/vars\"";
substituteInPlace coq/__main__.py \
--replace "_IN_VENV = _RT_PY == _EXEC_PATH" "_IN_VENV = True"
'';
};
coq-artifacts = pkgs.vimUtils.buildVimPlugin rec {
pname = "coq.artifacts";
version = "495429564e481cafeb044456da32c10cb631f948";
src = pkgs.fetchFromGitHub {
owner = "ms-jpq";
repo = "coq.artifacts";
rev = version;
sha256 = "sha256-AtkG2XRVZgvJzH2iLr7UT/U1+LXxenvNckdapnJV+8A=";
};
};
} }