Skip to content

Instantly share code, notes, and snippets.

@mkdir700
Last active August 26, 2025 06:20
Show Gist options
  • Select an option

  • Save mkdir700/3c4482f03009e6c30b5ba29ffa82d2a5 to your computer and use it in GitHub Desktop.

Select an option

Save mkdir700/3c4482f03009e6c30b5ba29ffa82d2a5 to your computer and use it in GitHub Desktop.
在 zsh 里同时用上 Vim 和 Emacs 快捷键
# 加载 edit-command-line 小部件
autoload -Uz edit-command-line
zle -N edit-command-line
bindkey -v
# 插入模式:竖条;普通模式:方块
function _vi_update_cursor() {
case $KEYMAP in
vicmd) # normal 模式
echo -ne '\e[2 q' # 稳定方块
;;
main|viins) # insert 模式
echo -ne '\e[5 q' # 闪烁竖条
;;
esac
}
zle -N zle-keymap-select _vi_update_cursor
zle -N zle-line-init _vi_update_cursor
precmd() { _vi_update_cursor }
# 确保在 vi insert 模式下,Backspace 能删除前一个字符
bindkey -M viins '^?' backward-delete-char
bindkey -M viins '^H' backward-delete-char
# 滚动(适配 Vim 感)
bindkey -M viins '^N' down-line-or-history # Ctrl-N 下一条历史
bindkey -M viins '^P' up-line-or-history # Ctrl-P 上一条历史
# 光标移动
bindkey -M viins '^B' backward-char # Ctrl-B ← 光标左移
bindkey -M viins '^F' forward-char # Ctrl-F → 光标右移
# 行编辑
bindkey -M viins '^U' kill-whole-line # Ctrl-U 删除整行
bindkey -M viins '^K' kill-line # Ctrl-K 删除到行尾
bindkey -M viins '^A' beginning-of-line # Ctrl-A 光标到行首
bindkey -M viins '^E' end-of-line # Ctrl-E 光标到行尾
bindkey -M viins '^W' backward-kill-word # Ctrl-W 删除前一个单词
# 删除(向前/向后)
bindkey -M viins '^D' delete-char # Ctrl-D 删除光标处字符 / 空行时退出
bindkey -M viins '^H' backward-delete-char # Ctrl-H 退格(部分终端)
# 撤销 / 重做
bindkey -M viins '^_' undo # Ctrl-_ 撤销(部分终端要用 Ctrl-Shift-- 才能发出 ^_)
# 绑定 Ctrl+X Ctrl+E 在 vi 模式下也可用
bindkey -M viins '^X^E' edit-command-line
bindkey -M vicmd '^X^E' edit-command-line
alias ls='exa --icons --group-directories-first --sort=modified'
alias ll='exa --icons --group-directories-first --sort=modified --long'
alias l='exa --icons --group-directories-first --sort=modified --long --level=1'
alias cls='clear'
export EDITOR="nvim"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment