在zsh
“我可以Esc h对任何命令执行”中,获取该命令的手册页,从手册页中退出并获取带有所有参数的命令。例如在我的 shell 中输入:
zsh# tar -czvf docs.tgz docs
我可以tar
通过按 来呼叫 man for Esc h,并将光标放在任何地方。
现在,我想要同样的东西,但是在 bash 中。下面显示了一种可能的解决方案,但我想知道是否还有其他解决方案。
bind '"\eh": "\C-a\ef\C-k\C-f\C^Cman \C-y\C-m\C-y\C-y\ey"'
答案1
当我们谈论命令行操作时,我们实际上谈论的是 readline 库。更新 readline 绑定可以从命令行完成,如您的示例所示,在 readline 的主 init 文件中/etc/inputrc
(使用 进行检查echo $INPUTRC
),或者为您的帐户创建一个本地 init ~/.inputrc
。如果您还没有查找 GNU readline 库(在这里试试)
话虽如此,以下是针对您的问题的一些建议:
建议1
\eh
zsh 使用 readline,您可能可以使用 zsh 检查帐户下ESC-h ( ) 的键绑定,并使用 bash 将该绑定复制到您的帐户中。一些非常聪明的人已经将这些绑定放在一起,并且无需任何调整就可以工作。- 在 zsh 帐户中,使用 bind 命令(
bind -P
[使用小写 p 开关进行原始绑定输出])查看 zsh 帐户中的活动绑定。 - 您可能需要将绑定输出中的实际代码拼凑在一起。
- 将完整的行添加到 bash 帐户中的绑定中(就像您上面尝试做的那样)
- 在 zsh 帐户中,使用 bind 命令(
建议2
- 按照上面示例中的路径进行操作
在这一点上,你上面的例子可以工作,但它需要一些调整。这对我有用
"\eh": "\C-a\C-kman \e1\e.\C-m\C-y\M-y"
我将绑定放在 /etc/inputrc 中。您必须在命令行中使用按键序列重新读取 inputrc ctrl+x ctrl+r
。
但是,您的问题是如何对光标下的单词执行此操作。这对我有用:
"\eh": "\ef\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d"
简而言之,它的工作原理如下:
对于按键序列\eh
(ESC+h)
- 首先找到单词的结尾,然后找到开头 (
\ef\eb
) - 删除当前单词(您感兴趣的单词)并将其放回原处 (
\ed\C-y
)。我们需要将其放入终止缓冲区中。 - 注释掉整个命令行并转到新提示符 (
\e#
) - 在命令行上输入“man”(注意空格)
- 将您感兴趣的命令粘贴到命令行并执行它 (
\C-y\C-m
) - 在命令历史记录中找到第二个(上一个)条目(“man”,然后是原始命令)(
\C-p\C-p
)。 - 转到行首并删除注释字符 (
\C-a\C-d
)
建议3
- 设置 readline 使用 emacs 和 vi 模式。您可以在键绑定中使用大多数您最喜欢的且非常强大的编辑器命令。
注意:我之前没有尝试过将此选项实现为绑定,但我确实在命令行中使用它。您可以通过 inputrc 文件或 bashrc 进行设置。
- 在输入rc中:
set editing-mode vi
- 在.bashrc中:
set -o vi
进行绑定的过程似乎与默认的 readline 键序列类似。但建议 2 中的示例应该会让您走上正确的道路。