有没有一种方法可以将两个操作组合为一个键绑定(bind)(不要认为可以与功能一起使用)。

这是我想做的:

我想要一个键绑定(bind)(例如Ctrl-X)以-

  • 插入一些文本,然后
  • 使用插入的文本作为完成
  • 的基础,调用完成或菜单完成

    我知道我可以(在~/.inputrc中)指定
  • 插入带有(C-X: "ls")
  • 的文本
  • 执行readline命令(C-SPACE: menu-complete)

  • 但是我不确定如何将它们放在一起

    最佳答案

    诀窍是调用重新绑定(bind)键的函数。在我的示例中,我将使用C-b而不是C-x来插入文本并调用menu-complete。在我的示例中,您将不得不牺牲一把 key C-t

    在.bashrc中,或要获取的bash文件中

    set_Cb_to_insert_text() {
      bind '"\C-m": accept-line'
      bind '"\C-b":"ls \C-t1"'
      bind -x '"\C-t1":set_Cb_to_complete'
    }
    set_Cb_to_complete() {
      bind '"\C-m":"\C-t2\C-t3"'
      bind '"\C-b": menu-complete'
      bind '"\C-t2": accept-line'
      bind -x '"\C-t3":set_Cb_to_insert_text'
    }
    set_Cb_to_insert_text
    

    工作原理:

    使用bind,您可以绑定(bind)键以执行以下三种操作之一,但不能将它们组合使用:
  • 执行readline命令:bind '"key": command'
  • 执行一系列击键:bind '"key":"keystrokes"'
  • 执行shell命令:bind -x '"key": shell-command'

  • 因此,如果要结合这三件事,则需要将它们分别绑定(bind)到单独的击键组合(在我的示例中为C-t {1,2,3}),并绑定(bind)一个键以执行所有这些击键。

    在示例中:

    C-b首先插入ls并“按下” C-t1,后者执行set_Cb_to_complete,这又将C-b重新绑定(bind)到menu-complete。它也重新绑定(bind)了C-m,回车或Enter,因为它现在需要做两件事:接受该行,并通过调用ls函数将C-b重置为插入set_Cb_to_insert_text,这也将Enter重置为正常使用状态。

    我说必须“牺牲” C-t的原因是,如果您按C-t,readline将在执行任何操作之前先等待您是否要按1、2,或任何绑定(bind)的键序列。但是,当您第一次使用C-t时,您可以将其用作大量击键的初始键,以覆盖您的所有readline技巧。

    一条建议:在编写和测试这些代码时,请将替代键绑定(bind)到accept-line,因为突然有东西在错误的地方打断了链,并且您被困在终端中而无法执行命令:)

    09-25 18:45
    查看更多