From df526cd54f09c10da3a6630ca1547d6edfa4f9f2 Mon Sep 17 00:00:00 2001 From: dichgrem Date: Tue, 4 Nov 2025 22:49:28 +0800 Subject: [PATCH] feat:add_zsh --- dotfiles/.config/nushell/config.nu | 821 ----------------------------- dotfiles/.config/nushell/env.nu | 57 -- home/cli/eza.nix | 5 + home/cli/fzf.nix | 1 + home/cli/nushell.nix | 5 - home/cli/zsh.nix | 85 +++ hosts/dos/default.nix | 2 +- hosts/example/default.nix | 2 +- 8 files changed, 93 insertions(+), 885 deletions(-) delete mode 100644 dotfiles/.config/nushell/config.nu delete mode 100644 dotfiles/.config/nushell/env.nu create mode 100644 home/cli/eza.nix delete mode 100644 home/cli/nushell.nix create mode 100644 home/cli/zsh.nix diff --git a/dotfiles/.config/nushell/config.nu b/dotfiles/.config/nushell/config.nu deleted file mode 100644 index 04df2f9..0000000 --- a/dotfiles/.config/nushell/config.nu +++ /dev/null @@ -1,821 +0,0 @@ - -let dark_theme = { - separator: white - leading_trailing_space_bg: { attr: n } - header: green_bold - bool: light_cyan - int: white - filesize: cyan - duration: white - date: purple - range: white - float: white - string: white - nothing: white - binary: white - cell-path: white - row_index: green_bold - record: white - list: white - block: white - hints: dark_gray - search_result: { bg: red fg: white } - shape_and: purple_bold - shape_binary: purple_bold - shape_block: blue_bold - shape_bool: light_cyan - shape_closure: green_bold - shape_custom: green - shape_datetime: cyan_bold - shape_directory: cyan - shape_external: cyan - shape_externalarg: green_bold - shape_external_resolved: light_yellow_bold - shape_filepath: cyan - shape_flag: blue_bold - shape_float: purple_bold - shape_garbage: { fg: white bg: red attr: b } - shape_glob_interpolation: cyan_bold - shape_globpattern: cyan_bold - shape_int: purple_bold - shape_internalcall: cyan_bold - shape_keyword: cyan_bold - shape_list: cyan_bold - shape_literal: blue - shape_match_pattern: green - shape_matching_brackets: { attr: u } - shape_nothing: light_cyan - shape_operator: yellow - shape_or: purple_bold - shape_pipe: purple_bold - shape_range: yellow_bold - shape_record: cyan_bold - shape_redirection: purple_bold - shape_signature: green_bold - shape_string: green - shape_string_interpolation: cyan_bold - shape_table: blue_bold - shape_variable: purple - shape_vardecl: purple - shape_raw_string: light_purple -} - -let light_theme = { - separator: dark_gray - leading_trailing_space_bg: { attr: n } - header: green_bold - empty: blue - bool: dark_cyan - int: dark_gray - filesize: cyan_bold - duration: dark_gray - date: purple - range: dark_gray - float: dark_gray - string: dark_gray - nothing: dark_gray - binary: dark_gray - cell-path: dark_gray - row_index: green_bold - record: dark_gray - list: dark_gray - block: dark_gray - hints: dark_gray - search_result: { fg: white bg: red } - shape_and: purple_bold - shape_binary: purple_bold - shape_block: blue_bold - shape_bool: light_cyan - shape_closure: green_bold - shape_custom: green - shape_datetime: cyan_bold - shape_directory: cyan - shape_external: cyan - shape_externalarg: green_bold - shape_external_resolved: light_purple_bold - shape_filepath: cyan - shape_flag: blue_bold - shape_float: purple_bold - shape_garbage: { fg: white bg: red attr: b } - shape_glob_interpolation: cyan_bold - shape_globpattern: cyan_bold - shape_int: purple_bold - shape_internalcall: cyan_bold - shape_keyword: cyan_bold - shape_list: cyan_bold - shape_literal: blue - shape_match_pattern: green - shape_matching_brackets: { attr: u } - shape_nothing: light_cyan - shape_operator: yellow - shape_or: purple_bold - shape_pipe: purple_bold - shape_range: yellow_bold - shape_record: cyan_bold - shape_redirection: purple_bold - shape_signature: green_bold - shape_string: green - shape_string_interpolation: cyan_bold - shape_table: blue_bold - shape_variable: purple - shape_vardecl: purple - shape_raw_string: light_purple -} -$env.config = { - show_banner: false - - ls: { - use_ls_colors: true - clickable_links: true - } - - rm: { - always_trash: false - } - - table: { - mode: rounded - index_mode: always - show_empty: true - padding: { left: 1, right: 1 } - trim: { - methodology: wrapping - wrapping_try_keep_words: true - truncating_suffix: "..." - } - header_on_separator: false - } - - error_style: "fancy" - display_errors: { - exit_code: false - termination_signal: true - } - datetime_format: { - } - - explore: { - status_bar_background: { fg: "#1D1F21", bg: "#C4C9C6" }, - command_bar_text: { fg: "#C4C9C6" }, - highlight: { fg: "black", bg: "yellow" }, - status: { - error: { fg: "white", bg: "red" }, - warn: {} - info: {} - }, - selected_cell: { bg: light_blue }, - } - - history: { - max_size: 100_000 - sync_on_enter: true - file_format: "plaintext" - isolation: false - } - - completions: { - case_sensitive: false - quick: true - partial: true - algorithm: "prefix" - sort: "smart" - external: { - enable: true - max_results: 100 - completer: null - } - use_ls_colors: true - } - - cursor_shape: { - emacs: line - vi_insert: block - vi_normal: underscore - } - - color_config: $dark_theme - footer_mode: 25 - float_precision: 2 - buffer_editor: micro - use_ansi_coloring: true - bracketed_paste: true - edit_mode: emacs - shell_integration: { - osc2: true - osc7: true - osc8: true - osc9_9: false - osc133: true - osc633: true - reset_application_mode: true - } - render_right_prompt_on_last_line: false - use_kitty_protocol: false - highlight_resolved_externals: false - recursion_limit: 50 - - plugins: {} - - plugin_gc: { - default: { - enabled: true - stop_after: 10sec - } - plugins: { - } - } - - hooks: { - pre_prompt: [{ null }] - pre_execution: [{ null }] - env_change: { - PWD: [{|before, after| - if (which direnv | is-empty) { - return - } - - direnv export json | from json | default {} | load-env - }] - } - display_output: "if (term size).columns >= 100 { table -e } else { table }" - command_not_found: { null } - } - - menus: [ - { - name: completion_menu - only_buffer_difference: false - marker: "| " - type: { - layout: columnar - columns: 4 - col_width: 20 - col_padding: 2 - } - style: { - text: green - selected_text: { attr: r } - description_text: yellow - match_text: { attr: u } - selected_match_text: { attr: ur } - } - } - { - name: ide_completion_menu - only_buffer_difference: false - marker: "| " - type: { - layout: ide - min_completion_width: 0, - max_completion_width: 50, - max_completion_height: 10, - padding: 0, - border: true, - cursor_offset: 0, - description_mode: "prefer_right" - min_description_width: 0 - max_description_width: 50 - max_description_height: 10 - description_offset: 1 - correct_cursor_pos: false - } - style: { - text: green - selected_text: { attr: r } - description_text: yellow - match_text: { attr: u } - selected_match_text: { attr: ur } - } - } - { - name: history_menu - only_buffer_difference: true - marker: "? " - type: { - layout: list - page_size: 10 - } - style: { - text: green - selected_text: green_reverse - description_text: yellow - } - } - { - name: help_menu - only_buffer_difference: true - marker: "? " - type: { - layout: description - columns: 4 - col_width: 20 - col_padding: 2 - selection_rows: 4 - description_rows: 10 - } - style: { - text: green - selected_text: green_reverse - description_text: yellow - } - } - ] - - keybindings: [ - { - name: completion_menu - modifier: none - keycode: tab - mode: [emacs vi_normal vi_insert] - event: { - until: [ - { send: menu name: completion_menu } - { send: menunext } - { edit: complete } - ] - } - } - { - name: completion_previous_menu - modifier: shift - keycode: backtab - mode: [emacs, vi_normal, vi_insert] - event: { send: menuprevious } - } - { - name: ide_completion_menu - modifier: control - keycode: space - mode: [emacs vi_normal vi_insert] - event: { - until: [ - { send: menu name: ide_completion_menu } - { send: menunext } - { edit: complete } - ] - } - } - { - name: history_menu - modifier: control - keycode: char_r - mode: [emacs, vi_insert, vi_normal] - event: { send: menu name: history_menu } - } - { - name: help_menu - modifier: none - keycode: f1 - mode: [emacs, vi_insert, vi_normal] - event: { send: menu name: help_menu } - } - { - name: next_page_menu - modifier: control - keycode: char_x - mode: emacs - event: { send: menupagenext } - } - { - name: undo_or_previous_page_menu - modifier: control - keycode: char_z - mode: emacs - event: { - until: [ - { send: menupageprevious } - { edit: undo } - ] - } - } - { - name: escape - modifier: none - keycode: escape - mode: [emacs, vi_normal, vi_insert] - event: { send: esc } # NOTE: does not appear to work - } - { - name: cancel_command - modifier: control - keycode: char_c - mode: [emacs, vi_normal, vi_insert] - event: { send: ctrlc } - } - { - name: quit_shell - modifier: control - keycode: char_d - mode: [emacs, vi_normal, vi_insert] - event: { send: ctrld } - } - { - name: clear_screen - modifier: control - keycode: char_l - mode: [emacs, vi_normal, vi_insert] - event: { send: clearscreen } - } - { - name: search_history - modifier: control - keycode: char_q - mode: [emacs, vi_normal, vi_insert] - event: { send: searchhistory } - } - { - name: open_command_editor - modifier: control - keycode: char_o - mode: [emacs, vi_normal, vi_insert] - event: { send: openeditor } - } - { - name: move_up - modifier: none - keycode: up - mode: [emacs, vi_normal, vi_insert] - event: { - until: [ - { send: menuup } - { send: up } - ] - } - } - { - name: move_down - modifier: none - keycode: down - mode: [emacs, vi_normal, vi_insert] - event: { - until: [ - { send: menudown } - { send: down } - ] - } - } - { - name: move_left - modifier: none - keycode: left - mode: [emacs, vi_normal, vi_insert] - event: { - until: [ - { send: menuleft } - { send: left } - ] - } - } - { - name: move_right_or_take_history_hint - modifier: none - keycode: right - mode: [emacs, vi_normal, vi_insert] - event: { - until: [ - { send: historyhintcomplete } - { send: menuright } - { send: right } - ] - } - } - { - name: move_one_word_left - modifier: control - keycode: left - mode: [emacs, vi_normal, vi_insert] - event: { edit: movewordleft } - } - { - name: move_one_word_right_or_take_history_hint - modifier: control - keycode: right - mode: [emacs, vi_normal, vi_insert] - event: { - until: [ - { send: historyhintwordcomplete } - { edit: movewordright } - ] - } - } - { - name: move_to_line_start - modifier: none - keycode: home - mode: [emacs, vi_normal, vi_insert] - event: { edit: movetolinestart } - } - { - name: move_to_line_start - modifier: control - keycode: char_a - mode: [emacs, vi_normal, vi_insert] - event: { edit: movetolinestart } - } - { - name: move_to_line_end_or_take_history_hint - modifier: none - keycode: end - mode: [emacs, vi_normal, vi_insert] - event: { - until: [ - { send: historyhintcomplete } - { edit: movetolineend } - ] - } - } - { - name: move_to_line_end_or_take_history_hint - modifier: control - keycode: char_e - mode: [emacs, vi_normal, vi_insert] - event: { - until: [ - { send: historyhintcomplete } - { edit: movetolineend } - ] - } - } - { - name: move_to_line_start - modifier: control - keycode: home - mode: [emacs, vi_normal, vi_insert] - event: { edit: movetolinestart } - } - { - name: move_to_line_end - modifier: control - keycode: end - mode: [emacs, vi_normal, vi_insert] - event: { edit: movetolineend } - } - { - name: move_down - modifier: control - keycode: char_n - mode: [emacs, vi_normal, vi_insert] - event: { - until: [ - { send: menudown } - { send: down } - ] - } - } - { - name: move_up - modifier: control - keycode: char_p - mode: [emacs, vi_normal, vi_insert] - event: { - until: [ - { send: menuup } - { send: up } - ] - } - } - { - name: delete_one_character_backward - modifier: none - keycode: backspace - mode: [emacs, vi_insert] - event: { edit: backspace } - } - { - name: delete_one_word_backward - modifier: control - keycode: backspace - mode: [emacs, vi_insert] - event: { edit: backspaceword } - } - { - name: delete_one_character_forward - modifier: none - keycode: delete - mode: [emacs, vi_insert] - event: { edit: delete } - } - { - name: delete_one_character_forward - modifier: control - keycode: delete - mode: [emacs, vi_insert] - event: { edit: delete } - } - { - name: delete_one_character_backward - modifier: control - keycode: char_h - mode: [emacs, vi_insert] - event: { edit: backspace } - } - { - name: delete_one_word_backward - modifier: control - keycode: char_w - mode: [emacs, vi_insert] - event: { edit: backspaceword } - } - { - name: move_left - modifier: none - keycode: backspace - mode: vi_normal - event: { edit: moveleft } - } - { - name: newline_or_run_command - modifier: none - keycode: enter - mode: emacs - event: { send: enter } - } - { - name: move_left - modifier: control - keycode: char_b - mode: emacs - event: { - until: [ - { send: menuleft } - { send: left } - ] - } - } - { - name: move_right_or_take_history_hint - modifier: control - keycode: char_f - mode: emacs - event: { - until: [ - { send: historyhintcomplete } - { send: menuright } - { send: right } - ] - } - } - { - name: redo_change - modifier: control - keycode: char_g - mode: emacs - event: { edit: redo } - } - { - name: undo_change - modifier: control - keycode: char_z - mode: emacs - event: { edit: undo } - } - { - name: paste_before - modifier: control - keycode: char_y - mode: emacs - event: { edit: pastecutbufferbefore } - } - { - name: cut_word_left - modifier: control - keycode: char_w - mode: emacs - event: { edit: cutwordleft } - } - { - name: cut_line_to_end - modifier: control - keycode: char_k - mode: emacs - event: { edit: cuttolineend } - } - { - name: cut_line_from_start - modifier: control - keycode: char_u - mode: emacs - event: { edit: cutfromstart } - } - { - name: swap_graphemes - modifier: control - keycode: char_t - mode: emacs - event: { edit: swapgraphemes } - } - { - name: move_one_word_left - modifier: alt - keycode: left - mode: emacs - event: { edit: movewordleft } - } - { - name: move_one_word_right_or_take_history_hint - modifier: alt - keycode: right - mode: emacs - event: { - until: [ - { send: historyhintwordcomplete } - { edit: movewordright } - ] - } - } - { - name: move_one_word_left - modifier: alt - keycode: char_b - mode: emacs - event: { edit: movewordleft } - } - { - name: move_one_word_right_or_take_history_hint - modifier: alt - keycode: char_f - mode: emacs - event: { - until: [ - { send: historyhintwordcomplete } - { edit: movewordright } - ] - } - } - { - name: delete_one_word_forward - modifier: alt - keycode: delete - mode: emacs - event: { edit: deleteword } - } - { - name: delete_one_word_backward - modifier: alt - keycode: backspace - mode: emacs - event: { edit: backspaceword } - } - { - name: delete_one_word_backward - modifier: alt - keycode: char_m - mode: emacs - event: { edit: backspaceword } - } - { - name: cut_word_to_right - modifier: alt - keycode: char_d - mode: emacs - event: { edit: cutwordright } - } - { - name: upper_case_word - modifier: alt - keycode: char_u - mode: emacs - event: { edit: uppercaseword } - } - { - name: lower_case_word - modifier: alt - keycode: char_l - mode: emacs - event: { edit: lowercaseword } - } - { - name: capitalize_char - modifier: alt - keycode: char_c - mode: emacs - event: { edit: capitalizechar } - } - { - name: copy_selection - modifier: control_shift - keycode: char_c - mode: emacs - event: { edit: copyselection } - } - { - name: cut_selection - modifier: control_shift - keycode: char_x - mode: emacs - event: { edit: cutselection } - } - { - name: select_all - modifier: control_shift - keycode: char_a - mode: emacs - event: { edit: selectall } - } - ] -} - -mkdir ($nu.data-dir | path join "vendor/autoload") -atuin init nu | save -f ($nu.data-dir | path join "vendor/autoload/atuin.nu") -starship init nu | save -f ($nu.data-dir | path join "vendor/autoload/starship.nu") -zoxide init nushell | save -f ($nu.data-dir | path join "vendor/autoload/zoxide.nu") diff --git a/dotfiles/.config/nushell/env.nu b/dotfiles/.config/nushell/env.nu deleted file mode 100644 index 9006520..0000000 --- a/dotfiles/.config/nushell/env.nu +++ /dev/null @@ -1,57 +0,0 @@ -def create_left_prompt [] { - let dir = match (do --ignore-errors { $env.PWD | path relative-to $nu.home-path }) { - null => $env.PWD - '' => '~' - $relative_pwd => ([~ $relative_pwd] | path join) - } - - let path_color = (if (is-admin) { ansi red_bold } else { ansi green_bold }) - let separator_color = (if (is-admin) { ansi light_red_bold } else { ansi light_green_bold }) - let path_segment = $"($path_color)($dir)(ansi reset)" - - $path_segment | str replace --all (char path_sep) $"($separator_color)(char path_sep)($path_color)" -} - -def create_right_prompt [] { - let time_segment = ([ - (ansi reset) - (ansi magenta) - (date now | format date '%x %X') - ] | str join | str replace --regex --all "([/:])" $"(ansi green)${1}(ansi magenta)" | - str replace --regex --all "([AP]M)" $"(ansi magenta_underline)${1}") - - let last_exit_code = if ($env.LAST_EXIT_CODE != 0) {([ - (ansi rb) - ($env.LAST_EXIT_CODE) - ] | str join) - } else { "" } - - ([$last_exit_code, (char space), $time_segment] | str join) -} - -$env.PROMPT_COMMAND = {|| create_left_prompt } -$env.PROMPT_COMMAND_RIGHT = {|| create_right_prompt } -$env.PROMPT_INDICATOR = {|| "> " } -$env.PROMPT_INDICATOR_VI_INSERT = {|| ": " } -$env.PROMPT_INDICATOR_VI_NORMAL = {|| "> " } -$env.PROMPT_MULTILINE_INDICATOR = {|| "::: " } - -$env.ENV_CONVERSIONS = { - "PATH": { - from_string: { |s| $s | split row (char esep) | path expand --no-symlink } - to_string: { |v| $v | path expand --no-symlink | str join (char esep) } - } - "Path": { - from_string: { |s| $s | split row (char esep) | path expand --no-symlink } - to_string: { |v| $v | path expand --no-symlink | str join (char esep) } - } -} - -$env.NU_LIB_DIRS = [ - ($nu.default-config-dir | path join 'scripts') - ($nu.data-dir | path join 'completions') -] - -$env.NU_PLUGIN_DIRS = [ - ($nu.default-config-dir | path join 'plugins') -] diff --git a/home/cli/eza.nix b/home/cli/eza.nix new file mode 100644 index 0000000..cc914a1 --- /dev/null +++ b/home/cli/eza.nix @@ -0,0 +1,5 @@ +{pkgs, ...}: { + home.packages = with pkgs; [ + eza + ]; +} \ No newline at end of file diff --git a/home/cli/fzf.nix b/home/cli/fzf.nix index 4164e84..e50efe9 100644 --- a/home/cli/fzf.nix +++ b/home/cli/fzf.nix @@ -1,5 +1,6 @@ _: { programs.fzf = { enable = true; + enableZshIntegration = true; }; } diff --git a/home/cli/nushell.nix b/home/cli/nushell.nix deleted file mode 100644 index c47d21c..0000000 --- a/home/cli/nushell.nix +++ /dev/null @@ -1,5 +0,0 @@ -_: { - programs.nushell = { - enable = true; - }; -} diff --git a/home/cli/zsh.nix b/home/cli/zsh.nix new file mode 100644 index 0000000..6c1246e --- /dev/null +++ b/home/cli/zsh.nix @@ -0,0 +1,85 @@ +{ config, pkgs, ... }: + +{ + programs.zsh = { + enable = true; + enableCompletion = true; + syntaxHighlighting.enable = true; + + dotDir = "${config.xdg.configHome}/zsh"; + + plugins = [ + { + name = "zsh-autosuggestions"; + src = pkgs.zsh-autosuggestions; + } + { + name = "zsh-syntax-highlighting"; + src = pkgs.zsh-syntax-highlighting; + } + { + name = "fzf-tab"; + src = pkgs.zsh-fzf-tab; + } + ]; + + initContent = '' + export LANG=zh_CN.UTF-8 + export EDITOR=nano + + # === History === + HISTFILE=$XDG_STATE_HOME/zsh/history + HISTSIZE=10000 + SAVEHIST=10000 + setopt HIST_IGNORE_DUPS HIST_IGNORE_SPACE SHARE_HISTORY INC_APPEND_HISTORY + + # === Tools === + if command -v atuin >/dev/null 2>&1; then + eval "$(atuin init zsh)" + fi + if command -v zoxide >/dev/null 2>&1; then + eval "$(zoxide init zsh)" + fi + if command -v starship >/dev/null 2>&1; then + eval "$(starship init zsh)" + fi + + # === Colors and Aliases === + autoload -U colors && colors + alias ls='eza --icons=auto --group-directories-first' + alias ll='eza -lh --icons=auto --group-directories-first' + alias la='eza -lha --icons=auto --group-directories-first' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' + alias ..='cd ..' + alias ...='cd ../..' + + # === Completion === + autoload -Uz compinit + mkdir -p ~/.cache/zsh + compinit -d ~/.cache/zsh/zcompdump + setopt CORRECT + + # === Load plugins manually === + if [[ -o interactive ]]; then + source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh + source ${pkgs.zsh-syntax-highlighting}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh + source ${pkgs.zsh-fzf-tab}/share/fzf-tab/fzf-tab.plugin.zsh + + ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=8' + ZSH_AUTOSUGGEST_STRATEGY=(history completion) + + bindkey -e + bindkey "$(tput kcuf1)" autosuggest-accept + fi + + # === Prompt === + if ! command -v starship >/dev/null 2>&1; then + PROMPT='%F{green}%n@%m%f:%F{blue}%~%f %# ' + RPROMPT='%F{yellow}[%D{%H:%M}]%f' + fi + ''; + }; +} \ No newline at end of file diff --git a/hosts/dos/default.nix b/hosts/dos/default.nix index 3f69c62..a9319e1 100644 --- a/hosts/dos/default.nix +++ b/hosts/dos/default.nix @@ -26,7 +26,7 @@ homeMode = "755"; ignoreShellProgramCheck = true; isNormalUser = true; - shell = pkgs.nushell; + shell = pkgs.zsh; }; }; } diff --git a/hosts/example/default.nix b/hosts/example/default.nix index 3f69c62..a9319e1 100644 --- a/hosts/example/default.nix +++ b/hosts/example/default.nix @@ -26,7 +26,7 @@ homeMode = "755"; ignoreShellProgramCheck = true; isNormalUser = true; - shell = pkgs.nushell; + shell = pkgs.zsh; }; }; }