Vim 和 Bash 中的 yanking - 它们是相反的吗?

jsh*_*hji 2 bash vim terminology

我有一个非常简短的问题,在谷歌搜索时我在其他地方找不到,尽管对我来说,这感觉是一个非常自然的问题,所以也许只是我错过了一些东西。

因此,YANK 这个词在 Bash 和 Vim 中的含义似乎相反。

  • 在 Bash 中,复制和粘贴就是 Kill 和 Yank。因此,我们使用ctrl-y粘贴存储在kill-ring中的文本(或者,从kill-ring中拉出文本,如拉动.
  • 在 Vim 中,复制和粘贴就是复制和粘贴。因此我们简单地使用p粘贴。但我们用来将文本复制到缓冲区。y

因此,我觉得在 Bash Yank 中是复制,在 Vim Yank 中是粘贴。在英语中,Yank 的意思是“拉”,所以我认为将 Yank 理解为从缓冲区/kill-ring 中提取数据更有意义(所以 yank = 粘贴)。

但由于我实在找不到任何关于此的讨论,我认为上述问题一定有一个非常合理的解释。如果有人能帮助我理解这一点,我将不胜感激!

谢谢你!

Sté*_*las 5

bash(或者更确切地说,readline这是 bash 使用的行编辑库)与 80 年代初期以来的大多数其他 shell 一样,有两种行编辑模式:emacsvi,基于这两种流行的文本编辑器。

\n

Bash 是 GNU shell,GNUemacs是 GNU 的明星应用程序之一,默认模式是emacs. set -o emacs您可以使用和set -o vi(也可以在 tcsh 或 zsh 中使用bindkey -e/ )在两者之间切换bindkey -v。Ksh 也适用set -o gmacsGosling emacs which is the one set as default on Solaris for instance.

\n

所以更多的是关于emacs 和 vi 中yank词含义的不同。

\n

emacs 和 vi 都是在 70 年代末编写的,早于 bash (1989) 或 vim (1991)。

\n

如果你查看1979 年 2BSD 的文档vi

\n
\n

运算符y将对象的副本复制到\n未命名的缓冲区中。如果前面有一个缓冲区名称“x y”,\n其中 x 被字母a\xe2\x88\x92z替换,则它将文本\n放置在指定的缓冲区中。然后可以使用以下命令将文本放回\n文件中:命令pPp将文本放置在光标之后或\xe2\x80\x90\n下方,而P将文本放置在光标之前或上方。

\n
\n

Emacs 没有粘贴缓冲区,它有一个Killring来记录已被删除复制的文本 into it. The yanking is seen as being in the other direction, pulled from that killring as opposed to pulled from the text into the kill ring.

\n

1985 年左右的 GNU emacs 文档, we find:

\n
\n

Yanking 正在取回被删除的文本。移动或复制文本的常用方法是终止文本,然后将其拉出一次或多次。

\n
\n

您会看到 bash 具有来自两个编辑器的小部件,可以绑定到按键或组合键:

\n
$ bash -c \'bind -l\' | grep -i yank\nvi-yank-arg\nvi-yank-pop\nvi-yank-to\nyank\nyank-last-arg\nyank-nth-arg\nyank-pop\n
Run Code Online (Sandbox Code Playgroud)\n

(这vi ones being mostly undocumented).

\n

默认绑定:

\n
$ bash -o vi -c \'bind -pm vi\' | grep yank\n"_": vi-yank-arg\n# vi-yank-pop (not bound)\n"Y": vi-yank-to\n"y": vi-yank-to\n"\\C-y": yank\n# yank-last-arg (not bound)\n# yank-nth-arg (not bound)\n# yank-pop (not bound)\n$ bash -o vi -c \'bind -pm vi-insert\' | grep yank\n# vi-yank-arg (not bound)\n# vi-yank-pop (not bound)\n# vi-yank-to (not bound)\n"\\C-y": yank\n# yank-last-arg (not bound)\n# yank-nth-arg (not bound)\n# yank-pop (not bound)\n
Run Code Online (Sandbox Code Playgroud)\n

看看如何在 vi 插入模式下仍然获得 emacs 风格的Ctrl+ ;y未记录的vi-yank-arg绑定_也使用 emacs 风格的术语,其行为与yank-last-argemacs 小部件类似。我不知道vi-yank-pop要做什么。bash 源代码发行版中的文件NEWS显示它是emacs-mode yank-pop 的 vi-mode 版本, though that doesn\'t make sense since vi has no kill-ring.

\n