Merge pull request #164994 from ncfavier/vim-wrapper

vim wrapper improvements
This commit is contained in:
7c6f434c 2022-03-29 09:50:44 +00:00 committed by GitHub
commit cd8d955620
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 143 additions and 94 deletions

View File

@ -18,7 +18,7 @@ Adding custom .vimrc lines can be done using the following code:
```nix
vim_configurable.customize {
# `name` specifies the name of the executable and package
# `name` optionally specifies the name of the executable and package
name = "vim-with-plugins";
vimrcConfig.customRC = ''
@ -28,6 +28,9 @@ vim_configurable.customize {
```
This configuration is used when Vim is invoked with the command specified as name, in this case `vim-with-plugins`.
You can also omit `name` to customize Vim itself. See the
[definition of `vimUtils.makeCustomizable`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/vim-utils.nix#L408)
for all supported options.
For Neovim the `configure` argument can be overridden to achieve the same:

View File

@ -838,6 +838,54 @@
LGPL3+ and BSD3 with optional unfree unRAR licensed code
</para>
</listitem>
<listitem>
<para>
The <literal>vim.customize</literal> function produced by
<literal>vimUtils.makeCustomizable</literal> now has a
slightly different interface:
</para>
<itemizedlist spacing="compact">
<listitem>
<para>
The wrapper now includes everything in the given Vim
derivation if <literal>name</literal> is
<literal>&quot;vim&quot;</literal> (the default). This
makes the <literal>wrapManual</literal> argument obsolete,
but this behavior can be overriden by setting the
<literal>standalone</literal> argument.
</para>
</listitem>
<listitem>
<para>
All the executables present in the given derivation (or,
in <literal>standalone</literal> mode, only the
<literal>*vim</literal> ones) are wrapped. This makes the
<literal>wrapGui</literal> argument obsolete.
</para>
</listitem>
<listitem>
<para>
The <literal>vimExecutableName</literal> and
<literal>gvimExecutableName</literal> arguments were
replaced by a single <literal>executableName</literal>
argument in which the shell variable
<literal>$exe</literal> can be used to refer to the
wrapped executables name.
</para>
</listitem>
</itemizedlist>
<para>
See the comments in
<literal>pkgs/applications/editors/vim/plugins/vim-utils.nix</literal>
for more details.
</para>
<para>
<literal>vimUtils.vimWithRC</literal> was removed. You should
instead use <literal>customize</literal> on a Vim derivation,
which now accepts <literal>vimrcFile</literal> and
<literal>gvimrcFile</literal> arguments.
</para>
</listitem>
<listitem>
<para>
<literal>tilp2</literal> was removed together with its module

View File

@ -327,6 +327,15 @@ In addition to numerous new and upgraded packages, this release has the followin
- `pkgs._7zz` is now correctly licensed as LGPL3+ and BSD3 with optional unfree unRAR licensed code
- The `vim.customize` function produced by `vimUtils.makeCustomizable` now has a slightly different interface:
* The wrapper now includes everything in the given Vim derivation if `name` is `"vim"` (the default). This makes the `wrapManual` argument obsolete, but this behavior can be overriden by setting the `standalone` argument.
* All the executables present in the given derivation (or, in `standalone` mode, only the `*vim` ones) are wrapped. This makes the `wrapGui` argument obsolete.
* The `vimExecutableName` and `gvimExecutableName` arguments were replaced by a single `executableName` argument in which the shell variable `$exe` can be used to refer to the wrapped executable's name.
See the comments in `pkgs/applications/editors/vim/plugins/vim-utils.nix` for more details.
`vimUtils.vimWithRC` was removed. You should instead use `customize` on a Vim derivation, which now accepts `vimrcFile` and `gvimrcFile` arguments.
- `tilp2` was removed together with its module
- The F-PROT antivirus (`fprot` package) and its service module were removed because it

View File

@ -3,7 +3,7 @@
, libX11, libXext, libSM, libXpm, libXt, libXaw, libXau, libXmu
, libICE
, vimPlugins
, makeWrapper
, makeWrapper, makeBinaryWrapper
, wrapGAppsHook
, runtimeShell
@ -25,7 +25,6 @@
, ximSupport ? config.vim.xim or true # less than 15KB, needed for deadkeys
, darwinSupport ? config.vim.darwin or false # Enable Darwin support
, ftNixSupport ? config.vim.ftNix or true # Add .nix filetype detection and minimal syntax highlighting support
, ...
}:
@ -134,7 +133,9 @@ in stdenv.mkDerivation rec {
++ lib.optional wrapPythonDrv makeWrapper
++ lib.optional nlsSupport gettext
++ lib.optional perlSupport perl
++ lib.optional (guiSupport == "gtk3") wrapGAppsHook
# Make the inner wrapper binary to avoid double wrapping issues with wrapPythonDrv
# (https://github.com/NixOS/nixpkgs/pull/164163)
++ lib.optional (guiSupport == "gtk3") (wrapGAppsHook.override { makeWrapper = makeBinaryWrapper; })
;
buildInputs = [
@ -174,40 +175,12 @@ in stdenv.mkDerivation rec {
postInstall = ''
ln -s $out/bin/vim $out/bin/vi
'' + lib.optionalString stdenv.isLinux ''
patchelf --set-rpath \
"$(patchelf --print-rpath $out/bin/vim):${lib.makeLibraryPath buildInputs}" \
"$out"/bin/vim
if [[ -e "$out"/bin/gvim ]]; then
patchelf --set-rpath \
"$(patchelf --print-rpath $out/bin/vim):${lib.makeLibraryPath buildInputs}" \
"$out"/bin/gvim
fi
ln -sfn '${nixosRuntimepath}' "$out"/share/vim/vimrc
'' + lib.optionalString wrapPythonDrv ''
'';
postFixup = lib.optionalString wrapPythonDrv ''
wrapProgram "$out/bin/vim" --prefix PATH : "${python3}/bin" \
--set NIX_PYTHONPATH "${python3}/${python3.sitePackages}"
'' + lib.optionalString (guiSupport == "gtk3") ''
rewrap () {
rm -f "$out/bin/$1"
echo -e '#!${runtimeShell}\n"'"$out/bin/vim"'" '"$2"' "$@"' > "$out/bin/$1"
chmod a+x "$out/bin/$1"
}
rewrap ex -e
rewrap view -R
rewrap gvim -g
rewrap gex -eg
rewrap gview -Rg
rewrap rvim -Z
rewrap rview -RZ
rewrap rgvim -gZ
rewrap rgview -RgZ
rewrap evim -y
rewrap eview -yR
rewrap vimdiff -d
rewrap gvimdiff -gd
'';
dontStrip = true;

View File

@ -1,5 +1,6 @@
# tests available at pkgs/test/vim
{ lib, stdenv, vim, vimPlugins, vim_configurable, buildEnv, writeText, writeScriptBin
{ lib, stdenv, vim, vimPlugins, vim_configurable, buildEnv, writeText
, runCommand, makeWrapper
, nix-prefetch-hg, nix-prefetch-git
, fetchFromGitHub, runtimeShell
, hasLuaModule
@ -16,7 +17,7 @@ Install Vim like this eg using nixos option environment.systemPackages which wil
vim-with-plugins in PATH:
vim_configurable.customize {
name = "vim-with-plugins";
name = "vim-with-plugins"; # optional
# add custom .vimrc lines like this:
vimrcConfig.customRC = ''
@ -404,64 +405,81 @@ rec {
inherit vimrcContent;
inherit packDir;
# shell script with custom name passing [-u vimrc] [-U gvimrc] to vim
vimWithRC = {
vimExecutable,
gvimExecutable,
vimManPages,
wrapManual,
wrapGui,
name ? "vim",
vimrcFile ? null,
gvimrcFile ? null,
vimExecutableName,
gvimExecutableName,
}:
let
rcOption = o: file: lib.optionalString (file != null) "-${o} ${file}";
vimWrapperScript = writeScriptBin vimExecutableName ''
#!${runtimeShell}
exec ${vimExecutable} ${rcOption "u" vimrcFile} ${rcOption "U" gvimrcFile} "$@"
'';
gvimWrapperScript = writeScriptBin gvimExecutableName ''
#!${stdenv.shell}
exec ${gvimExecutable} ${rcOption "u" vimrcFile} ${rcOption "U" gvimrcFile} "$@"
'';
in
buildEnv {
inherit name;
paths = [
vimWrapperScript
] ++ lib.optional wrapGui gvimWrapperScript
++ lib.optional wrapManual vimManPages
;
};
makeCustomizable = let
mkVimrcFile = vimrcFile; # avoid conflict with argument name
in vim: vim // {
# Returns a customized vim that uses the specified vimrc configuration.
customize =
{ # The name of the derivation.
name ? "vim"
, # A shell word used to specify the names of the customized executables.
# The shell variable $exe can be used to refer to the wrapped executable's name.
# Examples: "my-$exe", "$exe-with-plugins", "\${exe/vim/v1m}"
executableName ?
if lib.hasInfix "vim" name then
lib.replaceStrings [ "vim" ] [ "$exe" ] name
else
"\${exe/vim/${lib.escapeShellArg name}}"
, # A custom vimrc configuration, treated as an argument to vimrcContent (see the documentation in this file).
vimrcConfig ? null
, # A custom vimrc file.
vimrcFile ? null
, # A custom gvimrc file.
gvimrcFile ? null
, # If set to true, return the *vim wrappers only.
# If set to false, overlay the wrappers on top of the original vim derivation.
# This ensures that things like man pages and .desktop files are available.
standalone ? name != "vim" && wrapManual != true
# add a customize option to a vim derivation
makeCustomizable = vim: vim // {
customize = {
name,
vimrcConfig,
wrapManual ? true,
wrapGui ? false,
vimExecutableName ? name,
gvimExecutableName ? (lib.concatStrings [ "g" name ]),
}: vimWithRC {
vimExecutable = "${vim}/bin/vim";
gvimExecutable = "${vim}/bin/gvim";
inherit name wrapManual wrapGui vimExecutableName gvimExecutableName;
vimrcFile = vimrcFile vimrcConfig;
vimManPages = buildEnv {
name = "vim-doc";
paths = [ vim ];
pathsToLink = [ "/share/man" ];
};
};
, # deprecated arguments (TODO: remove eventually)
wrapManual ? null, wrapGui ? null, vimExecutableName ? null, gvimExecutableName ? null,
}:
lib.warnIf (wrapManual != null) ''
vim.customize: wrapManual is deprecated: the manual is now included by default if `name == "vim"`.
${if wrapManual == true && name != "vim" then "Set `standalone = false` to include the manual."
else if wrapManual == false && name == "vim" then "Set `standalone = true` to get the *vim wrappers only."
else ""}''
lib.warnIf (wrapGui != null)
"vim.customize: wrapGui is deprecated: gvim is now automatically included if present"
lib.throwIfNot (vimExecutableName == null && gvimExecutableName == null)
"vim.customize: (g)vimExecutableName is deprecated: use executableName instead (see source code for examples)"
(let
vimrc =
if vimrcFile != null then vimrcFile
else if vimrcConfig != null then mkVimrcFile vimrcConfig
else throw "at least one of vimrcConfig and vimrcFile must be specified";
bin = runCommand "${name}-bin" { buildInputs = [ makeWrapper ]; } ''
vimrc=${lib.escapeShellArg vimrc}
gvimrc=${if gvimrcFile != null then lib.escapeShellArg gvimrcFile else ""}
mkdir -p "$out/bin"
for exe in ${
if standalone then "{,g,r,rg,e}vim {,g}vimdiff"
else "{,g,r,rg,e}{vim,view} {,g}vimdiff ex"
}; do
if [[ -e ${vim}/bin/$exe ]]; then
dest="$out/bin/${executableName}"
if [[ -e $dest ]]; then
echo "ambiguous executableName: ''${dest##*/} already exists"
continue
fi
makeWrapper ${vim}/bin/"$exe" "$dest" \
--add-flags "-u ''${vimrc@Q} ''${gvimrc:+-U ''${gvimrc@Q}}"
fi
done
'';
in if standalone then bin else
buildEnv {
inherit name;
paths = [ (lib.lowPrio vim) bin ];
});
override = f: makeCustomizable (vim.override f);
overrideAttrs = f: makeCustomizable (vim.overrideAttrs f);
};
vimWithRC = throw "vimWithRC was removed, please use vim.customize instead";
pluginnames2Nix = {name, namefiles} : vim_configurable.customize {
inherit name;
vimrcConfig.vam.knownPlugins = vimPlugins;

View File

@ -24800,7 +24800,7 @@ with pkgs;
assign-lb-ip = callPackage ../applications/networking/cluster/assign-lb-ip { };
astroid = callPackage ../applications/networking/mailreaders/astroid {
vim = vim_configurable.override { features = "normal"; gui = "auto"; };
vim = vim_configurable.override { features = "normal"; };
};
aucatctl = callPackage ../applications/audio/aucatctl { };
@ -29797,9 +29797,9 @@ with pkgs;
veusz = libsForQt5.callPackage ../applications/graphics/veusz { };
vim = callPackage ../applications/editors/vim {
vim = vimUtils.makeCustomizable (callPackage ../applications/editors/vim {
inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
};
});
vimiv = callPackage ../applications/graphics/vimiv { };
@ -29812,8 +29812,6 @@ with pkgs;
vim_configurable = vimUtils.makeCustomizable (callPackage ../applications/editors/vim/configurable.nix {
inherit (darwin.apple_sdk.frameworks) CoreServices Cocoa Foundation CoreData;
inherit (darwin) libobjc;
gtk2 = if stdenv.isDarwin then gtk2-x11 else gtk2;
gtk3 = if stdenv.isDarwin then gtk3-x11 else gtk3;
});
vim-darwin = (vim_configurable.override {