diff --git a/flake.nix b/flake.nix index 12c4b9f..c11970d 100644 --- a/flake.nix +++ b/flake.nix @@ -25,7 +25,6 @@ inherit inputs pkgs sources; }) fish - helix kakoune nushell ; diff --git a/hosts/common.nix b/hosts/common.nix index 75fd334..0405615 100644 --- a/hosts/common.nix +++ b/hosts/common.nix @@ -4,14 +4,11 @@ # which should have a small attack surface. { lib, - self, pkgs, - sources, ... }: let inherit (lib.meta) hiPrioSet; - helix = pkgs.callPackage (self + "/packages/helix") { inherit sources; }; in { environment.systemPackages = @@ -46,9 +43,8 @@ in ; } ++ builtins.attrValues (hiPrioSet { - inherit helix; - inherit (pkgs) uutils-coreutils-noprefix; - }); + }) + ++ [ (lib.hiPrio pkgs.uutils-coreutils-noprefix) ]; # helix as the only editor, a reasonable choice. environment.variables.EDITOR = "hx"; } diff --git a/modules/home/dev/helix.hjem.nix b/modules/home/dev/helix.hjem.nix new file mode 100644 index 0000000..e6e26e0 --- /dev/null +++ b/modules/home/dev/helix.hjem.nix @@ -0,0 +1,492 @@ +{ + lib, + pkgs, + sources, + ... +}: +let + inherit (lib.attrsets) mapAttrs' nameValuePair; + + helix = pkgs.helix.overrideAttrs ( + finalAttrs: previousAttrs: { + version = "25.07.2"; + src = pkgs.fetchzip { + url = "https://github.com/bloxx12/helix/releases/download/${finalAttrs.version}/helix-${finalAttrs.version}-source.tar.xz"; + hash = "sha256-ZNsQwFfPXe6oewajx1tl68W60kVo7q2SuvTgy/o1HKk="; + stripRoot = false; + }; + + doInstallCheck = false; + + cargoDeps = pkgs.rustPlatform.fetchCargoVendor { + inherit (helix) src; + hash = "sha256-3poZSvIrkx8lguxxDeNfngW6+4hH8TV/LHcZx5W5aXg="; + }; + } + ); + + helix-with-plugins = pkgs.helix.overrideAttrs ( + finalAttrs: previousAttrs: { + name = "helix-with-plugins"; + version = "25.07.2"; + src = pkgs.fetchzip { + url = "https://github.com/bloxx12/helix/releases/download/${finalAttrs.version}/helix-${finalAttrs.version}-source.tar.xz"; + hash = "sha256-ZNsQwFfPXe6oewajx1tl68W60kVo7q2SuvTgy/o1HKk="; + stripRoot = false; + }; + + doInstallCheck = false; + + cargoDeps = pkgs.rustPlatform.fetchCargoVendor { + inherit (helix) src; + hash = "sha256-3poZSvIrkx8lguxxDeNfngW6+4hH8TV/LHcZx5W5aXg="; + }; + postInstall = '' + mv $out/bin/hx $out/bin/hxp + ''; + } + ); + + toml = pkgs.formats.toml { }; + + languages = + let + inherit (lib.meta) getExe getExe'; + + nixfmt = pkgs.callPackage "${sources.nixfmt}/default.nix" { }; + + nil = pkgs.rustPlatform.buildRustPackage { + pname = "nil"; + version = "unstable"; + src = sources.nil; + cargoLock = { + lockFile = "${sources.nil}/Cargo.lock"; + allowBuiltinFetchGit = false; + }; + nativeBuildInputs = [ pkgs.nixVersions.latest ]; + + doInstallCheck = false; + meta.mainProgram = "nil"; + }; + + new-deadnix = pkgs.deadnix.overrideAttrs ( + finalAttrs: previousAttrs: { + version = "unstable-15-07-2025"; + src = pkgs.fetchFromGitHub { + owner = "astro"; + repo = "deadnix"; + rev = "d75457b95d7cfa82fcd60970939f76fccfce19e5"; + hash = "sha256-O/z2neAXL8JNkGosvxC+DyZnnJ8zYP9XHApxHVmlzfY="; + }; + + doInstallCheck = false; + + cargoDeps = pkgs.rustPlatform.fetchCargoVendor { + inherit (new-deadnix) src; + hash = "sha256-O8yhqyPflOvQXAA19k1XpbrHysgV5VNWLBX0l5Q5GkM="; + }; + meta.mainProgram = "nil"; + } + ); + in + { + language = + let + mark = lang: { + command = getExe pkgs.deno; + args = [ + "fmt" + "-" + "--ext" + lang + ]; + }; + in + [ + { + name = "bash"; + auto-format = true; + formatter = { + command = getExe pkgs.shfmt; + args = [ + "-i" + "2" + ]; + }; + } + { + name = "clojure"; + injection-regex = "(clojure|clj|edn|boot|yuck)"; + file-types = [ + "clj" + "cljs" + "cljc" + "clje" + "cljr" + "cljx" + "edn" + "boot" + "yuck" + ]; + } + { + name = "cmake"; + auto-format = true; + language-servers = [ "cmake-language-server" ]; + formatter = { + command = getExe pkgs.cmake-format; + args = [ "-" ]; + }; + } + { + name = "javascript"; + auto-format = true; + language-servers = [ + "dprint" + "typescript-language-server" + ]; + } + { + name = "json"; + formatter = mark "json"; + } + { + name = "markdown"; + auto-format = true; + formatter = mark "md"; + language-servers = [ "taplo" ]; + } + { + name = "nix"; + language-servers = [ "nil" ]; + } + { + name = "qml"; + language-servers = [ "qmlls" ]; + } + { + name = "python"; + auto-format = true; + language-servers = [ + "basedpyright" + "ruff" + ]; + } + { + name = "typescript"; + auto-format = true; + language-servers = [ + "dprint" + "typescript-language-server" + ]; + } + { + name = "rust"; + } + { + name = "c"; + auto-format = true; + language-servers = [ "clangd" ]; + } + { + name = "zig"; + auto-format = true; + } + { + name = "c"; + } + ]; + + language-server = { + bash-language-server = { + command = getExe pkgs.bash-language-server; + args = [ "start" ]; + }; + + rust-analyzer = { + command = getExe pkgs.rust-analyzer; + config.rust-analyzer = { + checkOnSave.command = "clippy"; + procMacro.enable = true; + cargo = { + loadOutDirsFromCheck = true; + features = "all"; + }; + assist = { + preferSelf = true; + }; + check = { + command = "clippy"; + extraArgs = [ + "--" + "-W" + "clippy::pedantic" + "-W" + "clippy::nursery" + "-W" + "clippy::perf" + ]; + }; + lens = { + references = true; + methodReferences = true; + }; + completion.autoimport.enable = true; + experimental.procAttrMacros = true; + interpret.tests = true; + }; + }; + + clangd = { + command = "${pkgs.clang-tools}/bin/clangd"; + clangd.fallbackFlags = [ "-std=c++2b" ]; + }; + + cmake-language-server = { + command = getExe pkgs.cmake-language-server; + }; + + deno-lsp = { + command = getExe pkgs.deno; + args = [ "lsp" ]; + environment.NO_COLOR = "1"; + config.deno = { + enable = true; + lint = true; + unstable = true; + suggest = { + completeFunctionCalls = false; + imports = { + hosts."https://deno.land" = true; + }; + }; + inlayHints = { + enumMemberValues.enabled = true; + functionLikeReturnTypes.enabled = true; + parameterNames.enabled = "all"; + parameterTypes.enabled = true; + propertyDeclarationTypes.enabled = true; + variableTypes.enabled = true; + }; + }; + }; + dprint = { + command = getExe pkgs.dprint; + args = [ "lsp" ]; + }; + + nil = { + command = getExe nil; + config.nil = { + formatting.command = [ "${getExe nixfmt}" ]; + diagnostics = { + bindingEndHintMinLines = 3; + }; + nix.flake = { + autoArchive = true; + # autoEvalInputs = true; + nixpkgsInputName = "nixpkgs"; + }; + }; + }; + deadnix = { + command = getExe new-deadnix; + }; + + typescript-language-server = { + command = getExe pkgs.typescript-language-server; + args = [ "--stdio" ]; + config = { + typescript-language-server.source = { + addMissingImports.ts = true; + fixAll.ts = true; + organizeImports.ts = true; + removeUnusedImports.ts = true; + sortImports.ts = true; + }; + }; + }; + ruff = { + command = getExe pkgs.ruff; + args = [ "server" ]; + }; + + qmlls = { + command = getExe' pkgs.kdePackages.qtdeclarative "qmlls"; + args = [ "-E" ]; + }; + basedpyright.command = "${pkgs.basedpyright}/bin/basedpyright-langserver"; + + vscode-css-language-server = { + command = "${pkgs.vscode-langservers-extracted}/bin/vscode-css-language-server"; + args = [ "--stdio" ]; + config = { + provideFormatter = true; + css.validate.enable = true; + scss.validate.enable = true; + }; + }; + zls = { + command = getExe pkgs.zls; + config = { + enable_build_on_save = true; + build_on_save_args = [ + "check" + "-fincremental" + "--watch" + ]; + enable_autofix = false; + warn_style = true; + highlight_global_var_declarations = true; + }; + }; + }; + }; + + themes = { + rose_pine_transparent = { + inherits = "rose_pine"; + "ui.background" = { }; + }; + rose_pine_dawn_transparent = { + inherits = "rose_pine_dawn"; + "ui.background" = { }; + }; + nightfox_transparent = { + inherits = "nightfox"; + "ui.background" = { }; + }; + nord_transparent = { + inherits = "nord"; + "ui.background" = { }; + }; + }; + + settings = { + theme = "nord"; + editor = { + cursorline = true; + color-modes = true; + true-color = true; + indent-guides.render = true; + lsp = { + enable = true; + auto-signature-help = true; + display-inlay-hints = false; + display-messages = true; + snippets = true; + }; + file-picker = { + hidden = true; + }; + line-number = "relative"; + auto-format = true; + completion-timeout = 5; + mouse = true; + bufferline = "multiple"; + soft-wrap.enable = true; + word-completion = { + enable = true; + trigger-length = 2; + }; + cursor-shape = { + insert = "bar"; + normal = "block"; + select = "underline"; + }; + statusline = { + left = [ + "spinner" + "version-control" + "diagnostics" + "file-name" + ]; + right = [ + "file-base-name" + "file-type" + "position" + "file-encoding" + ]; + }; + gutters.layout = [ + "diff" + "diagnostics" + "line-numbers" + "spacer" + ]; + inline-diagnostics = { + cursor-line = "hint"; + other-lines = "error"; + }; + }; + keys = { + normal = { + space = { + g = [ + ":new" + ":buffer-close!" + ":redraw" + ]; + i = ":toggle lsp.display-inlay-hints"; + }; + esc = [ + "collapse_selection" + "keep_primary_selection" + "normal_mode" + ]; + A-H = "goto_previous_buffer"; + A-L = "goto_next_buffer"; + A-w = ":buffer-close"; + A-f = ":format"; + A-r = ":reload"; + A-x = "extend_to_line_bounds"; + X = [ + "extend_line_up" + "extend_to_line_bounds" + ]; + ";" = "flip_selections"; + "A-;" = "collapse_selection"; + + # Kakoune-like config + H = "extend_char_left"; + J = "extend_line_down"; + K = "extend_line_up"; + L = "extend_char_right"; + }; + select = { + A-x = "extend_to_line_bounds"; + X = [ + "extend_line_up" + "extend_to_line_bounds" + ]; + g = { + e = "goto_file_end"; + }; + }; + }; + }; +in +{ + packages = builtins.attrValues { + inherit helix; + inherit (pkgs) + tinymist + taplo + kdlfmt + gopls + ; + }; + + files = { + ".config/helix/config.toml".source = toml.generate "helix-config.toml" settings; + ".config/helix/languages.toml".source = toml.generate "helix-languages.toml" languages; + + } + // mapAttrs' ( + name: value: + nameValuePair ".config/helix/themes/${name}.toml" { + source = toml.generate "helix-theme-${name}.toml" value; + } + ) themes; + +} diff --git a/packages/default.nix b/packages/default.nix index c1ab3bb..b3ee780 100644 --- a/packages/default.nix +++ b/packages/default.nix @@ -5,7 +5,6 @@ }: let inherit (pkgs) lib; - helix = pkgs.callPackage ./helix { }; kakoune = pkgs.callPackage ./kakoune.nix { }; fish = pkgs.callPackage ./fish { inherit lib; }; nushell = pkgs.callPackage ./nushell { }; @@ -14,7 +13,6 @@ in inherit kakoune fish - helix nushell ; } diff --git a/packages/helix/colorscheme.nix b/packages/helix/colorscheme.nix deleted file mode 100644 index 4aa1f86..0000000 --- a/packages/helix/colorscheme.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ - inherits = "gruvbox_dark_hard"; - "ui.background" = { }; -} diff --git a/packages/helix/default.nix b/packages/helix/default.nix deleted file mode 100644 index 2409a1c..0000000 --- a/packages/helix/default.nix +++ /dev/null @@ -1,220 +0,0 @@ -{ - sources, - basedpyright, - bash-language-server, - callPackage, - clang-tools, - clippy, - cmake-format, - cmake-language-server, - deadnix, - deno, - dprint, - fetchzip, - formats, - gdb, - golangci-lint-langserver, - gopls, - helix, - kdePackages, - kdlfmt, - lazygit, - lib, - lldb_19, - makeWrapper, - nixd, - ruff, - rust-analyzer, - rustPlatform, - rustfmt, - shellcheck, - shfmt, - simple-completion-language-server, - superhtml, - symlinkJoin, - taplo, - tinymist, - typescript-language-server, - vscode-langservers-extracted, - zls, - ... -}: -let - inherit (lib.meta) getExe; - - custom-helix = helix.overrideAttrs ( - finalAttrs: previousAttrs: { - version = "25.07.2"; - src = fetchzip { - url = "https://github.com/bloxx12/helix/releases/download/${finalAttrs.version}/helix-${finalAttrs.version}-source.tar.xz"; - hash = "sha256-ZNsQwFfPXe6oewajx1tl68W60kVo7q2SuvTgy/o1HKk="; - stripRoot = false; - }; - - doInstallCheck = false; - - cargoDeps = rustPlatform.fetchCargoVendor { - inherit (custom-helix) src; - hash = "sha256-3poZSvIrkx8lguxxDeNfngW6+4hH8TV/LHcZx5W5aXg="; - }; - } - ); - - toml = formats.toml { }; - - helix-languages = callPackage ./languages.nix { inherit lib sources; }; - colorscheme = toml.generate "colorscheme.toml" (import ./colorscheme.nix); - - helix-config = { - theme = "theme_transparent"; - editor = { - cursorline = false; - color-modes = true; - true-color = true; - indent-guides.render = true; - lsp = { - enable = true; - auto-signature-help = true; - display-inlay-hints = false; - display-messages = true; - snippets = true; - }; - file-picker = { - hidden = true; - }; - line-number = "relative"; - auto-format = true; - completion-timeout = 5; - mouse = true; - bufferline = "multiple"; - soft-wrap.enable = true; - word-completion = { - enable = true; - trigger-length = 2; - }; - cursor-shape = { - insert = "bar"; - normal = "block"; - select = "underline"; - }; - statusline = { - left = [ - "spinner" - "version-control" - "diagnostics" - "file-name" - ]; - right = [ - "file-base-name" - "file-type" - "position" - "file-encoding" - ]; - }; - gutters.layout = [ - "diff" - "diagnostics" - "line-numbers" - "spacer" - ]; - inline-diagnostics = { - cursor-line = "hint"; - other-lines = "error"; - }; - }; - keys = { - normal = { - space = { - g = [ - ":new" - ":insert-output XDG_CONFIG_HOME=~/.config ${getExe lazygit}" - ":buffer-close!" - ":redraw" - ]; - i = ":toggle lsp.display-inlay-hints"; - }; - esc = [ - "collapse_selection" - "keep_primary_selection" - "normal_mode" - ]; - A-H = "goto_previous_buffer"; - A-L = "goto_next_buffer"; - A-w = ":buffer-close"; - A-f = ":format"; - A-r = ":reload"; - A-x = "extend_to_line_bounds"; - X = [ - "extend_line_up" - "extend_to_line_bounds" - ]; - ";" = "flip_selections"; - "A-;" = "collapse_selection"; - - # Kakoune-like config - H = "extend_char_left"; - J = "extend_line_down"; - K = "extend_line_up"; - L = "extend_char_right"; - }; - select = { - A-x = "extend_to_line_bounds"; - X = [ - "extend_line_up" - "extend_to_line_bounds" - ]; - g = { - e = "goto_file_end"; - }; - }; - }; - }; - wrapped-helix = symlinkJoin { - name = "helix-wrapped"; - paths = [ - custom-helix - - # Bash - bash-language-server - # C/C++ - clang-tools - clippy - golangci-lint-langserver - gopls - lldb_19 - # Markdown - taplo - - nixd - rust-analyzer - rustfmt - # Shell - shellcheck - - kdlfmt - - superhtml - # toml - taplo - # typst - tinymist - # typst lsp - vscode-langservers-extracted - - kdlfmt - - # zig language server - zls - ]; - nativeBuildInputs = [ makeWrapper ]; - postBuild = '' - mkdir -p $out/config/helix/themes - cp "${toml.generate "config.toml" helix-config}" $out/config/helix/config.toml - cp "${helix-languages}" $out/config/helix/languages.toml - cp "${colorscheme}" $out/config/helix/themes/theme_transparent.toml - wrapProgram $out/bin/hx --set \ - XDG_CONFIG_HOME $out/config - ''; - }; -in -wrapped-helix diff --git a/packages/helix/languages.nix b/packages/helix/languages.nix deleted file mode 100644 index 1340794..0000000 --- a/packages/helix/languages.nix +++ /dev/null @@ -1,339 +0,0 @@ -{ - sources, - basedpyright, - bash-language-server, - callPackage, - clang-tools, - cmake-format, - cmake-language-server, - deadnix, - deno, - dprint, - fetchFromGitHub, - formats, - gdb, - kdePackages, - lib, - ruff, - nixVersions, - rustPlatform, - shfmt, - typescript-language-server, - vscode-langservers-extracted, - zls, - ... -}: -let - inherit (lib.meta) getExe getExe'; - - toml = formats.toml { }; - - nixfmt = callPackage "${sources.nixfmt}/default.nix" { }; - - nil = rustPlatform.buildRustPackage { - pname = "nil"; - version = "unstable"; - src = sources.nil; - cargoLock = { - lockFile = "${sources.nil}/Cargo.lock"; - allowBuiltinFetchGit = false; - }; - nativeBuildInputs = [ nixVersions.latest ]; - - doInstallCheck = false; - }; - - new-deadnix = deadnix.overrideAttrs ( - finalAttrs: previousAttrs: { - version = "unstable-15-07-2025"; - src = fetchFromGitHub { - owner = "astro"; - repo = "deadnix"; - rev = "d75457b95d7cfa82fcd60970939f76fccfce19e5"; - hash = "sha256-O/z2neAXL8JNkGosvxC+DyZnnJ8zYP9XHApxHVmlzfY="; - }; - - doInstallCheck = false; - - cargoDeps = rustPlatform.fetchCargoVendor { - inherit (new-deadnix) src; - hash = "sha256-O8yhqyPflOvQXAA19k1XpbrHysgV5VNWLBX0l5Q5GkM="; - }; - meta.mainProgram = "nil"; - } - ); - helix-languages = { - language = - let - mark = lang: { - command = getExe deno; - args = [ - "fmt" - "-" - "--ext" - lang - ]; - }; - in - [ - { - name = "bash"; - auto-format = true; - formatter = { - command = getExe shfmt; - args = [ - "-i" - "2" - ]; - }; - } - { - name = "clojure"; - injection-regex = "(clojure|clj|edn|boot|yuck)"; - file-types = [ - "clj" - "cljs" - "cljc" - "clje" - "cljr" - "cljx" - "edn" - "boot" - "yuck" - ]; - } - { - name = "cmake"; - auto-format = true; - language-servers = [ "cmake-language-server" ]; - formatter = { - command = getExe cmake-format; - args = [ "-" ]; - }; - } - { - name = "javascript"; - auto-format = true; - language-servers = [ - "dprint" - "typescript-language-server" - ]; - } - { - name = "json"; - formatter = mark "json"; - } - { - name = "markdown"; - auto-format = true; - formatter = mark "md"; - language-servers = [ "taplo" ]; - } - { - name = "nix"; - language-servers = [ "nil" ]; - } - { - name = "qml"; - language-servers = [ "qmlls" ]; - } - { - name = "python"; - auto-format = true; - language-servers = [ - "basedpyright" - "ruff" - ]; - } - { - name = "typescript"; - auto-format = true; - language-servers = [ - "dprint" - "typescript-language-server" - ]; - } - { - name = "rust"; - } - { - name = "c"; - auto-format = true; - language-servers = [ "clangd" ]; - } - { - name = "zig"; - auto-format = true; - } - { - name = "c"; - debugger = { - name = "gdb"; - command = getExe gdb; - transport = "stdio"; - templates = [ - { - name = "binary"; - request = "launch"; - completion = [ - { - name = "binary"; - completion = "filename"; - } - ]; - args = { - program = "{0}"; - runInTerminal = true; - }; - } - ]; - }; - } - ]; - - language-server = { - bash-language-server = { - command = getExe bash-language-server; - args = [ "start" ]; - }; - - rust-analyzer = { - config.rust-analyzer = { - checkOnSave.command = "clippy"; - procMacro.enable = true; - cargo = { - loadOutDirsFromCheck = true; - features = "all"; - }; - assist = { - preferSelf = true; - }; - check = { - command = "clippy"; - extraArgs = [ - "--" - "-W" - "clippy::pedantic" - "-W" - "clippy::nursery" - "-W" - "clippy::perf" - ]; - }; - lens = { - references = true; - methodReferences = true; - }; - completion.autoimport.enable = true; - experimental.procAttrMacros = true; - interpret.tests = true; - }; - }; - - clangd = { - command = "${clang-tools}/bin/clangd"; - clangd.fallbackFlags = [ "-std=c++2b" ]; - }; - - cmake-language-server = { - command = getExe cmake-language-server; - }; - - deno-lsp = { - command = getExe deno; - args = [ "lsp" ]; - environment.NO_COLOR = "1"; - config.deno = { - enable = true; - lint = true; - unstable = true; - suggest = { - completeFunctionCalls = false; - imports = { - hosts."https://deno.land" = true; - }; - }; - inlayHints = { - enumMemberValues.enabled = true; - functionLikeReturnTypes.enabled = true; - parameterNames.enabled = "all"; - parameterTypes.enabled = true; - propertyDeclarationTypes.enabled = true; - variableTypes.enabled = true; - }; - }; - }; - dprint = { - command = getExe dprint; - args = [ "lsp" ]; - }; - - nil = { - command = getExe nil; - config.nil = { - formatting.command = [ "${getExe nixfmt}" ]; - diagnostics = { - bindingEndHintMinLines = 3; - }; - nix.flake = { - autoArchive = true; - # autoEvalInputs = true; - nixpkgsInputName = "nixpkgs"; - }; - }; - }; - deadnix = { - command = getExe new-deadnix; - }; - - typescript-language-server = { - command = getExe typescript-language-server; - args = [ "--stdio" ]; - config = { - typescript-language-server.source = { - addMissingImports.ts = true; - fixAll.ts = true; - organizeImports.ts = true; - removeUnusedImports.ts = true; - sortImports.ts = true; - }; - }; - }; - ruff = { - command = getExe ruff; - args = [ "server" ]; - }; - - qmlls = { - command = getExe' kdePackages.qtdeclarative "qmlls"; - args = [ "-E" ]; - }; - basedpyright.command = "${basedpyright}/bin/basedpyright-langserver"; - - vscode-css-language-server = { - command = "${vscode-langservers-extracted}/bin/vscode-css-language-server"; - args = [ "--stdio" ]; - config = { - provideFormatter = true; - css.validate.enable = true; - scss.validate.enable = true; - }; - }; - zls = { - command = getExe zls; - config = { - enable_build_on_save = true; - build_on_save_args = [ - "check" - "-fincremental" - "--watch" - ]; - enable_autofix = false; - warn_style = true; - highlight_global_var_declarations = true; - }; - }; - }; - }; -in -toml.generate "languages.toml" helix-languages