Unverified Commit bb2a5067 authored by Gaétan Lepage's avatar Gaétan Lepage Committed by GitHub
Browse files

Vim/lua: format (#382446)

parents 4b5dc2b3 1b91c4ae
Loading
Loading
Loading
Loading
+41 −32
Original line number Diff line number Diff line
{ lib
, stdenv
, lua
, toVimPlugin
{
  lib,
  lua,
  toVimPlugin,
}:
let
  # sanitizeDerivationName
@@ -12,14 +12,17 @@ in
# luaPackages
{
  # the lua derivation to convert into a neovim plugin
     luaAttr ? (lua.pkgs.${normalizeName attrs.pname})
    , ...
  luaAttr ? (lua.pkgs.${normalizeName attrs.pname}),
  ...
}@attrs:
let
      originalLuaDrv = if (lib.typeOf luaAttr == "string") then
        lib.warn "luaAttr as string is deprecated since September 2024. Pass a lua derivation directly ( e.g., `buildNeovimPlugin { luaAttr = lua.pkgs.plenary-nvim; }`)" lua.pkgs.${normalizeName luaAttr}
        else luaAttr;

  originalLuaDrv =
    if (lib.typeOf luaAttr == "string") then
      lib.warn
        "luaAttr as string is deprecated since September 2024. Pass a lua derivation directly ( e.g., `buildNeovimPlugin { luaAttr = lua.pkgs.plenary-nvim; }`)"
        lua.pkgs.${normalizeName luaAttr}
    else
      luaAttr;

  luaDrv = originalLuaDrv.overrideAttrs (oa: {
    version = attrs.version or oa.version;
@@ -31,11 +34,17 @@ in
    '';
  });

      finalDrv = toVimPlugin (luaDrv.overrideAttrs(oa: attrs // {
  finalDrv = toVimPlugin (
    luaDrv.overrideAttrs (
      oa:
      attrs
      // {
        nativeBuildInputs = oa.nativeBuildInputs or [ ] ++ [
          lua.pkgs.luarocksMoveDataFolder
        ];
        version = "${originalLuaDrv.version}-unstable-${oa.version}";
        }));
      }
    )
  );
in
finalDrv
+4 −4
Original line number Diff line number Diff line
@@ -171,7 +171,7 @@ let
      withPython3 ? true,
      withNodeJs ? false,
      withRuby ? true,
      # perl is problematic https://github.com/NixOS/nixpkgs/issues/132368
      # Perl is problematic https://github.com/NixOS/nixpkgs/issues/132368
      withPerl ? false,

      # so that we can pass the full neovim config while ignoring it
