像在 Emacs 中一样在 Bash 中复制和设置标记?

Ame*_*ina 17 bash line-editor inputrc

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

GNU Bash的文件说,猛砸附带了一些默认设置了这些键绑定。

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

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

copy-region-as-kill ()
Run Code Online (Sandbox Code Playgroud)

将区域中的文本复制到终止缓冲区,以便立即将其拉出。默认情况下,此命令是未绑定的。

set-mark (C-@)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Mik*_*kel 12

它没有突出选择,但除此之外我认为它工作正常。

尝试跑步

$ bind -p | grep copy-region-as-kill
Run Code Online (Sandbox Code Playgroud)

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

它应该说:

"\ew": copy-region-as-kill
Run Code Online (Sandbox Code Playgroud)

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

例子:

$ abc<C-Spc><C-a><M-w> def <C-y>
Run Code Online (Sandbox Code Playgroud)

给我

$ abc def abc
Run Code Online (Sandbox Code Playgroud)

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

例子:

$ <C-Spc>abc<C-x><C-x>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

如果这一切都失败了:

  • 确实Ctrl+Space工作emacs -nw在同一终端上?
  • 其他Alt/Meta快捷方式在 bash 中是否有效?

  • 欢迎!是的,你必须写 `\e` 或 `\M-`。请参阅 [readline init 文件语法](http://www.gnu.org/software/bash/manual/bashref.html#Readline-Init-File-Syntax)。 (2认同)