在 bash shell 中调用 man 获取光标下的命令

在 bash shell 中调用 man 获取光标下的命令

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

  • \ehzsh 使用 readline,您可能可以使用 zsh 检查帐户下ESC-h ( ) 的键绑定,并使用 bash 将该绑定复制到您的帐户中。一些非常聪明的人已经将这些绑定放在一起,并且无需任何调整就可以工作。
    • 在 zsh 帐户中,使用 bind 命令(bind -P[使用小写 p 开关进行原始绑定输出])查看 zsh 帐户中的活动绑定。
    • 您可能需要将绑定输出中的实际代码拼凑在一起。
    • 将完整的行添加到 bash 帐户中的绑定中(就像您上面尝试做的那样)

建议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 中的示例应该会让您走上正确的道路。

相关内容