about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/languages-frameworks/vim.section.md11
-rw-r--r--maintainers/scripts/pluginupdate.py40
-rwxr-xr-xmaintainers/scripts/update-luarocks-packages98
-rwxr-xr-xpkgs/applications/editors/vim/plugins/nvim-treesitter/update.py28
-rw-r--r--pkgs/applications/editors/vim/plugins/update-shell.nix16
-rwxr-xr-xpkgs/applications/editors/vim/plugins/update.py89
-rw-r--r--pkgs/applications/editors/vim/plugins/updater.nix47
-rw-r--r--pkgs/top-level/all-packages.nix7
8 files changed, 202 insertions, 134 deletions
diff --git a/doc/languages-frameworks/vim.section.md b/doc/languages-frameworks/vim.section.md
index 5e25c1ed423e1..1f3727f552c80 100644
--- a/doc/languages-frameworks/vim.section.md
+++ b/doc/languages-frameworks/vim.section.md
@@ -212,9 +212,9 @@ Note: this is not possible anymore for Neovim.
 
 ## Adding new plugins to nixpkgs {#adding-new-plugins-to-nixpkgs}
 
-Nix expressions for Vim plugins are stored in [pkgs/applications/editors/vim/plugins](https://github.com/NixOS/nixpkgs/tree/master/pkgs/applications/editors/vim/plugins). For the vast majority of plugins, Nix expressions are automatically generated by running [`./update.py`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/update.py). This creates a [generated.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/generated.nix) file based on the plugins listed in [vim-plugin-names](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/vim-plugin-names).
+Nix expressions for Vim plugins are stored in [pkgs/applications/editors/vim/plugins](https://github.com/NixOS/nixpkgs/tree/master/pkgs/applications/editors/vim/plugins). For the vast majority of plugins, Nix expressions are automatically generated by running [`nix-shell -p vimPluginsUpdater --run vim-plugins-updater`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/updater.nix). This creates a [generated.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/generated.nix) file based on the plugins listed in [vim-plugin-names](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/vim-plugin-names).
 
-After running `./update.py`, if nvim-treesitter received an update, also run [`nvim-treesitter/update.py`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/update.py) to update the tree sitter grammars for `nvim-treesitter`.
+After running the updater, if nvim-treesitter received an update, also run [`nvim-treesitter/update.py`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/update.py) to update the tree sitter grammars for `nvim-treesitter`.
 
 Some plugins require overrides in order to function properly. Overrides are placed in [overrides.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/overrides.nix). Overrides are most often required when a plugin requires some dependencies, or extra steps are required during the build process. For example `deoplete-fish` requires both `deoplete-nvim` and `vim-fish`, and so the following override was added:
 
@@ -241,7 +241,8 @@ GITHUB_API_TOKEN=my_token ./pkgs/applications/editors/vim/plugins/update.py
 Alternatively, set the number of processes to a lower count to avoid rate-limiting.
 
 ```sh
-./pkgs/applications/editors/vim/plugins/update.py --proc 1
+
+nix-shell -p vimPluginsUpdater --run 'vim-plugins-updater --proc 1'
 ```
 
 ## How to maintain an out-of-tree overlay of vim plugins ? {#vim-out-of-tree-overlays}
@@ -250,7 +251,7 @@ You can use the updater script to generate basic packages out of a custom vim
 plugin list:
 
 ```
-pkgs/applications/editors/vim/plugins/update.py -i vim-plugin-names -o generated.nix --no-commit
+nix-shell -p vimPluginsUpdater --run vim-plugins-updater -i vim-plugin-names -o generated.nix --no-commit
 ```
 
 with the contents of `vim-plugin-names` being for example:
@@ -264,7 +265,7 @@ You can then reference the generated vim plugins via:
 
 ```nix
 myVimPlugins = pkgs.vimPlugins.extend (
-  (pkgs.callPackage generated.nix {})
+  (pkgs.callPackage ./generated.nix {})
 );
 ```
 
diff --git a/maintainers/scripts/pluginupdate.py b/maintainers/scripts/pluginupdate.py
index 6a607eb624803..18b354f0be9c6 100644
--- a/maintainers/scripts/pluginupdate.py
+++ b/maintainers/scripts/pluginupdate.py
@@ -321,8 +321,14 @@ def load_plugins_from_csv(
     return plugins
 
 
-def run_nix_expr(expr):
-    with CleanEnvironment() as nix_path:
+
+def run_nix_expr(expr, nixpkgs: str):
+    '''
+    :param expr nix expression to fetch current plugins
+    :param nixpkgs Path towards a nixpkgs checkout
+    '''
+    # local_pkgs = str(Path(__file__).parent.parent.parent)
+    with CleanEnvironment(nixpkgs) as nix_path:
         cmd = [
             "nix",
             "eval",
@@ -396,9 +402,9 @@ class Editor:
         """CSV spec"""
         print("the update member function should be overriden in subclasses")
 
-    def get_current_plugins(self) -> List[Plugin]:
+    def get_current_plugins(self, nixpkgs) -> List[Plugin]:
         """To fill the cache"""
-        data = run_nix_expr(self.get_plugins)
+        data = run_nix_expr(self.get_plugins, nixpkgs)
         plugins = []
         for name, attr in data.items():
             p = Plugin(name, attr["rev"], attr["submodules"], attr["sha256"])
@@ -414,7 +420,7 @@ class Editor:
         raise NotImplementedError()
 
     def get_update(self, input_file: str, outfile: str, config: FetchConfig):
-        cache: Cache = Cache(self.get_current_plugins(), self.cache_file)
+        cache: Cache = Cache(self.get_current_plugins(self.nixpkgs), self.cache_file)
         _prefetch = functools.partial(prefetch, cache=cache)
 
         def update() -> dict:
@@ -454,6 +460,12 @@ class Editor:
             ),
         )
         common.add_argument(
+            "--nixpkgs",
+            type=str,
+            default=os.getcwd(),
+            help="Adjust log level",
+        )
+        common.add_argument(
             "--input-names",
             "-i",
             dest="input_file",
@@ -541,22 +553,27 @@ class Editor:
         command = args.command or "update"
         log.setLevel(LOG_LEVELS[args.debug])
         log.info("Chose to run command: %s", command)
+        self.nixpkgs = args.nixpkgs
 
-        if not args.no_commit:
-            self.nixpkgs_repo = git.Repo(self.root, search_parent_directories=True)
+        self.nixpkgs_repo = git.Repo(args.nixpkgs, search_parent_directories=True)
 
         getattr(self, command)(args)
 
 
 class CleanEnvironment(object):
+    def __init__(self, nixpkgs):
+        self.local_pkgs = nixpkgs
+
     def __enter__(self) -> str:
-        self.old_environ = os.environ.copy()
+        """
         local_pkgs = str(Path(__file__).parent.parent.parent)
+        """
+        self.old_environ = os.environ.copy()
         self.empty_config = NamedTemporaryFile()
         self.empty_config.write(b"{}")
         self.empty_config.flush()
-        os.environ["NIXPKGS_CONFIG"] = self.empty_config.name
-        return f"localpkgs={local_pkgs}"
+        # os.environ["NIXPKGS_CONFIG"] = self.empty_config.name
+        return f"localpkgs={self.local_pkgs}"
 
     def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
         os.environ.update(self.old_environ)
@@ -758,7 +775,8 @@ def commit(repo: git.Repo, message: str, files: List[Path]) -> None:
 
 
 def update_plugins(editor: Editor, args):
-    """The main entry function of this module. All input arguments are grouped in the `Editor`."""
+    """The main entry function of this module.
+    All input arguments are grouped in the `Editor`."""
 
     log.info("Start updating plugins")
     fetch_config = FetchConfig(args.proc, args.github_token)
diff --git a/maintainers/scripts/update-luarocks-packages b/maintainers/scripts/update-luarocks-packages
index 791cd8a1d89d9..32c2b44260b32 100755
--- a/maintainers/scripts/update-luarocks-packages
+++ b/maintainers/scripts/update-luarocks-packages
@@ -2,11 +2,11 @@
 #!nix-shell update-luarocks-shell.nix -i python3
 
 # format:
-# $ nix run nixpkgs.python3Packages.black -c black update.py
+# $ nix run nixpkgs#python3Packages.black -- update.py
 # type-check:
-# $ nix run nixpkgs.python3Packages.mypy -c mypy update.py
+# $ nix run nixpkgs#python3Packages.mypy -- update.py
 # linted:
-# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265,E402 update.py
+# $ nix run nixpkgs#python3Packages.flake8 -- --ignore E501,E265,E402 update.py
 
 import inspect
 import os
@@ -25,14 +25,14 @@ from pathlib import Path
 log = logging.getLogger()
 log.addHandler(logging.StreamHandler())
 
-ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))).parent.parent # type: ignore
+ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))).parent.parent  # type: ignore
 import pluginupdate
 from pluginupdate import update_plugins, FetchConfig, CleanEnvironment
 
