1{
2 config,
3 lib,
4 ...
5}: let
6 editorCfg = config.mySnippets.editor;
7
8 mkHelixServer = name: srv:
9 lib.filterAttrs (_: v: v != null) {
10 inherit name;
11 command =
12 if srv.helix-command != null
13 then srv.helix-command
14 else srv.command;
15 args = srv.args or null;
16 config = srv.config or null;
17 };
18
19 mkHelixLanguage = name: lang: let
20 # this shit is so ugly
21 fmtName = lib.findFirst (x: x != null) null [
22 (lang.helix-formatter or null)
23 (lang.formatter or null)
24 ];
25
26 fmt =
27 if fmtName != null
28 then editorCfg.formatters.${fmtName}
29 else null;
30
31 usesLspFormatter = fmt == null || fmt.type == "lsp";
32
33 formatter =
34 if fmt != null && fmt.type == "external"
35 then
36 lib.filterAttrs (_: v: v != null) {
37 command = fmt.command;
38 args = fmt.args;
39 }
40 else null;
41
42 fullLspList = lang.language-servers ++ lang.helix-only-language-servers;
43
44 languageServers = map (srvName:
45 lib.filterAttrs (_: v: v != null) {
46 name = srvName;
47 except-features =
48 if (usesLspFormatter && fmtName != null && srvName != fmtName)
49 then ["format"]
50 else null;
51 })
52 fullLspList;
53 in
54 lib.filterAttrs (_: v: v != null) {
55 name = lang.name;
56 auto-format = lang.auto-format;
57 language-servers = languageServers;
58 file-types = lang.file-types;
59 inherit formatter;
60 };
61in {
62 options.myHome.programs.helix.enable = lib.mkEnableOption "helix";
63
64 config = lib.mkIf config.myHome.programs.helix.enable {
65 programs.helix = {
66 enable = true;
67
68 settings = {
69 theme = "zed_onedark";
70
71 editor = {
72 auto-completion = true;
73 auto-format = true;
74 auto-pairs = false;
75 auto-save = true;
76 color-modes = true;
77 cursorline = true;
78
79 cursor-shape = {
80 insert = "bar";
81 normal = "block";
82 select = "underline";
83 };
84
85 indent-guides.render = true;
86
87 lsp = {
88 display-inlay-hints = true;
89 display-messages = true;
90 };
91
92 soft-wrap = {
93 enable = true;
94 wrap-at-text-width = true;
95 };
96
97 statusline.center = ["position-percentage"];
98 text-width = 100;
99 true-color = true;
100
101 whitespace.characters = {
102 newline = "↴";
103 tab = "⇥";
104 };
105 };
106
107 keys = {
108 normal = {
109 n = "move_char_left";
110 e = "move_line_down";
111 i = "move_line_up";
112 o = "move_char_right";
113
114 j = "move_next_word_end";
115 J = "move_next_long_word_end";
116 k = "search_next";
117 K = "search_prev";
118 l = "insert_mode";
119 L = "insert_at_line_start";
120
121 h = "open_below";
122 H = "open_above";
123 };
124 select = {
125 n = "extend_char_left";
126 e = "extend_visual_line_down";
127 i = "extend_visual_line_up";
128 o = "extend_char_right";
129 };
130 };
131 };
132
133 languages = {
134 language-server = lib.mapAttrs mkHelixServer editorCfg.languageServers;
135 language = lib.attrValues (lib.mapAttrs mkHelixLanguage editorCfg.languages);
136 };
137 };
138 };
139}