在 Bash 中复制并设置标记,就像在 Emacs 中一样?

在 Bash 中复制并设置标记,就像在 Emacs 中一样?

我希望能够使用 Emacs 默认使用的相同键盘绑定在 Bash 的命令行中复制和粘贴文本(即使用C-spaceforset-markM-w复制文本,C-y使用M-y来粘贴文本等)。

GNU Bash 文档说 Bash 附带了一些默认设置的键绑定。

例如,C-y在我的终端上默认使用 yanking ( )。但是,我无法使set-markcopy命令正常工作,并且默认情况下它们似乎没有绑定到任何键。

通常,用户定义自己的键绑定的方法是将它们添加到.inputrc.因此,我在文档中查找并发现了以下 bash 函数,我认为它们可以帮助我定义我想要的类似 Emacs 的行为(即set-markwithC-spacecopywith M-w)。

copy-region-as-kill ()

将该区域中的文本复制到终止缓冲区,以便可以立即将其拉出。缺省情况下,该命令未绑定。

set-mark (C-@)

将标记设置到点上。如果提供了数字参数,则标记将设置到该位置。

如果我理解正确的话,上面的意思是copy-region-as-kill默认情况下不绑定到任何键盘序列,而默认情况set-mark下绑定到任何键盘序列。C-@

C-@在终端上尝试过,但我认为它无法运行,set-mark因为当我移动光标时没有看到任何突出显示的文本。无论如何,我尝试将键盘绑定(M-w和)添加到my 中的C-函数 copy-region-as-kill和上面,然后使用 重新加载它,但这不起作用。我知道我的其他条目正在工作,因为我在其中定义了其他用户定义的键绑定。set-mark.inputrcC-x C-r.inputrc

我做错了什么吗?我错过了什么吗?

答案1

它没有突出显示选择,但除此之外我认为它工作得很好。

尝试跑步

$ bind -p | grep copy-region-as-kill

以确保这C-x C-r确实有效。

应该说:

"\ew": copy-region-as-kill

之后,它应该可以正常工作。

例子:

$ abc<C-Spc><C-a><M-w> def <C-y>

给我

$ abc def abc

如果你想知道在哪里mark,就这么做吧C-x C-x

例子:

$ <C-Spc>abc<C-x><C-x>

会将光标放回您设置标记的位置(行的开头)。

另外,我认为您不需要添加绑定set-mark。我没有。

$ bind -p | grep set-mark
"\C-@": set-mark
"\e ": set-mark
# vi-set-mark (not bound)

(请注意,大多数终端都会在按下C-@时发送。我想您的终端也是如此。)C-Spc

如果这一切都失败了:

  • Ctrl+可以在同一个终端Space上工作吗?emacs -nw
  • 其他Alt/Meta快捷方式在 bash 中工作吗?

答案2

我还绑定了 Cw杀伤区。这是我的.inputrc:

# See http://lists.gnu.org/archive/html/bug-bash/2009-03/msg00033.html
set bind-tty-special-chars off

# Define my favorite Emacs key bindings.
"\C-@": set-mark
"\e ": set-mark
"\C-w": kill-region
"\ew": copy-region-as-kill
"\e/": dabbrev-expand

相关内容