@@ -272,7 +272,7 @@ let
    ));

  /*
    Fork of vimUtils.packDir that additionnally generates a propagated-build-inputs-file that
    Fork of vimUtils.packDir that additionally generates a propagated-build-inputs-file that
    can be used by the lua hooks to generate a proper LUA_PATH

    Generates a packpath folder as expected by vim
@@ -286,14 +286,14 @@ let
      rawPackDir = vimUtils.packDir packages;

    in
    rawPackDir.override ({
    rawPackDir.override {
      postBuild = ''
        mkdir $out/nix-support
        for i in $(find -L $out -name propagated-build-inputs ); do
          cat "$i" >> $out/nix-support/propagated-build-inputs
        done
      '';
    });
    };

in
{
+366 −294
Original line number Diff line number Diff line
{ stdenv, symlinkJoin, lib, makeWrapper
, bundlerEnv
, ruby
, nodejs
, writeText
, neovim-node-client
, python3
, callPackage
, neovimUtils
, perl
, lndir
, vimUtils
{
  stdenv,
  lib,
  makeWrapper,
  bundlerEnv,
  ruby,
  nodejs,
  writeText,
  neovim-node-client,
  python3,
  callPackage,
  neovimUtils,
  perl,
  lndir,
  vimUtils,
}:

neovim-unwrapped:
@@ -18,56 +21,62 @@ let
  # inherit interpreter from neovim
  lua = neovim-unwrapped.lua;

  wrapper = {
      extraName ? ""
  wrapper =
    {
      extraName ? "",
      # certain plugins need a custom configuration (available in passthru.initLua)
      # to work with nix.
      # if true, the wrapper automatically appends those snippets when necessary
    , autoconfigure ? true
      autoconfigure ? true,

      # append to PATH runtime deps of plugins
    , autowrapRuntimeDeps ? true
      autowrapRuntimeDeps ? true,

      # should contain all args but the binary. Can be either a string or list
    , wrapperArgs ? []
    , withPython2 ? false
    , withPython3 ? true
    /* the function you would have passed to python3.withPackages */
    , extraPython3Packages ? (_: [ ])
      wrapperArgs ? [ ],
      withPython2 ? false,
      withPython3 ? true,
      # the function you would have passed to python3.withPackages
      extraPython3Packages ? (_: [ ]),

    , withNodeJs ? false
    , withPerl ? false
    , withRuby ? true
      withNodeJs ? false,
      withPerl ? false,
      withRuby ? true,

      # wether to create symlinks in $out/bin/vi(m) -> $out/bin/nvim
    , vimAlias ? false
    , viAlias ? false
      vimAlias ? false,
      viAlias ? false,

      # additional argument not generated by makeNeovimConfig
      # it will append "-u <customRc>" to the wrapped arguments
      # set to false if you want to control where to save the generated config
      # (e.g., in ~/.config/init.vim or project/.nvimrc)
    , wrapRc ? true
      wrapRc ? true,
      # vimL code that should be sourced as part of the generated init.lua file
    , neovimRcContent ? null
      neovimRcContent ? null,
      # lua code to put into the generated init.lua file
    , luaRcContent ? ""
      luaRcContent ? "",
      # DEPRECATED: entry to load in packpath
      # use 'plugins' instead
    , packpathDirs ? null # not used anymore
      packpathDirs ? null, # not used anymore

      # a list of neovim plugin derivations, for instance
      #  plugins = [
      # { plugin=far-vim; config = "let g:far#source='rg'"; optional = false; }
      # ]
    , plugins ? []
    , ...
      plugins ? [ ],
      ...
    }@attrs:
  assert withPython2 -> throw "Python2 support has been removed from the neovim wrapper, please remove withPython2 and python2Env.";
    assert
      withPython2
      -> throw "Python2 support has been removed from the neovim wrapper, please remove withPython2 and python2Env.";

  assert packpathDirs != null -> throw "packpathdirs is not used anymore: pass a list of neovim plugin derivations in 'plugins' instead.";
    assert
      packpathDirs != null
      -> throw "packpathdirs is not used anymore: pass a list of neovim plugin derivations in 'plugins' instead.";

  stdenv.mkDerivation (finalAttrs:
    stdenv.mkDerivation (
      finalAttrs:
      let
        pluginsNormalized = neovimUtils.normalizePlugins finalAttrs.plugins;

@@ -81,108 +90,161 @@ let
          '';
        };

    pluginRC = lib.foldl (acc: p: if p.config != null then acc ++ [p.config] else acc) []  pluginsNormalized;
        pluginRC = lib.foldl (
          acc: p: if p.config != null then acc ++ [ p.config ] else acc
        ) [ ] pluginsNormalized;

        # a limited RC script used only to generate the manifest for remote plugins
        manifestRc = "";
        # we call vimrcContent without 'packages' to avoid the init.vim generation
    neovimRcContent' = lib.concatStringsSep "\n" (pluginRC ++ lib.optional (neovimRcContent != null) neovimRcContent);
        neovimRcContent' = lib.concatStringsSep "\n" (
          pluginRC ++ lib.optional (neovimRcContent != null) neovimRcContent
        );

        packpathDirs.myNeovimPackages = myVimPackage;
        finalPackdir = neovimUtils.packDir packpathDirs;

    luaPluginRC = let
      op = acc: normalizedPlugin:
           acc ++ lib.optional (finalAttrs.autoconfigure && normalizedPlugin.plugin.passthru ? initLua) normalizedPlugin.plugin.passthru.initLua;
        luaPluginRC =
          let
            op =
              acc: normalizedPlugin:
              acc
              ++ lib.optional (
                finalAttrs.autoconfigure && normalizedPlugin.plugin.passthru ? initLua
              ) normalizedPlugin.plugin.passthru.initLua;
          in
          lib.foldl' op [ ] pluginsNormalized;

    rcContent = ''
        rcContent =
          ''
            ${luaRcContent}
    '' + lib.optionalString (neovimRcContent' != null) ''
          ''
          + lib.optionalString (neovimRcContent' != null) ''
            vim.cmd.source "${writeText "init.vim" neovimRcContent'}"
    '' +
      lib.concatStringsSep "\n" luaPluginRC
    ;
          ''
          + lib.concatStringsSep "\n" luaPluginRC;

        getDeps = attrname: map (plugin: plugin.${attrname} or (_: [ ]));

        requiredPlugins = vimUtils.requiredPluginsForPackage myVimPackage;
        pluginPython3Packages = getDeps "python3Dependencies" requiredPlugins;

    python3Env = lib.warnIf (attrs ? python3Env) "Pass your python packages via the `extraPython3Packages`, e.g., `extraPython3Packages = ps: [ ps.pandas ]`"
      python3.pkgs.python.withPackages (ps:
      [ ps.pynvim ]
      ++ (extraPython3Packages ps)
      ++ (lib.concatMap (f: f ps) pluginPython3Packages));

        python3Env =
          lib.warnIf (attrs ? python3Env)
            "Pass your python packages via the `extraPython3Packages`, e.g., `extraPython3Packages = ps: [ ps.pandas ]`"
            python3.pkgs.python.withPackages
            (ps: [ ps.pynvim ] ++ (extraPython3Packages ps) ++ (lib.concatMap (f: f ps) pluginPython3Packages));

        wrapperArgsStr = if lib.isString wrapperArgs then wrapperArgs else lib.escapeShellArgs wrapperArgs;

        generatedWrapperArgs =
          [
            # vim accepts a limited number of commands so we join all the provider ones
              "--add-flags" ''--cmd "lua ${providerLuaRc}"''
            "--add-flags"
            ''--cmd "lua ${providerLuaRc}"''
          ]
            ++ lib.optionals (finalAttrs.packpathDirs.myNeovimPackages.start != [] || finalAttrs.packpathDirs.myNeovimPackages.opt != []) [
              "--add-flags" ''--cmd "set packpath^=${finalPackdir}"''
              "--add-flags" ''--cmd "set rtp^=${finalPackdir}"''
          ++
            lib.optionals
              (
                finalAttrs.packpathDirs.myNeovimPackages.start != [ ]
                || finalAttrs.packpathDirs.myNeovimPackages.opt != [ ]
              )
              [
                "--add-flags"
                ''--cmd "set packpath^=${finalPackdir}"''
                "--add-flags"
                ''--cmd "set rtp^=${finalPackdir}"''
              ]
          ++ lib.optionals finalAttrs.withRuby [
              "--set" "GEM_HOME" "${rubyEnv}/${rubyEnv.ruby.gemPath}"
            ] ++ lib.optionals (finalAttrs.runtimeDeps != []) [
              "--suffix" "PATH" ":" (lib.makeBinPath finalAttrs.runtimeDeps)
            "--set"
            "GEM_HOME"
            "${rubyEnv}/${rubyEnv.ruby.gemPath}"
          ]
            ;
          ++ lib.optionals (finalAttrs.runtimeDeps != [ ]) [
            "--suffix"
            "PATH"
            ":"
            (lib.makeBinPath finalAttrs.runtimeDeps)
          ];

        providerLuaRc = neovimUtils.generateProviderRc {
      inherit (finalAttrs) withPython3 withNodeJs withPerl withRuby;
          inherit (finalAttrs)
            withPython3
            withNodeJs
            withPerl
            withRuby
            ;
        };

    # If configure != {}, we can't generate the rplugin.vim file with e.g
        # If `configure` != {}, we can't generate the rplugin.vim file with e.g
        # NVIM_SYSTEM_RPLUGIN_MANIFEST *and* NVIM_RPLUGIN_MANIFEST env vars set in
    # the wrapper. That's why only when configure != {} (tested both here and
    # when postBuild is evaluated), we call makeWrapper once to generate a
        # the wrapper. That's why only when `configure` != {} (tested both here and
        # when `postBuild` is evaluated), we call makeWrapper once to generate a
        # wrapper with most arguments we need, excluding those that cause problems to
        # generate rplugin.vim, but still required for the final wrapper.
        finalMakeWrapperArgs =
      [ "${neovim-unwrapped}/bin/nvim" "${placeholder "out"}/bin/nvim" ]
      ++ [ "--set" "NVIM_SYSTEM_RPLUGIN_MANIFEST" "${placeholder "out"}/rplugin.vim" ]
      ++ lib.optionals finalAttrs.wrapRc [ "--add-flags" "-u ${writeText "init.lua" rcContent}" ]
      ++ finalAttrs.generatedWrapperArgs
      ;
          [
            "${neovim-unwrapped}/bin/nvim"
            "${placeholder "out"}/bin/nvim"
          ]
          ++ [
            "--set"
            "NVIM_SYSTEM_RPLUGIN_MANIFEST"
            "${placeholder "out"}/rplugin.vim"
          ]
          ++ lib.optionals finalAttrs.wrapRc [
            "--add-flags"
            "-u ${writeText "init.lua" rcContent}"
          ]
          ++ finalAttrs.generatedWrapperArgs;

    perlEnv = perl.withPackages (p: [ p.NeovimExt p.Appcpanminus ]);
        perlEnv = perl.withPackages (p: [
          p.NeovimExt
          p.Appcpanminus
        ]);

        pname = "neovim";
        version = lib.getVersion neovim-unwrapped;
  in {
      in
      {
        name = "${pname}-${version}${extraName}";
        inherit pname version;
        inherit plugins;

        __structuredAttrs = true;
        dontUnpack = true;
      inherit viAlias vimAlias withNodeJs withPython3 withPerl withRuby;
      inherit autoconfigure autowrapRuntimeDeps wrapRc providerLuaRc packpathDirs;
        inherit
          viAlias
          vimAlias
          withNodeJs
          withPython3
          withPerl
          withRuby
          ;
        inherit
          autoconfigure
          autowrapRuntimeDeps
          wrapRc
          providerLuaRc
          packpathDirs
          ;
        inherit python3Env rubyEnv;
        inherit wrapperArgs generatedWrapperArgs;


      runtimeDeps = let
        runtimeDeps =
          let
            op = acc: normalizedPlugin: acc ++ normalizedPlugin.plugin.runtimeDeps or [ ];
            runtimeDeps = lib.foldl' op [ ] pluginsNormalized;
          in
          lib.optional finalAttrs.withRuby rubyEnv
          ++ lib.optional finalAttrs.withNodeJs nodejs
          ++ lib.optionals finalAttrs.autowrapRuntimeDeps runtimeDeps
          ;

          ++ lib.optionals finalAttrs.autowrapRuntimeDeps runtimeDeps;

        luaRcContent = rcContent;
        # Remove the symlinks created by symlinkJoin which we need to perform
        # extra actions upon
      postBuild = lib.optionalString stdenv.hostPlatform.isLinux ''
        postBuild =
          lib.optionalString stdenv.hostPlatform.isLinux ''
            rm $out/share/applications/nvim.desktop
            substitute ${neovim-unwrapped}/share/applications/nvim.desktop $out/share/applications/nvim.desktop \
              --replace-warn 'Name=Neovim' 'Name=Neovim wrapper'
@@ -205,10 +267,14 @@ let
          + lib.optionalString finalAttrs.viAlias ''
            ln -s $out/bin/nvim $out/bin/vi
          ''
      + lib.optionalString (manifestRc != null) (let
        manifestWrapperArgs =
          [ "${neovim-unwrapped}/bin/nvim" "${placeholder "out"}/bin/nvim-wrapper" ] ++ finalAttrs.generatedWrapperArgs;
      in ''
          + lib.optionalString (manifestRc != null) (
            let
              manifestWrapperArgs = [
                "${neovim-unwrapped}/bin/nvim"
                "${placeholder "out"}/bin/nvim-wrapper"
              ] ++ finalAttrs.generatedWrapperArgs;
            in
            ''
              echo "Generating remote plugin manifest"
              export NVIM_RPLUGIN_MANIFEST=$out/rplugin.vim
              makeWrapper ${lib.escapeShellArgs manifestWrapperArgs} ${wrapperArgsStr}
@@ -238,7 +304,8 @@ let
                exit 1
              fi
              rm "${placeholder "out"}/bin/nvim-wrapper"
      '')
            ''
          )
          + ''
            rm $out/bin/nvim
            touch $out/rplugin.vim
@@ -266,7 +333,10 @@ let

        preferLocalBuild = true;

    nativeBuildInputs = [ makeWrapper lndir ];
        nativeBuildInputs = [
          makeWrapper
          lndir
        ];

        # A Vim "package", see ':h packages'
        vimPackage = myVimPackage;
@@ -295,13 +365,15 @@ let
            mainProgram
            license
            maintainers
        platforms;
            platforms
            ;

          # To prevent builds on hydra
          hydraPlatforms = [ ];
          # prefer wrapper over the package
          priority = (neovim-unwrapped.meta.priority or lib.meta.defaultPriority) - 1;
        };
  });
      }
    );
in
lib.makeOverridable wrapper
+330 −195

File changed.

Preview size limit exceeded, changes collapsed.