![在 Bash 中复制并设置标记,就像在 Emacs 中一样?](https://linux22.com/image/1541/%E5%9C%A8%20Bash%20%E4%B8%AD%E5%A4%8D%E5%88%B6%E5%B9%B6%E8%AE%BE%E7%BD%AE%E6%A0%87%E8%AE%B0%EF%BC%8C%E5%B0%B1%E5%83%8F%E5%9C%A8%20Emacs%20%E4%B8%AD%E4%B8%80%E6%A0%B7%EF%BC%9F.png)
我希望能够使用 Emacs 默认使用的相同键盘绑定在 Bash 的命令行中复制和粘贴文本(即使用C-space
forset-mark
来M-w
复制文本,C-y
使用M-y
来粘贴文本等)。
这GNU Bash 文档说 Bash 附带了一些默认设置的键绑定。
例如,C-y
在我的终端上默认使用 yanking ( )。但是,我无法使set-mark
和copy
命令正常工作,并且默认情况下它们似乎没有绑定到任何键。
通常,用户定义自己的键绑定的方法是将它们添加到.inputrc
.因此,我在文档中查找并发现了以下 bash 函数,我认为它们可以帮助我定义我想要的类似 Emacs 的行为(即set-mark
withC-space
和copy
with 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
.inputrc
C-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