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}