1{
2 lib,
3 config,
4 ...
5}: let
6 editorCfg = config.mySnippets.editor;
7
8 mkZedFormatter = fmtName:
9 if fmtName == null
10 then "language_server"
11 else let
12 f = editorCfg.formatters.${fmtName};
13 in
14 if f.type == "external"
15 then {
16 external = {
17 command = f.command;
18 arguments = f.args or [];
19 };
20 }
21 else if f.type == "lsp"
22 then {language_server = {name = fmtName;};}
23 else null;
24
25 mkZedLanguage = name: lang:
26 lib.filterAttrs (_: v: v != null) {
27 formatter = mkZedFormatter lang.formatter;
28 language_servers = lang.language-servers ++ lang.zed-only-language-servers;
29 code_actions_on_format = lang.code-actions-on-format;
30 };
31
32 mkZedLsp = name: srv:
33 lib.filterAttrs (_: v: v != null) {
34 binary = lib.filterAttrs (_: v: v != null) {
35 path = srv.command;
36 arguments = srv.args or null;
37 };
38 settings = srv.config or null;
39 };
40in {
41 options.myHome.programs.zed-editor.enable = lib.mkEnableOption "zed editor";
42
43 config = lib.mkIf config.myHome.programs.zed-editor.enable {
44 programs.zed-editor = {
45 enable = true;
46 extensions = [
47 "env"
48 "fish"
49 "git-firefly"
50 "github-theme"
51 "html"
52 "lua"
53 "nix"
54 "scss"
55 "toml"
56 "biome"
57 #"superhtml"
58 "marksman"
59 "makefile"
60 "zig"
61 "gleam"
62 "glsl"
63 "gdscript"
64 "svelte"
65 "vue"
66 "basher"
67 "sql"
68 #"ruby"
69 #"elixir"
70 ];
71 userSettings = {
72 auto_indent_on_paste = true;
73 auto_update = false;
74 buffer_font_size = 14;
75 ui_font_size = 14;
76 buffer_font_family = "JetBrainsMono Nerd Font";
77 use_on_type_format = true;
78 wrap_guides = [100];
79 minimap.show = "auto";
80 preferred_line_length = 100;
81 soft_wrap = "preferred_line_length";
82
83 tab_size = 2;
84 format_on_save = "on";
85 prettier = {
86 allowed = false;
87 };
88
89 agent = {
90 default_model = {
91 provider = "google";
92 model = "gemini-2.5-pro";
93 };
94 inline_assistant_model = {
95 provider = "google";
96 model = "gemini-2.5-pro";
97 };
98 default_profile = "ask";
99 };
100
101 telemetry = {
102 diagnostics = false;
103 metrics = false;
104 };
105
106 languages = lib.listToAttrs (
107 lib.attrValues (
108 lib.mapAttrs (name: lang: {
109 name = lang.full-name;
110 value = mkZedLanguage name lang;
111 })
112 editorCfg.languages
113 )
114 );
115 lsp = lib.mapAttrs mkZedLsp editorCfg.languageServers;
116 };
117 userTasks = [
118 {
119 label = "jjui";
120 command = "jjui";
121 hide = "on_success";
122 use_new_terminal = true;
123 allow_concurrent_runs = false;
124 shell = {
125 program = "fish";
126 };
127 }
128 ];
129 userKeymaps = [
130 {
131 context = "(vim_mode == helix_normal || vim_mode == helix_select) && !menu";
132 bindings = {
133 n = "vim::WrappingLeft";
134 e = "vim::Down";
135 i = "vim::Up";
136 o = "vim::WrappingRight";
137 };
138 }
139 {
140 context = "vim_mode == helix_normal && !menu";
141 bindings = {
142 j = "vim::NextWordEnd";
143 J = ["vim::NextWordEnd" {ignore_punctuation = true;}];
144 k = "vim::MoveToNextMatch";
145 K = "vim::MoveToPreviousMatch";
146 l = "vim::HelixInsert";
147 L = "vim::InsertFirstNonWhitespace";
148 h = "vim::InsertLineBelow";
149 H = "vim::InsertLineAbove";
150 };
151 }
152 {
153 context = "Workspace";
154 bindings = {
155 ctrl-g = [
156 "task::Spawn"
157 {
158 task_name = "jjui";
159 reveal_target = "center";
160 }
161 ];
162 };
163 }
164 ];
165 };
166 };
167}