yep, more dotfiles
1{ self 2, config 3, pkgs 4, lpkgs 5, lib 6, ... 7}: 8 9let 10 inherit (self) homeManagerModules; 11 inherit (config.age) secrets; 12 13 flags = config.local.flags; 14 cfg = config.local.fragment.helix; 15in 16{ 17 imports = [ homeManagerModules.wakatime ]; 18 19 options.local.fragment.helix.enable = lib.mkEnableOption '' 20 Helix editor related 21 22 Depends on: 23 - `agenix` fragment: WakaTime key 24 ''; 25 26 config = lib.mkIf cfg.enable { 27 assertions = [ 28 { assertion = config.local.fragment.agenix.enable; message = "`helix` fragment depends on `agenix` fragment"; } 29 ]; 30 31 programs.helix = { 32 enable = true; 33 package = if flags.onlyCached then pkgs.helix else lpkgs.helix; 34 defaultEditor = true; 35 36 settings = { 37 theme = "monokai_pro_octagon"; 38 39 editor = { 40 auto-format = true; 41 auto-info = false; 42 auto-save = true; 43 44 bufferline = "multiple"; # Show open buffers as tabs 45 line-number = "relative"; 46 47 mouse = false; 48 49 end-of-line-diagnostics = "hint"; 50 inline-diagnostics = { 51 cursor-line = "error"; 52 other-lines = "error"; 53 }; 54 55 indent-guides = { 56 render = true; 57 characters = ""; 58 }; 59 60 file-picker.hidden = false; 61 62 lsp.display-inlay-hints = false; 63 64 rulers = [ 80 ]; 65 text-width = 80; 66 soft-wrap.wrap-at-text-width = true; 67 }; 68 69 keys = { 70 normal = { 71 "space" = { 72 # Swap original keybinds, default (lowercase) searches in `pwd` 73 f = "file_picker_in_current_directory"; 74 F = "file_picker"; 75 }; 76 77 # Toggle inlay hints 78 "A-u" = ":toggle lsp.display-inlay-hints"; 79 # Toogle wrapping 80 # TODO: change to `soft-wrap.enable` when supported by `:toggle` 81 "A-w" = ":toggle soft-wrap.wrap-at-text-width"; 82 }; 83 insert = { 84 up = "no_op"; 85 down = "no_op"; 86 left = "no_op"; 87 right = "no_op"; 88 }; 89 }; 90 }; 91 92 extraPackages = with pkgs; [ 93 ansible-language-server 94 clang-tools 95 gopls 96 kotlin-language-server 97 ltex-ls 98 marksman 99 nil 100 nodePackages.bash-language-server 101 nodePackages.typescript-language-server 102 taplo 103 typos-lsp 104 vscode-langservers-extracted 105 yaml-language-server 106 ] ++ lib.optionals (!flags.onlyCached) [ 107 lpkgs.wakatime-ls 108 ]; 109 110 languages = { 111 language-server = { 112 rust-analyzer.config = { check.command = "clippy"; }; 113 114 ltex-ls.command = "ltex-ls"; 115 typos-ls.command = "typos-lsp"; 116 wakatime-ls.command = "wakatime-ls"; 117 }; 118 119 language = 120 let 121 global-lsps = [ "wakatime-ls" "typos-ls" ]; 122 mk-lang = name: language-servers: extra: { inherit name; language-servers = language-servers ++ global-lsps; } // extra; 123 in 124 [ 125 (mk-lang "c" [ "clangd" ] { 126 formatter = { command = lib.getExe' pkgs.clang-tools "clang-format"; args = [ ]; }; 127 }) 128 (mk-lang "markdown" [ "marksman" ] { 129 soft-wrap.enable = true; 130 }) 131 132 (mk-lang "html" [ "vscode-html-language-server" ] { }) 133 (mk-lang "nix" [ "nil" ] { }) 134 (mk-lang "ocaml" [ "ocamllsp" ] { }) 135 (mk-lang "python" [ "ruff" "jedi" "pylsp" ] { }) 136 (mk-lang "rust" [ "rust-analyzer" ] { }) 137 (mk-lang "typescript" [ "typescript-language-server" ] { }) 138 (mk-lang "zig" [ "zls" ] { }) 139 ]; 140 }; 141 }; 142 143 programs.wakatime = { 144 enable = true; 145 apiKeyFile = secrets.api-wakatime.path; 146 settings = { 147 exclude_unknown_project = true; 148 }; 149 }; 150 }; 151}