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