summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--modules/home/common.nix1
-rw-r--r--modules/home/zed.nix158
2 files changed, 159 insertions, 0 deletions
diff --git a/modules/home/common.nix b/modules/home/common.nix
index bf2d347..e2b57f7 100644
--- a/modules/home/common.nix
+++ b/modules/home/common.nix
@@ -6,6 +6,7 @@
 
     ./shell.nix
     ./code.nix
+    ./zed.nix
   ];
 
   programs = {
diff --git a/modules/home/zed.nix b/modules/home/zed.nix
new file mode 100644
index 0000000..b8f08a5
--- /dev/null
+++ b/modules/home/zed.nix
@@ -0,0 +1,158 @@
+{ pkgs, lib, ... }:
+
+let
+  inherit (pkgs)
+    clang-tools
+    go
+    gopls
+    nixd
+    nil
+    nixfmt-rfc-style
+    rust-analyzer
+    elixir-ls
+    elixir
+    ;
+
+  tool = package: lib.getExe package;
+in
+{
+  programs.zed-editor = {
+    enable = true;
+    extensions = [
+      "nix"
+      "elixir"
+      "hare"
+      "make"
+      "meson"
+
+      "catppuccin"
+    ];
+
+    userSettings = {
+      # i. general behaviour
+
+      autosave = "on_focus_change";
+      format_on_save = "on";
+      base_keymap = "VSCode";
+      vim_mode = true;
+      load_direnv = "shell_hook"; # load direnv through shell
+
+      auto_update = false;
+      auto_install_extensions = { };
+
+      # ii. pretties
+
+      ui_font_size = 16;
+      buffer_font_size = 16;
+      buffer_font_family = "Berkeley Mono";
+      show_whitespaces = "selection";
+      hour_format = "hour24";
+      relative_line_numbers = true;
+
+      theme = {
+        mode = "system";
+        light = "Catppuccin Latte";
+        dark = "Catppuccin Mocha";
+      };
+
+      tabs = {
+        # show both the file type icon and
+        # git status on the current file tab.
+        file_icons = true;
+        git_status = true;
+      };
+
+      # iii. the terminal
+
+      terminal = {
+        alternate_scroll = "off";
+        blinking = "off";
+        copy_on_select = false;
+        dock = "bottom";
+        env = {
+          TERM = "alacritty";
+        };
+        font_family = "Berkeley Mono";
+        font_size = 16;
+        line_height = "comfortable";
+        option_as_meta = false;
+        shell = "system";
+        toolbar = {
+          title = true;
+        };
+        working_directory = "current_project_directory";
+      };
+
+      # iv. all the language support
+
+      languages = {
+        "C" = {
+          language_servers = [ "clangd" ];
+          formatter = "language_server";
+        };
+        "C++" = {
+          language_servers = [ "clangd" ];
+          formatter = "language_server";
+        };
+        "Nix" = {
+          language_servers = [
+            "nixd"
+            "!nil"
+          ];
+          formatter.external = {
+            command = tool nixfmt-rfc-style;
+            arguments = [
+              "--quiet"
+              "--"
+            ];
+          };
+        };
+        "Go" = {
+          language_servers = [ "gopls" ];
+          formatter.external = {
+            command = lib.getExe' go "gofmt";
+            arguments = [ ];
+          };
+        };
+        "Rust" = {
+          language_servers = [ "rust-analyzer" ];
+          formatter = "language_server";
+        };
+        "Elixir" = {
+          language_servers = [
+            "!lexical"
+            "elixir-ls"
+            "!next-ls"
+          ];
+          formatter = {
+            external = {
+              command = lib.getExe' elixir "mix";
+              arguments = [
+                "format"
+                "--stdin-filename"
+                "{buffer_path}"
+                "-"
+              ];
+            };
+          };
+        };
+      };
+
+      lsp = {
+        clangd.binary.path = lib.getExe' clang-tools "clangd";
+        gopls.binary.path = tool gopls;
+        nixd.binary.path = tool nixd;
+        nil.binary.path = tool nil;
+        rust-analyzer.binary.path = tool rust-analyzer;
+        elixir-ls.binary.path = tool elixir-ls;
+      };
+
+      # v. yuck
+
+      telemetry = {
+        diagnostics = false;
+        metrics = false;
+      };
+    };
+  };
+}