{ pkgs, unstablePkgs, 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; package = unstablePkgs.zed-editor; 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 = true; # necessary for extension auto-install features = { edit_prediction_provider = "copilot"; }; # 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; }; }; userKeymaps = [ { context = "Pane"; bindings = { # easy jump list (i find both vscode + vim jump list keybinds hard) "alt-left" = "pane::GoBack"; "alt-right" = "pane::GoForward"; }; } { context = "Workspace"; bindings = { # rebind from ctrl-j so the shortcut doesn't change depending on # if terminal is up or not. "ctrl-`" = "workspace::ToggleBottomDock"; }; } { context = "Editor"; bindings = { "ctrl-alt-f" = "editor::Format"; }; } ]; }; }