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}