这个问题直接来自答案。在这种情况下,我特别无法理解以下部分:
在这方面,它的行为比 bash(readline)/ksh/zsh emacs 模式更接近 emacs,但偏离了终端驱动程序嵌入式行编辑器(在规范模式下),其中Ctrl-W删除了前一个单词(werase,也在 vi 中) )。
这里我们讨论的是 shell,而不是编辑器,这是两个完全不同的程序。 shell 处于某种编辑器模式是什么意思?
PS:你可以在我了解什么是shell以及如何使用vim进行基本编辑的前提下回答。
答案1
在“vi”模式下,您可以在当前 shell 提示符上进行编辑/导航,就像 vi 编辑器中的一行一样。您可以将其视为单行文本文件。类似地,在“emacs”模式下,您可以使用(某些)Emacs 快捷方式编辑/导航当前命令行。
例子
例如,在 vi 模式下,您可以执行类似的操作(在 bash 中):
$ set -o vi
$ ls hello world
<ESC>
bbdw # results in
$ ls world
在 emacs 模式下,您可以按Ctrl+等键A跳转到行首(vi:Ctrl+ [、0或ESC、0)。您可以通过set -o emacs
(在 bash、ksh、zsh 等中)打开 emacs 模式。
阅读线
许多交互式命令行程序(包括巴什) 使用阅读线图书馆。因此,您可以在一个地方配置要使用的输入模式(vi 或 emacs)和其他选项,以便使用 readline 的每个程序都具有完全相同的编辑/导航界面。
例如我的 readline 配置如下:
$ cat ~/.inputrc
set editing-mode vi
set blink-matching-paren on
例如桀骜/什据我所知,不使用 readline,但也支持 vi/emacs 模式,这与 bash/readline 模式非常相似。
当然,命令行 shell 中的 vi/emacs 模式只是完整编辑器功能集的一个子集。并非每个功能在命令行 shell 中都有意义,并且某些功能的支持比其他功能更复杂。
规范模式
在交互式命令行 shell 的 vi/emacs 模式“被发明”之前,您的 shell 只会使用规范模式您的终端仅提供一组有限的编辑命令(例如Ctrl+W删除最后一个单词)。
答案2
您会注意到,当您cat
在终端上的 shell 提示符处运行时,cat
应该将从 stdin 读取的内容写入 stdout,然后按a,您会看到a
终端驱动程序回显,但cat
不会写入该内容a
(您会看到只有一个a
,即终端驱动程序回显的那个)。
但是,如果您输入a Backspace b Enter,您不会看到cat
输出a\010b\015
,而是看到b\012
(b
和换行符)。
这是因为终端驱动程序(我们谈论的是内核中的软件,而不是像终端仿真器中的软件)xterm
)实现了一个非常基本的行编辑器当在典范模式。终端驱动程序可以使用ioctl()
系统调用进行配置,就像使用stty
命令一样。例如,要离开规范模式,您可以执行以下操作stty -icanon
。如果你这样做:
stty -icanon; cat
然后,您将同时看到echo
(您可以使用 禁用stty -echo
)和输出。cat
该编辑器是行编辑器。也就是说,用户可以编辑一行文本,直到按下 后将其发送到读取终端设备的应用程序Enter。
其编辑能力编辑非常有限。在大多数实现中,只有 4 个编辑键(实际上是字符),也可以配置stty
:
- 擦除(
^H
或^?
通常):擦除前一个字符 - Kill(
^U
通常):清空(杀死)到目前为止输入的行 - werase (
^W
): 删除前一个单词 - lnext(
^V
):按字面意思输入下一个字符(取消上面所有的特殊含义)
回到过去,人们认为终端驱动程序行编辑器将具有更高级的功能。这就是为什么早期的 shell 都没有任何命令行编辑功能(您在 shell 提示符处获得的行编辑功能与cat
我们上面运行时获得的行编辑功能相同)。
然而,这实际上从未发生过,也许部分原因是不同终端在按下某些按键时不发送相同字符的混乱,这表明这不应该在内核空间中实现。
所以一些炮弹开始掉落典范终端驱动程序模式并实现自己的行编辑器。emacs
和是当时vi
最流行的可视化文本编辑器,按键绑定和操作方式完全不同。在 中vi
,您有一种用于输入文本的模式,一种用于编辑的模式。在emacs
,你永远在输入文字模式,但编辑是通过按组合键来完成的(例如^b
向后移动字符)。
当时 shell 没有必要提出自己不同的键绑定。这会让人们感到沮丧,因为他们不得不学习另一种不同的方法。然而,选择一种(emacs
或vi
)风格而不是另一种风格肯定会疏远用户。其他编辑。
根据https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a:
ksh 流行的内联编辑功能(vi 和 emacs 模式)是由贝尔实验室的软件开发人员创建的; Pat Sullivan 的 vi 行编辑模式和 Mike Veach 的 emacs 行编辑模式。每个人都独立修改了 Bourne shell 来添加这些功能,并且两人所在的组织都希望仅在 ksh 具有各自的内联编辑器时才使用 ksh。最初,将命令行编辑添加到 ksh 的想法被拒绝,因为希望将行编辑移至终端驱动程序中。然而,当人们意识到这种情况不太可能很快发生时,两种行编辑模式都被集成到 ksh 中并成为可选的,以便可以在提供编辑作为终端界面一部分的系统上禁用它们。
因此,他们实现了两者并提供了一个界面供用户在两者之间进行选择。ksh
第一个很可能是 80 年代初期(重用单独编写的代码,将 vi 模式和 emacs 模式添加到 Bourne shell,如上所示),然后是tcsh
(tcsh
最初只有emacs
键绑定,vi
后来添加了模式),然后是bash
和zsh
90年代初。
bash
您可以在、zsh
或ksh
使用set -o vi
或set -o emacs
以及使用bindkey -e
或bindkey -v
中的tcsh
或之间切换两种模式zsh
。
POSIX 实际上指定了vi
模式,而不是指定emacs
了模式sh
(故事中有这样的内容)Richard Stallman 反对 POSIX 指定emacs
模式sh
)。
的默认模式((pdksh、mksh、oksh)bash
的公共域变体)是 emacs 模式(尽管使用,如果您是),而在 AT&T 中ksh
tcsh
zsh
zsh
vi
$EDITOR
vi
ksh
,它是哑的模式除非$EDITOR
或$VISUAL
提到vi
或emacs
。
ksh
后来还添加了一种gmacs
模式来适应 Gosling 用户的不同emacs
处理方式Ctrl+T。
^W
现在,对inemacs
或 in emacs 模式的处理tcsh
可能早于werase
可能早于终端行编辑器中的字符,因此我们不能为此和我的声明而责怪他们“出发……”可能会被视为误导。只是当您键入时出现类似 或 的行为与其他情况不同时,我emacs
觉得tcsh
很info
烦人Ctrl-W。您可以想象,当您键入 时,某些应用程序开始关闭窗口,这让我感到更加恼火 Ctrl-W。