Bash/Zsh 下调用 Emacs/Vim 编辑当前命令

Bash 环境

多数时候我们用的是 Bash, 比如个人的 Linux 不愿去定制,远程服务器的由不得你去定制,所以就从 Bash 说起。

默认键绑定 emacs, 操作是 ctrl-x, ctrl-e

在默认的 Bash  环境下,只要在命令行中按下 ctrl-x, ctrl-e 就会把当前命令的内容调入到环境变量  $EDITOR 指示的编辑器(默认为 emacs)去编辑,编辑后保存退出就会立即执行。

如果未安装 Emacs 编辑器,在按下 ctrl-x, ctrl-e 会得到如下提示

[vagrant@localhost ~]$
-bash: emacs: command not found

如果希望使用 vi 来编辑当前命令,就需要设置 EDITOR 环境变量,比如在 .bashrc 中加入

export EDITOR=vi

那么在命令行中按下 ctrl-x, ctrl-e 使用打开  vi 来编辑当前命令。

注:Emacs 要用 ctrl-x, ctrl-c, 再回答 y, 命令保存到临时文中; 而 vi 的相应操作是 :wq, 至少这个操作上 vi 要简洁些。

可以用命令 bind -p | grep -F "\C-x\C-e 查看 ctrl-x, ctrl-e 是执行了 Readline 命令 edit-and-execute-command

$ bind -p | grep -F "\C-x\C-e"
"\C-x\C-e": edit-and-execute-command

更多:bind -p 可以显示所有的键绑定,bind -p | grep -F "\C" 可查看含 ctrl 按键的绑定。

键绑定为 vi 时,操作是正常模式下按 v 键

可以用命令 set -o vi 切换到  Vi 键绑定。切回到 emacs 键绑定用  set -o emacs

Vi 键绑定时命令行就像是一个简单的行编辑器,Esc 在正常模式与输入模式间切换,如果要打开 Vi 来编辑当前命令只需在正常模式按下 v, 环境变量 $EDITOR 指定的编辑器(默认为 Vi ) 载入当前命令进行编辑。

如果对 Emacs 青睐有加的话,可以设置  $EDITOR 为 emacs, 这时按 v 键打开的就是 Emacs 编辑器。

Zsh 环境

同 Bash 的内置 bind 命令一样,Zsh 也有自己内置的键绑定命令 bindkey。而且也有相应的 emaces 和 vi 键绑定,切换的命令分别是 bindkey -e, 和 bindkey -v

默认情况下,不管是 emacs 键绑定还是 victrl-x, ctrl-e 和  v 键都不起作用,所以都得定制。针对两种键绑定类型分别为:

emacs 键绑定

默认的,或使用了 bindkey -e 指定为 emacs 键绑定,可以在 ~/.zshrc  中加入

source ~/.zshrc 后,便可按 ctrl-x, ctrl-e 打开 $EDITOR 指定的编辑器(默认为 vi) 来编辑当前命令

vi 键绑定

bindkey -v 切换键绑定到 vi, 在 ~/.zshrc 加入

然后 source ~/.zshrc 后,在命令行的 vi 命令模式下按  v 键会打开$EDITOR 指定的编辑器(默认为 vi) 来编辑当前命令。

注意:在 Zsh 中,不管是 emacs 还是 vi 键绑定,未设置 $EDITOR 的话,默认都是 vi, 这一点与 Bash 是不同的。

bindkey 的几个相关命令:bindkey -l, bindkey -lL, bindkey -L, bindkey --, bindkey -a

总结

  1. 最好是设置环境变量 $EDITOR 明确指定编辑器是 emacs 还是 vi
  2. Bash emacs 键绑定按 ctrl-x, ctrl-e 打开编辑器载入命令,vi 键绑定按 v 键打开编辑器
  3. Zsh 需要自行绑定按钮到 edit-command-line 命令
  4. emacs  的保存退出命令是 ctrl-x, ctrl-c, 回答 y 退出,vi 就用 :wq 退出
  5. 配置只单单按v 键打开编辑器更容易产生误操作,也可能会与 vi 的可视模式混淆

任何情况下,不管是 Bash/Zsh, 无论何种键绑定都可以使用 fc 命令调用 EDITOR 来编辑最后一条执行的命令。

参考:

  1. Vi mode in Bash
  2. Zsh Line Editor
  3. Zsh Zle Functions
  4. Editing long commands in your shell

本文链接 https://yanbin.blog/bash-zsh-call-emacs-vim-edit-current-command/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

1 Comment
Inline Feedbacks
View all comments
laixintao
6 years ago

编辑很长的curl命令时很有用