-PKG_LIST="maintainers/scripts/luarocks-packages.csv"
-TMP_FILE="$(mktemp)"
-GENERATED_NIXFILE="pkgs/development/lua-modules/generated-packages.nix"
-LUAROCKS_CONFIG="maintainers/scripts/luarocks-config.lua"
+PKG_LIST = "maintainers/scripts/luarocks-packages.csv"
+TMP_FILE = "$(mktemp)"
+GENERATED_NIXFILE = "pkgs/development/lua-modules/generated-packages.nix"
+LUAROCKS_CONFIG = "maintainers/scripts/luarocks-config.lua"
 
 HEADER = """/* {GENERATED_NIXFILE} is an auto-generated file -- DO NOT EDIT!
 Regenerate it with:
@@ -40,36 +40,40 @@ nixpkgs$ ./maintainers/scripts/update-luarocks-packages
 
 You can customize the generated packages in pkgs/development/lua-modules/overrides.nix
 */
-""".format(GENERATED_NIXFILE=GENERATED_NIXFILE)
+""".format(
+    GENERATED_NIXFILE=GENERATED_NIXFILE
+)
 
-FOOTER="""
+FOOTER = """
 }
 /* GENERATED - do not edit this file */
 """
 
+
 @dataclass
 class LuaPlugin:
     name: str
