diff --git a/options/custom/programs/default.nix b/options/custom/programs/default.nix index 86ee3bb..df14138 100644 --- a/options/custom/programs/default.nix +++ b/options/custom/programs/default.nix @@ -85,6 +85,7 @@ with lib; { wireshark.enable = true; #// wofi.enable = true; #// wpaperd.enable = true; + zed.enable = true; }) ]; } diff --git a/options/custom/programs/zed.nix b/options/custom/programs/zed.nix new file mode 100644 index 0000000..76e4d41 --- /dev/null +++ b/options/custom/programs/zed.nix @@ -0,0 +1,269 @@ +{ + config, + lib, + pkgs, + ... +}: +with lib; let + cfg = config.custom.programs.zed; +in { + options.custom.programs.zed = { + enable = mkOption {default = false;}; + }; + + config = mkIf cfg.enable { + home-manager.sharedModules = [ + { + # https://zed.dev/ + # https://github.com/zed-industries/zed + programs.zed-editor = { + enable = true; + + extraPackages = with pkgs; [ + alejandra # nix + nixd # nix + shellcheck # basher + shfmt # basher + ]; + + # https://zed.dev/docs/extensions + # https://github.com/zed-industries/extensions/tree/main/extensions + extensions = [ + "basher" + "git-firefly" + "nix" + ]; + + # https://zed.dev/docs/key-bindings + userKeymaps = [ + { + bindings = { + "escape" = "menu::Cancel"; + "ctrl-," = "zed::OpenSettings"; + "ctrl-o" = "workspace::Open"; + }; + } + { + context = "Editor"; + bindings = { + "alt-enter" = "editor::DuplicateLineDown"; + "backspace" = "editor::Backspace"; + "shift-backspace" = "editor::Backspace"; + "delete" = "editor::Delete"; + "tab" = "editor::Tab"; + "shift-tab" = "editor::TabPrev"; + "ctrl-k" = "editor::CutToEndOfLine"; + "ctrl-k ctrl-q" = "editor::Rewrap"; + "ctrl-k q" = "editor::Rewrap"; + "ctrl-backspace" = "editor::DeleteToPreviousWordStart"; + "ctrl-delete" = "editor::DeleteToNextWordEnd"; + "shift-delete" = "editor::Cut"; + "ctrl-insert" = "editor::Copy"; + "shift-insert" = "editor::Paste"; + "ctrl-y" = "editor::Redo"; + "ctrl-z" = "editor::Undo"; + "ctrl-shift-z" = "editor::Redo"; + "up" = "editor::MoveUp"; + "ctrl-up" = "editor::LineUp"; + "ctrl-down" = "editor::LineDown"; + "pageup" = "editor::MovePageUp"; + "alt-pageup" = "editor::PageUp"; + "shift-pageup" = "editor::SelectPageUp"; + "home" = "editor::MoveToBeginningOfLine"; + "down" = "editor::MoveDown"; + "pagedown" = "editor::MovePageDown"; + "alt-pagedown" = "editor::PageDown"; + "shift-pagedown" = "editor::SelectPageDown"; + "end" = "editor::MoveToEndOfLine"; + "left" = "editor::MoveLeft"; + "right" = "editor::MoveRight"; + "ctrl-left" = "editor::MoveToPreviousWordStart"; + "ctrl-right" = "editor::MoveToNextWordEnd"; + "ctrl-home" = "editor::MoveToBeginning"; + "ctrl-end" = "editor::MoveToEnd"; + "shift-up" = "editor::SelectUp"; + "shift-down" = "editor::SelectDown"; + "shift-left" = "editor::SelectLeft"; + "shift-right" = "editor::SelectRight"; + "ctrl-shift-left" = "editor::SelectToPreviousWordStart"; + "ctrl-shift-right" = "editor::SelectToNextWordEnd"; + "ctrl-shift-home" = "editor::SelectToBeginning"; + "ctrl-shift-end" = "editor::SelectToEnd"; + "ctrl-a" = "editor::SelectAll"; + "ctrl-l" = "editor::SelectLine"; + "ctrl-shift-i" = "editor::Format"; + "ctrl-alt-space" = "editor::ShowCharacterPalette"; + "ctrl-;" = "editor::ToggleLineNumbers"; + "ctrl-k ctrl-r" = "editor::RevertSelectedHunks"; + "ctrl-'" = "editor::ToggleHunkDiff"; + "ctrl-\"" = "editor::ExpandAllHunkDiffs"; + "ctrl-i" = "editor::ShowSignatureHelp"; + "alt-g b" = "editor::ToggleGitBlame"; + "menu" = "editor::OpenContextMenu"; + "shift-f10" = "editor::OpenContextMenu"; + }; + } + ]; + + # https://zed.dev/docs/configuring-zed + userSettings = { + always_treat_brackets_as_autoclosed = true; + + assistant = { + default_model = { + model = "claude-3-5-sonnet-latest"; + provider = "zed.dev"; + }; + + version = 2; + }; + + auto_install_extensions = false; + auto_signature_help = true; + + # BUG: Font variations are not currently supported + # https://github.com/zed-industries/zed/issues/5028 + #// buffer_font_family = "monospace"; + buffer_font_family = "IosevkaTermSlab Nerd Font Propo"; + + buffer_font_size = 18; + buffer_line_height.custom = 1.5; + + collaboration_panel = { + button = false; + dock = "right"; + }; + + cursor_blink = false; + + features = { + inline_completion_provider = "none"; + }; + + indent_guides = { + active_line_width = 2; + }; + + load_direnv = "shell_hook"; + middle_click_paste = false; + + outline_panel = { + dock = "right"; + indent_size = 10; + }; + + preferred_line_length = 120; + + project_panel = { + default_width = 200; + indent_guides.show = "never"; + indent_size = 10; + }; + + seed_search_query_from_cursor = "selection"; + show_user_picture = false; + + # TODO: Show trailing whitespace when supported + # https://github.com/zed-industries/zed/issues/5237 + show_whitespaces = "selection"; + + soft_wrap = "preferred_line_length"; + tab_size = 2; + + tabs = { + file_icons = true; + git_status = true; + show_diagnostics = "all"; + }; + + telemetry = { + metrics = true; + diagnostics = true; + }; + + theme = { + mode = "system"; + light = "Solarized Light"; + dark = "Solarized Dark"; + }; + + ui_font_family = config.custom.settings.fonts.sans-serif; + ui_font_size = 18; + + # Language-specific + # https://zed.dev/docs/configuring-languages + languages = { + Nix = { + formatter.external.command = "alejandra"; + language_servers = ["nixd" "!nil"]; + }; + }; + + # Theme overrides + # https://zed.dev/docs/themes#theme-overrides + # https://zed.dev/docs/extensions/languages#syntax-highlighting + # https://github.com/zed-industries/zed/blob/main/assets/themes/solarized/solarized.json + # https://github.com/zed-industries/zed/issues/20525 + #?? editor: copy highlight json + "experimental.theme_overrides" = { + # https://github.com/zed-industries/zed/issues/4655 + players = [ + { + cursor = "#93a1a1"; + background = "#93a1a1"; + selection = "#93a1a11A"; # 10% + } + ]; + + "scrollbar.thumb.background" = "#073642"; + "scrollbar.thumb.border" = "#00000000"; + + syntax = { + attribute.color = "#93a1a1"; + boolean.color = "#cb4b16"; + comment.color = "#586e75"; + "comment.doc".color = "#586e75"; + constant.color = "#93a1a1"; + constructor.color = "#b58900"; + embedded.color = "#657b83"; + emphasis.color = "#93a1a1"; + "emphasis.strong".color = "#93a1a1"; + enum.color = "#b58900"; + function.color = "#268bd2"; + hint.color = "#657b83"; + keyword.color = "#d33682"; + label.color = "#93a1a1"; + link_text.color = "#93a1a1"; + link_uri.color = "#93a1a1"; + number.color = "#2aa198"; + operator.color = "#657b83"; + predictive.color = "#657b83"; + preproc.color = "#93a1a1"; + primary.color = "#93a1a1"; + property.color = "#93a1a1"; + punctuation.color = "#657b83"; + "punctuation.bracket".color = "#657b83"; + "punctuation.delimiter".color = "#657b83"; + "punctuation.list_marker".color = "#657b83"; + "punctuation.special".color = "#657b83"; + string.color = "#859900"; + "string.escape".color = "#cb4b16"; + "string.regex".color = "#cb4b16"; + "string.special".color = "#cb4b16"; + "string.special.symbol".color = "#cb4b16"; + tag.color = "#93a1a1"; + "tag.doctype".color = "#93a1a1"; + "text.literal".color = "#93a1a1"; + title.color = "#93a1a1"; + type.color = "#b58900"; + variable.color = "#93a1a1"; + "variable.special".color = "#93a1a1"; + variant.color = "#93a1a1"; + }; + }; + }; + }; + } + ]; + }; +}