forked from aylac.top/nixcfg
this repo has no description
at main 3.4 kB view raw
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}