从编程的角度来看,当您将 bash shell 设置为使用 vi 或 emacs 时
set -o vi
或者
set -o emacs
这里到底发生了什么?我一直在读一本书,它声称 bash shell 使用这些编辑器中的任何一个作为 shell 本身的输入,但我认为它可能使用了 readline。
从编程的角度来看,当您将 bash shell 设置为使用 vi 或 emacs 时
set -o vi
或者
set -o emacs
这里到底发生了什么?我一直在读一本书,它声称 bash shell 使用这些编辑器中的任何一个作为 shell 本身的输入,但我认为它可能使用了 readline。
Bash 仍在使用 readline。Readline 使用 emacs 或 vi 模式,并在各种编辑器模式之间设置模式切换。您可以检查基本源代码中的 lib/readline 文件夹以查看各种键绑定。
它使用这些编辑器之一的用户熟悉的击键来编辑命令行。
Readline 是为 Bash 和其他程序提供该功能的工具。
来自man bash
:
阅读线 这是在使用交互时处理读取输入的库 tive shell,除非在 shell 调用时给出了 --noediting 选项。 当使用 read 内置的 -e 选项时,也使用行编辑。 默认情况下,行编辑命令与 emacs 类似。一种 vi风格的行编辑界面也可用。行编辑可以 使用 -o emacs 或 -o vi 选项随时启用 内置(请参阅下面的 SHELL BUILTIN 命令)。关闭行编辑 在 shell 运行后,使用 +o emacs 或 +o vi 选项 设置内置。
据我所知,readline
是什么为 bash 提供了行编辑功能。
一个附带条件:当您v
在 vi 命令模式下按下时,您将获得完整的vi
编辑器来编辑您的命令行。
来自man bash
:
READLINE
这是在使用交互式 shell 时处理读取输入的库,除非--noediting
在 shell 调用时给出了该选项。默认情况下,行编辑命令与 emacs 类似。还提供了 vi 风格的行编辑界面。要在 shell 运行后关闭行编辑,请使用内置的+o emacs
or+o vi
选项。set
当 shell 向您显示提示时(除非您处于非编辑模式),您已经在使用readline
. 您将处于 emacs 模式或 vi 插入模式(这就是为什么您可以使用ESC
返回 vi 命令模式的原因)。
根据手册页 BASH_BUILTINS(1) (在 Fedora 8 上):
set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
...(跳过所有单字母选项)
-o 选项名称 选项名称可以是以下之一:
...
emacs 使用 emacs 风格的命令行编辑界面。这是 当 shell 交互时默认启用,除非 shell 以 --noediting 选项启动。...
vi 使用 vi 风格的命令行编辑界面。我将其解释为 bash 直接解释用于行编辑的命令。此选项仅设置要使用的命令集。请参阅 readline(3) 的手册页。