-    '''Name of the plugin, as seen on luarocks.org'''
+    """Name of the plugin, as seen on luarocks.org"""
     src: str
-    '''address to the git repository'''
+    """address to the git repository"""
     ref: Optional[str]
-    '''git reference (branch name/tag)'''
+    """git reference (branch name/tag)"""
     version: Optional[str]
-    '''Set it to pin a package '''
+    """Set it to pin a package """
     server: Optional[str]
-    '''luarocks.org registers packages under different manifests.
+    """luarocks.org registers packages under different manifests.
     Its value can be 'http://luarocks.org/dev'
-    '''
+    """
     luaversion: Optional[str]
-    '''Attribue of the lua interpreter if a package is available only for a specific lua version'''
+    """Attribue of the lua interpreter if a package is available only for a specific lua version"""
     maintainers: Optional[str]
-    ''' Optional string listing maintainers separated by spaces'''
+    """ Optional string listing maintainers separated by spaces"""
 
     @property
     def normalized_name(self) -> str:
         return self.name.replace(".", "-")
 
+
 # rename Editor to LangUpdate/ EcosystemUpdater
 class LuaEditor(pluginupdate.Editor):
     def get_current_plugins(self):
@@ -77,11 +81,13 @@ class LuaEditor(pluginupdate.Editor):
 
     def load_plugin_spec(self, input_file) -> List[LuaPlugin]:
         luaPackages = []
-        csvfilename=input_file
+        csvfilename = input_file
         log.info("Loading package descriptions from %s", csvfilename)
 
-        with open(csvfilename, newline='') as csvfile:
-            reader = csv.DictReader(csvfile,)
+        with open(csvfilename, newline="") as csvfile:
+            reader = csv.DictReader(
+                csvfile,
+            )
             for row in reader:
                 # name,server,version,luaversion,maintainers
                 plugin = LuaPlugin(**row)
@@ -91,23 +97,19 @@ class LuaEditor(pluginupdate.Editor):
     def update(self, args):
         update_plugins(self, args)
 
-    def generate_nix(
-        self,
-        results: List[Tuple[LuaPlugin, str]],
-        outfilename: str
-        ):
-
+    def generate_nix(self, results: List[Tuple[LuaPlugin, str]], outfilename: str):
         with tempfile.NamedTemporaryFile("w+") as f:
             f.write(HEADER)
             header2 = textwrap.dedent(
-            # header2 = inspect.cleandoc(
-            """
+                # header2 = inspect.cleandoc(
+                """
                 { self, stdenv, lib, fetchurl, fetchgit, callPackage, ... } @ args:
                 final: prev:
                 {
-            """)
+            """
+            )
             f.write(header2)
-            for (plugin, nix_expr) in results:
+            for plugin, nix_expr in results:
                 f.write(f"{plugin.normalized_name} = {nix_expr}")
             f.write(FOOTER)
             f.flush()
@@ -156,19 +158,20 @@ class LuaEditor(pluginupdate.Editor):
         #         luaPackages.append(plugin)
         pass
 
+
 def generate_pkg_nix(plug: LuaPlugin):
-    '''
+    """
     Generate nix expression for a luarocks package
     Our cache key associates "p.name-p.version" to its rockspec
