From 75b585be2dfdfbfe1c4ee65efbe731283fb09e99 Mon Sep 17 00:00:00 2001 From: alfarel Date: Sun, 17 May 2026 21:45:30 -0400 Subject: [PATCH 1/2] languages/pug: init --- configuration.nix | 1 + ...don-t-touch-git-state-while-building.patch | 25 +++++ .../by-name/prettier-plugin-pug/package.nix | 60 ++++++++++ modules/plugins/languages/default.nix | 1 + modules/plugins/languages/pug.nix | 105 ++++++++++++++++++ npins/sources.json | 16 +++ 6 files changed, 208 insertions(+) create mode 100644 flake/pkgs/by-name/prettier-plugin-pug/0001-fix-don-t-touch-git-state-while-building.patch create mode 100644 flake/pkgs/by-name/prettier-plugin-pug/package.nix create mode 100644 modules/plugins/languages/pug.nix diff --git a/configuration.nix b/configuration.nix index 962383cd..532d932e 100644 --- a/configuration.nix +++ b/configuration.nix @@ -116,6 +116,7 @@ isMaximal: { jq.enable = false; fish.enable = false; standard-ml.enable = false; + pug.enable = false; # Nim LSP is broken on Darwin and therefore # should be disabled by default. Users may still enable diff --git a/flake/pkgs/by-name/prettier-plugin-pug/0001-fix-don-t-touch-git-state-while-building.patch b/flake/pkgs/by-name/prettier-plugin-pug/0001-fix-don-t-touch-git-state-while-building.patch new file mode 100644 index 00000000..8b48bf9c --- /dev/null +++ b/flake/pkgs/by-name/prettier-plugin-pug/0001-fix-don-t-touch-git-state-while-building.patch @@ -0,0 +1,25 @@ +From 85c43d3f45b6a5d301b66fe52c0c92b16ddfbc95 Mon Sep 17 00:00:00 2001 +From: alfarel +Date: Sun, 17 May 2026 22:42:21 -0400 +Subject: [PATCH] fix: don't touch git state while building + +--- + package.json | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/package.json b/package.json +index 9151c4f..5508237 100644 +--- a/package.json ++++ b/package.json +@@ -6,7 +6,7 @@ + "clean": "git clean -fdx", + "build:clean": "git clean -fdx dist", + "build:code": "tsup-node", +- "build": "run-s build:clean build:code", ++ "build": "run-s build:code", + "docs:build": "vitepress build docs", + "docs:dev": "vitepress dev docs", + "docs:serve": "vitepress serve docs --port 5173", +-- +2.53.0 + diff --git a/flake/pkgs/by-name/prettier-plugin-pug/package.nix b/flake/pkgs/by-name/prettier-plugin-pug/package.nix new file mode 100644 index 00000000..62f0f33e --- /dev/null +++ b/flake/pkgs/by-name/prettier-plugin-pug/package.nix @@ -0,0 +1,60 @@ +{ + stdenv, + nodejs, + gitMinimal, + pnpm_9, + pnpmConfigHook, + fetchPnpmDeps, + pins, + fetchFromGitHub, + writableTmpDirAsHomeHook, +}: let + pin = pins.prettier-plugin-pug; +in + stdenv.mkDerivation (finalAttrs: { + pname = "prettier-plugin-pug"; + version = pin.version or pin.revision; + + patches = [ + ./0001-fix-don-t-touch-git-state-while-building.patch + ]; + + src = fetchFromGitHub { + inherit (pin.repository) owner repo; + rev = finalAttrs.version; + sha256 = pin.hash; + }; + + pnpmDeps = fetchPnpmDeps { + pnpm = pnpm_9; + inherit (finalAttrs) pname src; + fetcherVersion = 2; + hash = "sha256-4IS2dvcODzeakx8ezIQkoz6PLEP8Sm4OFz0EWQ0jXoA="; + }; + + nativeBuildInputs = [ + nodejs + gitMinimal + writableTmpDirAsHomeHook + (pnpmConfigHook.overrideAttrs { + propagatedBuildInputs = [pnpm_9]; + }) + ]; + + buildPhase = '' + runHook preBuild + + pnpm run build + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + cp -r dist/ $out + cp -r node_modules $out + + runHook postInstall + ''; + }) diff --git a/modules/plugins/languages/default.nix b/modules/plugins/languages/default.nix index 896e18c3..aa178df6 100644 --- a/modules/plugins/languages/default.nix +++ b/modules/plugins/languages/default.nix @@ -42,6 +42,7 @@ in { ./nix.nix ./ocaml.nix ./php.nix + ./pug.nix ./python.nix ./qml.nix ./r.nix diff --git a/modules/plugins/languages/pug.nix b/modules/plugins/languages/pug.nix new file mode 100644 index 00000000..e0c1e092 --- /dev/null +++ b/modules/plugins/languages/pug.nix @@ -0,0 +1,105 @@ +{ + config, + pkgs, + lib, + inputs, + ... +}: let + inherit (lib.attrsets) attrNames genAttrs; + inherit (lib.options) mkOption mkEnableOption literalExpression; + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.types) enum listOf; + inherit (lib.nvim.attrsets) mapListToAttrs; + inherit (lib.nvim.types) mkGrammarOption; + + cfg = config.vim.languages.pug; + + defaultServers = ["emmet-ls"]; + servers = ["emmet-ls"]; + + defaultFormat = ["prettier"]; + formats = { + prettier = { + command = getExe pkgs.prettier; + options.ft_parsers.pug = "pug"; + prepend_args = let + parser = "${inputs.self.packages.${pkgs.stdenv.hostPlatform.system}.prettier-plugin-pug}/index.js"; + in ["--plugin=${parser}"]; + }; + }; +in { + options.vim.languages.pug = { + enable = mkEnableOption "Pug language support"; + + treesitter = { + enable = + mkEnableOption "Pug treesitter" + // { + default = config.vim.languages.enableTreesitter; + defaultText = literalExpression "config.vim.languages.enableTreesitter"; + }; + package = mkGrammarOption pkgs "pug"; + }; + + lsp = { + enable = + mkEnableOption "Pug LSP support" + // { + default = config.vim.lsp.enable; + defaultText = literalExpression "config.vim.lsp.enable"; + }; + servers = mkOption { + type = listOf (enum servers); + default = defaultServers; + description = "Pug LSP server to use"; + }; + }; + + format = { + enable = + mkEnableOption "Pug formatting" + // { + default = config.vim.languages.enableFormat; + defaultText = literalExpression "config.vim.languages.enableFormat"; + }; + + type = mkOption { + type = listOf (enum (attrNames formats)); + default = defaultFormat; + description = "Pug formatter to use"; + }; + }; + }; + + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.treesitter.enable { + vim.treesitter = { + enable = true; + grammars = [cfg.treesitter.package]; + }; + }) + + (mkIf cfg.lsp.enable { + vim.lsp = { + presets = genAttrs cfg.lsp.servers (_: {enable = true;}); + servers = genAttrs cfg.lsp.servers (_: {filetypes = ["pug"];}); + }; + }) + + (mkIf cfg.format.enable { + vim.formatter.conform-nvim = { + enable = true; + setupOpts = { + formatters_by_ft.pug = cfg.format.type; + formatters = + mapListToAttrs (name: { + inherit name; + value = formats.${name}; + }) + cfg.format.type; + }; + }; + }) + ]); +} diff --git a/npins/sources.json b/npins/sources.json index e84eee1f..f526937d 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -2395,6 +2395,22 @@ "url": "https://api.github.com/repos/withastro/prettier-plugin-astro/tarball/refs/tags/v0.14.1", "hash": "sha256-XGPz4D2UKOonet0tX3up5mCxw3/69XYPScxb9l7nzpE=" }, + "prettier-plugin-pug": { + "type": "GitRelease", + "repository": { + "type": "GitHub", + "owner": "prettier", + "repo": "plugin-pug" + }, + "pre_releases": false, + "version_upper_bound": null, + "release_prefix": null, + "submodules": false, + "version": "3.4.2", + "revision": "33c86341f0addf48b09968f2545efcf18331d046", + "url": "https://api.github.com/repos/prettier/plugin-pug/tarball/refs/tags/3.4.2", + "hash": "sha256-4CsKMj8Xnq+dlGzLAG2hV8jTCMYBYhaV/uoKAfztSGs=" + }, "prettier-plugin-svelte": { "type": "GitRelease", "repository": { From f57851d453afd642106f385fb5cec2649a14dde8 Mon Sep 17 00:00:00 2001 From: alfarel Date: Sun, 17 May 2026 21:55:14 -0400 Subject: [PATCH 2/2] docs: add pug language module to release notes --- docs/manual/release-notes/rl-0.9.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index a1c95e9f..b4cf5da4 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -259,6 +259,9 @@ - Allow disabling nvf's vendored keymaps by toggling `vendoredKeymaps.enable`. +- Add {option}`vim.languages.pug.enable`, which adds the treesitter grammar and + enables `emmet-ls` for pug files. + [pyrox0](https://github.com/pyrox0): - Added [rumdl](https://github.com/rvben/rumdl) support to `languages.markdown`