我有一个非常简短的问题,在谷歌搜索时我在其他地方找不到,尽管对我来说,这感觉是一个非常自然的问题,所以也许只是我错过了一些东西。
因此,YANK 这个词在 Bash 和 Vim 中的含义似乎相反。
- 在 Bash 中,复制和粘贴就是 Kill 和 Yank。因此我们
ctrl-y
习惯于粘贴存储在kill-ring中的文本(或者,猛拉来自杀环的文本,如拉。 - 在 Vim 中,复制和粘贴就是复制和粘贴。因此我们简单地
p
使用粘贴。但我们用来y
将文本复制到缓冲区。
因此,我觉得在 Bash Yank 中是复制,在 Vim Yank 中是粘贴。在英语中,Yank 的意思是“拉”,所以我认为将 Yank 理解为从缓冲区/kill-ring 中提取数据更有意义(所以 yank = 粘贴)。
但由于我实在找不到任何关于此的讨论,我认为对于上述问题一定有一个非常合理的解释。如果有人能帮助我理解这一点,我将不胜感激!
谢谢你!
答案1
bash
(或者更确切地说,readline
这是 bash 使用的行编辑库)与 80 年代初以来的大多数其他 shell 一样,有两种行编辑模式:emacs
或vi
,基于这两种流行的文本编辑器。
Bash 是 GNU shell 和GNUemacs
作为 GNU 的明星应用程序之一,默认模式是emacs
.您可以使用set -o emacs
和set -o vi
(也可以在 tcsh 或 zsh 中使用bindkey -e
/)在两者之间切换。 bindkey -v
Ksh 还set -o gmacs
具有小鹅 emacs例如,这是 Solaris 上的默认设置。
所以更多的是关于含义的不同猛拉emacs 与 vi 中的单词。
emacs 和 vi 都是在 70 年代末编写的,早于 bash (1989) 或 vim (1991)。
如果你看vi
1979 年 2BSD 的文档:
运营商y将对象的副本拉入未命名的缓冲区中。如果前面有缓冲区名称,则“xy,其中 x 被替换为字母a−z,它将文本放入指定的缓冲区中。然后可以使用命令将文本放回文件中p和磷;p将文本放在光标之后或之下,而磷将文本放在光标之前或上方。
Emacs 没有粘贴缓冲区,但它有一个杀环记录已被记录的文本被杀或者复制的进去。拉动被视为是在另一个方向,从该杀戮环中拉出,而不是从文本拉入杀戮环。
在1985 年左右的 GNU emacs 文档, 我们发现:
Yanking 正在取回被删除的文本。移动或复制文本的常用方法是删除它,然后将其拉出一次或多次。
您会看到 bash 具有来自两个编辑器的小部件,可以绑定到按键或组合键:
$ bash -c 'bind -l' | grep -i yank
vi-yank-arg
vi-yank-pop
vi-yank-to
yank
yank-last-arg
yank-nth-arg
yank-pop
(vi
这些大多没有记录)。
默认绑定:
$ bash -o vi -c 'bind -pm vi' | grep yank
"_": vi-yank-arg
# vi-yank-pop (not bound)
"Y": vi-yank-to
"y": vi-yank-to
"\C-y": yank
# yank-last-arg (not bound)
# yank-nth-arg (not bound)
# yank-pop (not bound)
$ bash -o vi -c 'bind -pm vi-insert' | grep yank
# vi-yank-arg (not bound)
# vi-yank-pop (not bound)
# vi-yank-to (not bound)
"\C-y": yank
# yank-last-arg (not bound)
# yank-nth-arg (not bound)
# yank-pop (not bound)
看看如何在 vi 插入模式下仍然获得 emacs 风格的Ctrl+ ;y未记录的vi-yank-arg
绑定_
也使用 emacs 风格的术语,其行为与yank-last-arg
emacs 小部件类似。我不知道vi-yank-pop
要做什么。 bash 源代码分发中的文件NEWS
说它是emacs-mode yank-pop 的 vi-mode 版本,尽管这没有意义,因为 vi 没有kill-ring。