终端效率进阶:掌握 Shell 行内编辑与 Vim/Emacs 快捷键
Vi & Emacs Style
现在 shell 一般预装了两套快捷键,Vi 和 Emacs 。这两种模式源自两大经典文本编辑器,为终端用户提供了不同的编辑体验。一般都是以 emacs 做为默认的快捷键,例如下面这些快捷键
| Key | Action |
|---|---|
Ctrl+a | 移动到行首 |
Ctrl+e | 移动到行尾 |
Ctrl+k | 删除光标后面的内容 |
Ctrl+y | 粘贴 |
对于 bash 来说,可以通过 set -o emacs 和 set -o vi 命令切换不同快捷键组合。
Nushell 使用 VI 模式
输入 config nu 编辑 Nushell 的配置文件
$env.config = { # emacs, vi edit_mode: vi # 光标形状,根据需要自行调整 cursor_shape: { emacs: block vi_insert: blink_block vi_normal: blink_underscore }}Text Objects
Text Objects[1] 是 Vim 最吸引我的一个 feature,允许以语义为单位操作文本; 删除括号内的内容,或者删除引号内的内容,都可以很流畅的完成。例如,
$env.LS_COLORS = (vivid generate catppuccin-mocha)在 NORMAL 模式下将光标移至括号内,键入 di( (delete inside parenthesis)即可删除括号内的 Text

Cursor Jump
在长命令中快速移动时,使用Vim的快捷键会非常高效
| 按键 | 跳转逻辑 |
|---|---|
w / b | 下一个单词 / 上一个单词 |
I / A | 跳转至行首插入 / 跳转至行尾插入 |
F<char> | 向前搜索字符 <char> 并跳转 |
f<char> | 向后搜索字符 <char> 并跳转 |
当编辑 UNIX 和 GNU 风格的命令行参数时,这种情况下用 F/f 将在不同参数之间切换还是很流畅的
| 风格类型 | 前缀 | 格式 | 示例 | 跳转策略 |
|---|---|---|---|---|
| Unix | - | 单字母 | ls -la | 使用 f- 快速跳至选项 |
| GNU | -- | 单词 | grep --color | 使用 f- |
| Windows | / | 单词 | DIR /W | 使用 f/ |
Line Editor
许多 Shell 也支持使用命令外部编辑器中对命令进行编辑,这样就可以使用 NeoVim, Helix 来编辑命令了 🤓,如果不在乎启动速度,甚至可以用 VSCode。
| Shell | Vi 模式 | Emacs 模式 |
|---|---|---|
| Bash | Normal 模式下按 v | Ctrl+x Ctrl+e |
| Zsh | 不知道喵 චᆽච | 不知道喵 චᆽච |
| Fish | Alt+e | Alt+e |
| Nushell | Ctrl+o | Ctrl+o |
下面简单演示一下,假如要使用 scp 将 remote machine 上的文件复制到本地,但是 remote machine 的 host name 写错了
不觉得这很酷吗,作为一名理工男我觉得这太酷了 🤓🤓🤓
Change Default Editor
如何指定编辑命令的编辑器?
一般来说,Shell 会读取 VISUAL 或 EDITOR 环境变量,决定使用哪个编辑器。像 NuShell 的话也可以设置 $env.config.buffer_editor 变量
# ----------------------------------------# For Nushell (config.nu)# ----------------------------------------$env.config = { # 推荐使用启动速度快的编辑器,如 Helix/Neovim/Vim buffer_editor: "helix"}# ----------------------------------------# For Bash / Zsh (.bashrc or .zshrc)# ----------------------------------------# VISUAL 优先级通常高于 EDITORexport VISUAL=nvimexport EDITOR=nvim# ----------------------------------------# For Fish (config.fish)# ----------------------------------------set -gx VISUAL nvimUnix 设置系统环境变量,也可以参考这篇文章的方式 👉 Set System Env-Vars in UNIX
Text Object可以是引号,括号,单词,句子,段落等。更多信息可以参考 Motion#text-objects - Neovim docs ↩︎
终端效率进阶:掌握 Shell 行内编辑与 Vim/Emacs 快捷键