-    '''
+    """
     log.debug("Generating nix expression for %s", plug.name)
     custom_env = os.environ.copy()
-    custom_env['LUAROCKS_CONFIG'] = LUAROCKS_CONFIG
+    custom_env["LUAROCKS_CONFIG"] = LUAROCKS_CONFIG
 
     # we add --dev else luarocks wont find all the "scm" (=dev) versions of the
     # packages
-	# , "--dev"
-    cmd = [ "luarocks", "nix" ]
+    # , "--dev"
+    cmd = ["luarocks", "nix"]
 
     if plug.maintainers:
         cmd.append(f"--maintainers={plug.maintainers}")
@@ -176,7 +179,10 @@ def generate_pkg_nix(plug: LuaPlugin):
     # if plug.server == "src":
     if plug.src != "":
         if plug.src is None:
-            msg = "src must be set when 'version' is set to \"src\" for package %s" % plug.name
+            msg = (
+                "src must be set when 'version' is set to \"src\" for package %s"
+                % plug.name
+            )
             log.error(msg)
             raise RuntimeError(msg)
         log.debug("Updating from source %s", plug.src)
@@ -185,7 +191,6 @@ def generate_pkg_nix(plug: LuaPlugin):
     else:
         cmd.append(plug.name)
         if plug.version and plug.version != "src":
-
             cmd.append(plug.version)
 
     if plug.server != "src" and plug.server:
@@ -194,23 +199,26 @@ def generate_pkg_nix(plug: LuaPlugin):
     if plug.luaversion:
         cmd.append(f"--lua-version={plug.luaversion}")
 
-    log.debug("running %s", ' '.join(cmd))
+    log.debug("running %s", " ".join(cmd))
 
     output = subprocess.check_output(cmd, env=custom_env, text=True)
     output = "callPackage(" + output.strip() + ") {};\n\n"
     return (plug, output)
 
-def main():
 
-    editor = LuaEditor("lua", ROOT, '',
-        default_in = ROOT.joinpath(PKG_LIST),
-        default_out = ROOT.joinpath(GENERATED_NIXFILE)
-        )
+def main():
+    editor = LuaEditor(
+        "lua",
+        ROOT,
+        "",
+        default_in=ROOT.joinpath(PKG_LIST),
+        default_out=ROOT.joinpath(GENERATED_NIXFILE),
+    )
 
     editor.run()
 
-if __name__ == "__main__":
 
+if __name__ == "__main__":
     main()
 
 #  vim: set ft=python noet fdm=manual fenc=utf-8 ff=unix sts=0 sw=4 ts=4 :
diff --git a/pkgs/applications/editors/vim/plugins/nvim-treesitter/update.py b/pkgs/applications/editors/vim/plugins/nvim-treesitter/update.py
index bbacc6959c255..37414b073538a 100755
--- a/pkgs/applications/editors/vim/plugins/nvim-treesitter/update.py
+++ b/pkgs/applications/editors/vim/plugins/nvim-treesitter/update.py
@@ -7,8 +7,6 @@ from concurrent.futures import ThreadPoolExecutor
 from os import environ
 from os.path import dirname, join
 
-lockfile = json.load(open(join(environ["NVIM_TREESITTER"], "lockfile.json")))
-
 configs = json.loads(
     subprocess.check_output(
         [
@@ -58,20 +56,26 @@ def generate_grammar(item):
     return generated
 
 
-generated_file = """# generated by pkgs/applications/editors/vim/plugins/nvim-treesitter/update.py
+def update_grammars(lockfile: str):
 
-{ buildGrammar, """
+    generated_file = """# generated by pkgs/applications/editors/vim/plugins/nvim-treesitter/update.py
 
-generated_file += subprocess.check_output(["nurl", "-Ls", ", "], text=True)
+    { buildGrammar, """
 
-generated_file += """ }:
+    generated_file += subprocess.check_output(["nurl", "-Ls", ", "], text=True)
 
-{
-"""
+    generated_file += """ }:
+
+    {
+    """
+    for generated in ThreadPoolExecutor().map(generate_grammar, lockfile.items()):
+        generated_file += generated
+        generated_file += "}\n"
+        generated_file += "}\n"
 
-for generated in ThreadPoolExecutor().map(generate_grammar, lockfile.items()):
-    generated_file += generated
+    open(join(dirname(__file__), "generated.nix"), "w").write(generated_file)
 
-generated_file += "}\n"
 
-open(join(dirname(__file__), "generated.nix"), "w").write(generated_file)
+if __name__ == "__main__":
+    # TODO add lockfile
+    update_grammars()
diff --git a/pkgs/applications/editors/vim/plugins/update-shell.nix b/pkgs/applications/editors/vim/plugins/update-shell.nix
deleted file mode 100644
index eae7db7f53ec0..0000000000000
--- a/pkgs/applications/editors/vim/plugins/update-shell.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{ pkgs ? import ../../../../.. { } }:
-
-# Ideally, pkgs points to default.nix file of Nixpkgs official tree
-with pkgs;
-let
-  pyEnv = python3.withPackages (ps: [ ps.gitpython ]);
-in
-
-mkShell {
-  packages = [
-    bash
-    pyEnv
-    nix
-    nix-prefetch-scripts
-  ];
-}
diff --git a/pkgs/applications/editors/vim/plugins/update.py b/pkgs/applications/editors/vim/plugins/update.py
index 97e0dda3b8dce..9770b27252cd8 100755
--- a/pkgs/applications/editors/vim/plugins/update.py
+++ b/pkgs/applications/editors/vim/plugins/update.py
@@ -1,32 +1,31 @@
-#!/usr/bin/env nix-shell
-#!nix-shell update-shell.nix -i python3
-
+#!/usr/bin/env python
 
+# run with:
+# $ nix run .\#vimPluginsUpdater
 # format:
-# $ nix run nixpkgs.python3Packages.black -c black update.py
+# $ nix run nixpkgs#python3Packages.black -- update.py
 # type-check:
-# $ nix run nixpkgs.python3Packages.mypy -c mypy update.py
+# $ nix run nixpkgs#python3Packages.mypy -- update.py
 # linted:
-# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265,E402 update.py
+# $ nix run nixpkgs#python3Packages.flake8 -- --ignore E501,E265,E402 update.py
 
-# If you see `HTTP Error 429: too many requests` errors while running this script,
-# refer to:
+# If you see `HTTP Error 429: too many requests` errors while running this
+# script, refer to:
 #
 # https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/vim.section.md#updating-plugins-in-nixpkgs-updating-plugins-in-nixpkgs
 #
-# (or the equivalent file /doc/languages-frameworks/vim.section.md from Nixpkgs master tree).
+# (or the equivalent file /doc/languages-frameworks/vim.section.md
+# from Nixpkgs master tree).
 #
 
 import inspect
 import os
-import sys
 import logging
-import subprocess
 import textwrap
+import json
 from typing import List, Tuple
 from pathlib import Path
 
-import git
 
 log = logging.getLogger()
 
@@ -37,34 +36,18 @@ log.addHandler(sh)
 
 # Import plugin update library from maintainers/scripts/pluginupdate.py
 ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))))
-# Ideally, ROOT.(parent^5) points to root of Nixpkgs official tree
-sys.path.insert(
-    0, os.path.join(ROOT.parent.parent.parent.parent.parent, "maintainers", "scripts")
-)
 import pluginupdate
+import importlib
 from pluginupdate import run_nix_expr, PluginDesc
-nvim_treesitter = importlib.import_module("treesitter")
-
+from treesitter import update_grammars
 
-GET_PLUGINS_LUA = """
-with import <localpkgs> {};
-lib.attrNames lua51Packages"""
 
 HEADER = (
     "# GENERATED by ./pkgs/applications/editors/vim/plugins/update.py. Do not edit!"
 )
 
-
-def isNeovimPlugin(plug: pluginupdate.Plugin) -> bool:
-    """
-    Whether it's a neovim-only plugin
-    We can check if it's available in lua packages
-    """
-    global luaPlugins
-    if plug.normalized_name in luaPlugins:
-        log.debug("%s is a neovim plugin", plug)
-        return True
-    return False
+NVIM_TREESITTER_GENERATED_NIX = \
+    "pkgs/applications/editors/vim/plugins/nvim-treesitter/generated.nix"
 
 
 class VimEditor(pluginupdate.Editor):
@@ -75,7 +58,8 @@ class VimEditor(pluginupdate.Editor):
     ):
         sorted_plugins = sorted(plugins, key=lambda v: v[0].name.lower())
         nvim_treesitter_rev = pluginupdate.run_nix_expr(
-            "(import <localpkgs> { }).vimPlugins.nvim-treesitter.src.rev"
+            "(import <localpkgs> { }).vimPlugins.nvim-treesitter.src.rev",
+            self.nixpkgs
         )
 
         with open(outfile, "w+") as f:
@@ -94,16 +78,32 @@ class VimEditor(pluginupdate.Editor):
                 content = self.plugin2nix(pdesc, plugin)
                 f.write(content)
                 if (
-                    plugin.name == "nvim-treesitter"
-                    and plugin.commit != nvim_treesitter_rev
+                    plugin.name == "nvim-treesitter" and plugin.commit != nvim_treesitter_rev
                 ):
                     self.nvim_treesitter_updated = True
             f.write("\n}\n")
         print(f"updated {outfile}")
 
     def plugin2nix(self, pdesc: PluginDesc, plugin: pluginupdate.Plugin) -> str:
+        GET_PLUGINS_LUA = """
+        with import <localpkgs> {};
+        lib.attrNames lua51Packages"""
+        luaPlugins = run_nix_expr(GET_PLUGINS_LUA, self.nixpkgs)
+
         repo = pdesc.repo
-        isNeovim = isNeovimPlugin(plugin)
+
+        def _isNeovimPlugin(plug: pluginupdate.Plugin) -> bool:
+            """
+            Whether it's a neovim-only plugin
+            We can check if it's available in lua packages
+            """
+            # global luaPlugins
+            if plug.normalized_name in luaPlugins:
+                log.debug("%s is a neovim plugin", plug)
+                return True
+            return False
+
+        isNeovim = _isNeovimPlugin(plugin)
 
         content = f"  {plugin.normalized_name} = "
         src_nix = repo.as_nix(plugin)
@@ -129,16 +129,14 @@ class VimEditor(pluginupdate.Editor):
         if self.nvim_treesitter_updated:
             print("updating nvim-treesitter grammars")
             nvim_treesitter_dir = ROOT.joinpath("nvim-treesitter")
-            # subprocess.check_call([nvim_treesitter_dir.joinpath("update.py")])
-            nvim_treesitter.update_grammars()
+            lockfile = json.load(open(args.nixpkgs.join(NVIM_TREESITTER_GENERATED_FILE, "lockfile.json")))
+
+            nvim_treesitter.update_grammars(lockfile)
 
             if self.nixpkgs_repo:
                 index = self.nixpkgs_repo.index
                 for diff in index.diff(None):
-                    if (
-                        diff.a_path
-                        == "pkgs/applications/editors/vim/plugins/nvim-treesitter/generated.nix"
-                    ):
+                    if diff.a_path == NVIM_TREESITTER_GENERATED_NIX:
                         msg = "vimPlugins.nvim-treesitter: update grammars"
                         print(f"committing to nixpkgs: {msg}")
                         index.add([str(nvim_treesitter_dir.joinpath("generated.nix"))])
@@ -148,12 +146,13 @@ class VimEditor(pluginupdate.Editor):
 
 
 def main():
+
     global luaPlugins
-    luaPlugins = run_nix_expr(GET_PLUGINS_LUA)
 
-    with open(f"{ROOT}/get-plugins.nix") as f:
+    log.debug(f"Loading from {ROOT}/../get-plugins.nix")
+    with open(f"{ROOT}/../get-plugins.nix") as f:
         GET_PLUGINS = f.read()
-    editor = VimEditor("vim", ROOT, GET_PLUGINS)
+    editor = VimEditor("vim", Path("pkgs/applications/editors/vim/plugins"), GET_PLUGINS)
     editor.run()
 
 
diff --git a/pkgs/applications/editors/vim/plugins/updater.nix b/pkgs/applications/editors/vim/plugins/updater.nix
new file mode 100644
index 0000000000000..e82650a040f23
--- /dev/null
+++ b/pkgs/applications/editors/vim/plugins/updater.nix
@@ -0,0 +1,47 @@
+{ buildPythonApplication
+, nix
+, makeWrapper
+, python3Packages
+, lib
+
+# optional
+, vimPlugins
+, neovim
+}:
+let
+  my_neovim = neovim.override {
+    configure.packages.all.start = [ vimPlugins.nvim-treesitter ];
+  };
+
+in
+buildPythonApplication {
+  format = "other";
+  pname = "vim-plugins-updater";
+  version = "0.1";
+
+  nativeBuildInputs = [
+    makeWrapper
+    python3Packages.wrapPython
+  ];
+
+  pythonPath = [
+    python3Packages.gitpython
+  ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    mkdir -p $out/bin $out/lib
+    cp ${./update.py} $out/bin/vim-plugins-updater
+    cp ${./get-plugins.nix} $out/get-plugins.nix
+    cp ${./nvim-treesitter/update.py} $out/lib/treesitter.py
+    cp ${../../../../../maintainers/scripts/pluginupdate.py} $out/lib/pluginupdate.py
+
+    # wrap python scripts
+    makeWrapperArgs+=( --prefix PATH : "${lib.makeBinPath [ nix my_neovim ]}" --prefix PYTHONPATH : "$out/lib" )
+    wrapPythonPrograms
+  '';
+
+  meta.mainProgram = "vim-plugins-updater";
+}
+
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 8a6e84c60c5ee..24ffd064ada26 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -126,6 +126,13 @@ with pkgs;
 
   common-updater-scripts = callPackage ../common-updater/scripts.nix { };
 
+  # vimPluginsUpdater = callPackage ../applications/editors/vim/plugins/updater.nix {
+  #   inherit (writers) writePython3Bin;
+  # };
+  vimPluginsUpdater = callPackage ../applications/editors/vim/plugins/updater.nix {
+    inherit (python3Packages) buildPythonApplication ;
+  };
+
   genericUpdater = callPackage ../common-updater/generic-updater.nix { };
 
   _experimental-update-script-combinators = callPackage ../common-updater/combinators.nix { };