如何设置和确定 Bash 的命令行编辑模式?

Blc*_*knx 11 bash emacs vi

如何设置Bashviemacs命令行编辑模式以及如何确定当前设置的是哪种模式?

Sté*_*las 17

set

set -o vi
Run Code Online (Sandbox Code Playgroud)

或者:

set -o emacs
Run Code Online (Sandbox Code Playgroud)

(设置一个set -o vi +o vi会取消设置另一个。您可以同时取消设置)

去检查:

if [[ -o emacs ]]; then
  echo emacs mode
elif [[ -o vi ]]; then
  echo vi mode
else
  echo neither
fi
Run Code Online (Sandbox Code Playgroud)

该语法来自ksh. 这set -o vi是POSIX。set -o emacs不是(因为 Richard Stallman 反对emacsPOSIX 指定的模式)但在 shell 实现中非常普遍。一些 shell 支持额外的编辑模式。[[ -o option ]]不是 POSIX,但受 ksh、bash 和 zsh 支持。[ -o option ]bash, kshand支持yash(请注意,-o它也是 的二元 OR 运算符[)。

  • `设置-o | egrep -w '^emacs|vi'` 将返回是否设置了 emacs 或 vi。 (4认同)

ImH*_*ere 6

由于您的问题是关于 bash 的:

要为每个新会话永久设置它:

echo 'set -o vi' >> ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

或(推荐),在 ./inputrc 中添加(或更改)一行:

set editing-mode vi
Run Code Online (Sandbox Code Playgroud)

这将设置 readline 的编辑模式,除了 bash 之外,它被其他几个程序使用。

很容易取消设置这两个选项:

shopt -ou vi emacs
Run Code Online (Sandbox Code Playgroud)

要设置一个,或者:

set -o vi
Run Code Online (Sandbox Code Playgroud)

或者

shopt -os vi
Run Code Online (Sandbox Code Playgroud)

对于emacs. 设置vi取消设置emacs,反之亦然。

列出状态:

$ shopt -op emacs
set +o emacs

$ shopt -op vi
set -o vi
Run Code Online (Sandbox Code Playgroud)

或者同时进行:

$ shopt -op emacs vi
set +o emacs
set -o vi
Run Code Online (Sandbox Code Playgroud)

测试是否vi设置:

shopt -oq vi      &&   echo vi is set
Run Code Online (Sandbox Code Playgroud)

或(ksh 语法):

[[ -o vi ]]        &&   echo vi is set
Run Code Online (Sandbox Code Playgroud)

电子邮件:

shopt -oq emacs   &&   echo emacs is set
Run Code Online (Sandbox Code Playgroud)

或者:

[[ -o emacs ]]    &&   echo emacs is set
Run Code Online (Sandbox Code Playgroud)

或者,要测试没有设置选项:

! ( shopt -oq emacs || shopt -oq vi ) && echo no option is set
Run Code Online (Sandbox Code Playgroud)