{ config, ... }: { home-manager.users.jade = { pkgs, pkgs-stable, ... }: { home = { sessionVariables.EDITOR = "hx"; packages = [ pkgs.wl-clipboard-rs pkgs.nil pkgs.vscode-langservers-extracted pkgs.nodePackages.typescript-language-server pkgs.emmet-language-server pkgs.jdt-language-server pkgs.tinymist pkgs.typstyle ]; }; programs.helix = { enable = true; defaultEditor = true; settings = { theme = "gruvbox_dark_hard"; editor = { line-number = "relative"; bufferline = "multiple"; color-modes = true; cursorline = true; auto-save = { after-delay.enable = true; after-delay.timeout = 10000; }; auto-format = true; end-of-line-diagnostics = "hint"; # slightly optimized based on my layout jump-label-alphabet = "jfkdhaslgwenuiopbcmyzqrtvx"; clipboard-provider = "wayland"; inline-diagnostics = { cursor-line = "hint"; }; lsp = { display-messages = true; display-inlay-hints = true; }; popup-border = "popup"; shell = [ "nu" "-c" ]; statusline.left = [ "mode" "spinner" "spacer" "version-control" "file-name" "diagnostics" "read-only-indicator" "file-modification-indicator" "spacer" ]; statusline.right = [ "workspace-diagnostics" "register" "position" "selections" "file-encoding" "file-type" ]; idle-timeout = 50; completion-timeout = 100; indent-guides = { render = true; character = "│"; skip-levels = 3; }; soft-wrap = { enable = true; }; whitespace = { render = { space = "none"; tab = "all"; newline = "none"; }; characters = { nbsp = "·"; tab = "→"; }; }; }; keys = { normal = { space."=" = ":fmt"; space.space = "@[]"; # smart tab++ tab = "move_parent_node_end"; S-tab = "move_parent_node_start"; A-S = "@S[\\s]+"; "'" = { D = "@sgd"; F = "@sgy"; d = "@vgd"; f = "@vgy"; h = ":toggle-option lsp.display-inlay-hints"; t = ":pipe flip-bool"; }; }; insert = { up = "no_op"; down = "no_op"; left = "no_op"; right = "no_op"; pageup = "no_op"; pagedown = "no_op"; home = "no_op"; end = "no_op"; # smart tab ++ S-tab = "move_parent_node_start"; }; select = { # smart tab++ tab = "extend_parent_node_end"; S-tab = "extend_parent_node_start"; }; }; }; languages = { language-server = { "nu-builtin-lsp" = { command = "${config.users.defaultUserShell}/bin/nu"; args = [ "--lsp" ]; }; "rust-analyzer" = { config = { check.command = "check"; completion.snippets.custom = { "pub fn" = { prefix = [ "pfn" "pubfn" ]; postfix = [ "pfn" ]; body = [ "pub fn $\{receiver\}() {" "\\t$1" "}" ]; scope = "type"; }; }; completion.termSearch.enable = true; diagnostics.enable = true; inlayHints = { bindingModeHints.enable = true; closureCaptureHints.enable = true; closureReturnTypeHints.enable = true; discriminantHints.enable = true; expressionAdjustmentHints = { hideOutsideUnsafe = true; }; lifetimeElisionHints.enable = "skip_trivial"; }; interpret.tests = true; lens = { references = { adt.enable = true; trait.enable = true; }; }; typing.autoClosingAngleBrackets.enable = true; }; }; "emmet-language-server" = { command = "emmet-language-server"; args = [ "--stdio" ]; }; "psalm" = { command = "psalm"; args = [ "--language-server" ]; }; "tinymist" = { config = { exportPdf = "onType"; formatterMode = "typstyle"; }; }; }; language = [ { name = "nu"; language-servers = [ "nu-builtin-lsp" ]; } { name = "php"; language-servers = [ "psalm" ]; } { name = "nix"; formatter = { command = "${pkgs.nixfmt-rfc-style}/bin/nixfmt"; args = [ "--quiet" ]; }; auto-format = true; } { name = "html"; roots = [ ".git" ]; language-servers = [ "vscode-html-language-server" "emmet-language-server" ]; auto-format = false; } ]; }; }; }; }