Merge pull request #184364 from teto/vim-merge-cmds

This commit is contained in:
Matthieu Coudron 2022-08-12 09:38:12 +02:00 committed by GitHub
commit 60b0ef2931
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 69 additions and 128 deletions

View file

@ -1,7 +1 @@
" configuration generated by NIX
set nocompatible
set packpath^=/nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-vim-pack-dir
set runtimepath^=/nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-vim-pack-dir
:help ale

View file

@ -86,9 +86,11 @@ rec {
nvim_with_plug = neovim.override {
extraName = "-with-plug";
configure.plug.plugins = with pkgs.vimPlugins; [
(base16-vim.overrideAttrs(old: { pname = old.pname + "-unique-for-tests-please-dont-use"; }))
];
configure.packages.plugins = with pkgs.vimPlugins; {
start = [
(base16-vim.overrideAttrs(old: { pname = old.pname + "-unique-for-tests-please-dont-use"; }))
];
};
configure.customRC = ''
color base16-tomorrow-night
set background=dark
@ -123,7 +125,7 @@ rec {
});
force-nowrap = runTest nvimDontWrap ''
! grep "-u" ${nvimDontWrap}/bin/nvim
! grep -F -- ' -u' ${nvimDontWrap}/bin/nvim
'';
nvim_via_override-test = runTest nvim_via_override ''
@ -154,12 +156,6 @@ rec {
configure.packages.foo.start = with vimPlugins; [ deoplete-nvim ];
};
# only neovim makes use of `requiredPlugins`, test this here
test_nvim_with_vim_nix_using_pathogen = neovim.override {
extraName = "-pathogen";
configure.pathogen.pluginNames = [ "vim-nix" ];
};
nvimWithLuaPackages = wrapNeovim2 "-with-lua-packages" (makeNeovimConfig {
extraLuaPackages = ps: [ps.mpack];
customRC = ''

View file

@ -11,21 +11,18 @@
, wrapNeovimUnstable
}:
let
# returns everything needed for the caller to wrap its own neovim:
# - the generated content of the future init.vim
# - the arguments to wrap neovim with
# The caller is responsible for writing the init.vim and adding it to the wrapped
# arguments (["-u" writeText "init.vim" GENERATEDRC)]).
# This makes it possible to write the config anywhere: on a per-project basis
# .nvimrc or in $XDG_CONFIG_HOME/nvim/init.vim to avoid sideeffects.
# Indeed, note that wrapping with `-u init.vim` has sideeffects like .nvimrc wont be loaded
# anymore, $MYVIMRC wont be set etc
/* returns everything needed for the caller to wrap its own neovim:
- the generated content of the future init.vim
- the arguments to wrap neovim with
The caller is responsible for writing the init.vim and adding it to the wrapped
arguments (["-u" writeText "init.vim" GENERATEDRC)]).
This makes it possible to write the config anywhere: on a per-project basis
.nvimrc or in $XDG_CONFIG_HOME/nvim/init.vim to avoid sideeffects.
Indeed, note that wrapping with `-u init.vim` has sideeffects like .nvimrc wont be loaded
anymore, $MYVIMRC wont be set etc
*/
makeNeovimConfig =
{
withPython2 ? false
/* the function you would have passed to python.withPackages */
, extraPython2Packages ? (_: [ ])
, withPython3 ? true
{ withPython3 ? true
/* the function you would have passed to python3.withPackages */
, extraPython3Packages ? (_: [ ])
, withNodeJs ? false
@ -36,10 +33,8 @@ let
# expects a list of plugin configuration
# expects { plugin=far-vim; config = "let g:far#source='rg'"; optional = false; }
, plugins ? []
# forwarded to configure.customRC
# custom viml config appended after plugin-specific config
, customRC ? ""
# same values as in vimUtils.vimrcContent
, configure ? { }
# for forward compability, when adding new environments, haskell etc.
, ...
@ -54,25 +49,20 @@ let
};
# transform all plugins into an attrset
pluginsNormalized = map (x: if x ? plugin then { optional = false; } // x else { plugin = x; optional = false;}) plugins;
# { optional = bool; plugin = package; dest = filename; }
pluginsNormalized = map (x: if x ? plugin then { dest = "init.vim"; optional = false; } // x else { plugin = x; optional = false;}) plugins;
configurePatched = configure // {
customRC = pluginRc + customRC + (configure.customRC or "");
};
# A function to get the configuration string (if any) from an element of 'plugins'
pluginConfig = p:
if (p.config or "") != "" then ''
" ${p.plugin.pname or p.plugin.name} {{{
${p.config}
" }}}
'' else "";
pluginRC = lib.concatMapStrings (p: p.config or "") pluginsNormalized;
pluginRc = lib.concatMapStrings pluginConfig pluginsNormalized;
requiredPlugins = vimUtils.requiredPlugins configurePatched;
pluginsPartitioned = lib.partition (x: x.optional == true) pluginsNormalized;
requiredPlugins = vimUtils.requiredPluginsForPackage myVimPackage;
getDeps = attrname: map (plugin: plugin.${attrname} or (_: [ ]));
myVimPackage = {
start = map (x: x.plugin) pluginsPartitioned.wrong;
opt = map (x: x.plugin) pluginsPartitioned.right;
};
pluginPython3Packages = getDeps "python3Dependencies" requiredPlugins;
python3Env = python3Packages.python.withPackages (ps:
@ -102,12 +92,16 @@ let
let
binPath = lib.makeBinPath (lib.optionals withRuby [ rubyEnv ] ++ lib.optionals withNodeJs [ nodejs ]);
flags = lib.concatLists (lib.mapAttrsToList (
prog: withProg: [
"--cmd" (genProviderSettings prog withProg)
]
)
hostprog_check_table);
hostProviderViml = lib.mapAttrsToList genProviderSettings hostprog_check_table;
# as expected by packdir
packDirArgs.myNeovimPackages = myVimPackage;
# vim accepts a limited number of commands so we join them all
flags = [
"--cmd" (lib.intersperse "|" hostProviderViml)
"--cmd" "set packpath^=${vimUtils.packDir packDirArgs}"
];
in
[
"--inherit-argv0" "--add-flags" (lib.escapeShellArgs flags)
@ -120,11 +114,10 @@ let
"--prefix" "LUA_CPATH" ";" (neovim-unwrapped.lua.pkgs.lib.genLuaCPathAbsStr luaEnv)
];
manifestRc = vimUtils.vimrcContent (configurePatched // { customRC = ""; }) ;
neovimRcContent = vimUtils.vimrcContent configurePatched;
manifestRc = vimUtils.vimrcContent ({ customRC = ""; }) ;
# we call vimrcContent without 'packages' to avoid the init.vim generation
neovimRcContent = vimUtils.vimrcContent ({ beforePlugins = ""; customRC = pluginRC + customRC; packages = null; });
in
assert withPython2 -> throw "Python2 support has been removed from neovim, please remove withPython2 and extraPython2Packages.";
builtins.removeAttrs args ["plugins"] // {
wrapperArgs = makeWrapperArgs;
@ -144,10 +137,9 @@ let
"let g:loaded_${prog}_provider=0"
;
# to keep backwards compatibility
# to keep backwards compatibility for people using neovim.override
legacyWrapper = neovim: {
extraMakeWrapperArgs ? ""
, withPython ? false
/* the function you would have passed to python.withPackages */
, extraPythonPackages ? (_: [])
/* the function you would have passed to python.withPackages */
@ -162,22 +154,25 @@ let
, extraName ? ""
}:
let
/* for compatibility with passing extraPythonPackages as a list; added 2018-07-11 */
compatFun = funOrList: (if builtins.isList funOrList then
(_: lib.warn "passing a list as extraPythonPackages to the neovim wrapper is deprecated, pass a function as to python.withPackages instead" funOrList)
else funOrList);
# we convert from the old configure.format to
plugins = if builtins.hasAttr "plug" configure then
throw "The neovim legacy wrapper doesn't support configure.plug anymore, please setup your plugins via 'configure.packages' instead"
else
lib.flatten (lib.mapAttrsToList genPlugin (configure.packages or {}));
genPlugin = packageName: {start ? [], opt?[]}:
start ++ opt;
res = makeNeovimConfig {
inherit withPython3;
extraPython3Packages = compatFun extraPython3Packages;
inherit extraPython3Packages;
inherit extraLuaPackages;
inherit withNodeJs withRuby viAlias vimAlias;
inherit configure;
customRC = configure.customRC or "";
inherit plugins;
inherit extraName;
};
in
assert withPython -> throw "Python2 support has been removed from neovim, please remove withPython and extraPythonPackages.";
wrapNeovimUnstable neovim (res // {
wrapperArgs = lib.escapeShellArgs res.wrapperArgs + " " + extraMakeWrapperArgs;
wrapRc = (configure != {});

View file

@ -3,7 +3,6 @@
, runCommand, makeWrapper
, nix-prefetch-hg, nix-prefetch-git
, fetchFromGitHub, runtimeShell
, hasLuaModule
, python3
, callPackage, makeSetupHook
}:
@ -52,8 +51,6 @@ this to your .vimrc should make most plugins work:
set rtp+=~/.nix-profile/share/vim-plugins/youcompleteme
" or for p in ["youcompleteme"] | exec 'set rtp+=~/.nix-profile/share/vim-plugins/'.p | endfor
which is what the [VAM]/pathogen solutions above basically do.
Learn about about plugin Vim plugin mm managers at
http://vim-wiki.mawercer.de/wiki/topic/vim%20plugin%20managment.html.
@ -168,16 +165,13 @@ let
rtpPath = ".";
# Generates a packpath folder as expected by vim
/* Generates a packpath folder as expected by vim
Example:
packDir (myVimPackage.{ start = [ vimPlugins.vim-fugitive ]; opt = [] })
=> "/nix/store/xxxxx-pack-dir"
*/
packDir = packages:
let
# dir is "start" or "opt"
linkLuaPlugin = plugin: packageName: dir: ''
mkdir -p $out/pack/${packageName}/${dir}/${plugin.pname}/lua
ln -sf ${plugin}/share/lua/5.1/* $out/pack/${packageName}/${dir}/${plugin.pname}/lua
ln -sf ${plugin}/${plugin.pname}-${plugin.version}-rocks/${plugin.pname}/${plugin.version}/* $out/pack/${packageName}/${dir}/${plugin.pname}/
'';
linkVimlPlugin = plugin: packageName: dir: ''
mkdir -p $out/pack/${packageName}/${dir}
if test -e "$out/pack/${packageName}/${dir}/${lib.getName plugin}"; then
@ -242,8 +236,8 @@ let
*/
vimrcContent = {
packages ? null,
vam ? null,
pathogen ? null,
vam ? null, # deprecated
pathogen ? null, # deprecated
plug ? null,
beforePlugins ? ''
" configuration generated by NIX
@ -253,19 +247,6 @@ let
}:
let
/* pathogen mostly can set &rtp at startup time. Deprecated.
*/
pathogenImpl = let
knownPlugins = pathogen.knownPlugins or vimPlugins;
plugins = findDependenciesRecursively (map (pluginToDrv knownPlugins) pathogen.pluginNames);
pathogenPackages.pathogen = {
start = plugins;
};
in
nativeImpl pathogenPackages;
/* vim-plug is an extremely popular vim plugin manager.
*/
plugImpl =
@ -278,23 +259,7 @@ let
call plug#end()
'';
/*
vim-addon-manager = VAM
* maps names to plugin location
* manipulates &rtp at startup time
or when Vim has been running for a while
* can activate plugins laziy (eg when loading a specific filetype)
* knows about vim plugin dependencies (addon-info.json files)
* still is minimalistic (only loads one file), the "check out" code it also
has only gets loaded when a plugin is requested which is not found on disk
yet
*/
# vim-addon-manager = VAM (deprecated)
vamImpl =
let
knownPlugins = vam.knownPlugins or vimPlugins;
@ -314,7 +279,7 @@ let
]
++ lib.optional (vam != null) (lib.warn "'vam' attribute is deprecated. Use 'packages' instead in your vim configuration" vamImpl)
++ lib.optional (packages != null && packages != []) (nativeImpl packages)
++ lib.optional (pathogen != null) (lib.warn "'pathogen' attribute is deprecated. Use 'packages' instead in your vim configuration" pathogenImpl)
++ lib.optional (pathogen != null) (throw "pathogen is now unsupported, replace `pathogen = {}` with `packages.home = { start = []; }`")
++ lib.optional (plug != null) plugImpl
++ [ customRC ];
@ -444,27 +409,20 @@ rec {
# used to figure out which python dependencies etc. neovim needs
requiredPlugins = {
packages ? {},
givenKnownPlugins ? null,
vam ? null,
pathogen ? null,
plug ? null, ...
}:
let
# This is probably overcomplicated, but I don't understand this well enough to know what's necessary.
knownPlugins = if givenKnownPlugins != null then givenKnownPlugins else
if vam != null && vam ? knownPlugins then vam.knownPlugins else
if pathogen != null && pathogen ? knownPlugins then pathogen.knownPlugins else
vimPlugins;
pathogenPlugins = findDependenciesRecursively (map (pluginToDrv knownPlugins) pathogen.pluginNames);
vamPlugins = findDependenciesRecursively (map (pluginToDrv knownPlugins) (lib.concatMap vamDictToNames vam.pluginDictionaries));
nonNativePlugins = (lib.optionals (pathogen != null) pathogenPlugins)
++ (lib.optionals (vam != null) vamPlugins)
++ (lib.optionals (plug != null) plug.plugins);
nativePluginsConfigs = lib.attrsets.attrValues packages;
nativePlugins = lib.concatMap ({start?[], opt?[], knownPlugins?vimPlugins}: start++opt) nativePluginsConfigs;
nonNativePlugins = (lib.optionals (plug != null) plug.plugins);
nativePlugins = lib.concatMap (requiredPluginsForPackage) nativePluginsConfigs;
in
nativePlugins ++ nonNativePlugins;
# figures out which python dependencies etc. is needed for one vim package
requiredPluginsForPackage = { start ? [], opt ? []}:
start ++ opt;
toVimPlugin = drv:
drv.overrideAttrs(oldAttrs: {
# dont move the "doc" folder since vim expects it

View file

@ -35789,9 +35789,7 @@ with pkgs;
viewnior = callPackage ../applications/graphics/viewnior { };
vimUtils = callPackage ../applications/editors/vim/plugins/vim-utils.nix {
inherit (lua51Packages) hasLuaModule;
};
vimUtils = callPackage ../applications/editors/vim/plugins/vim-utils.nix { };
vimPlugins = recurseIntoAttrs (callPackage ../applications/editors/vim/plugins {
llvmPackages = llvmPackages_6;