Readline:将 ANSI 转义序列绑定到键

Readline:将 ANSI 转义序列绑定到键

我想用 bash / readline 绑定一个键,以清除控制台屏幕的底部。

清除屏幕底部的 ANSI 序列是\e[J,所以我尝试将以下行添加到我的.inputrc,但它不起作用,它只是忽略了三个字符:

Control-N: "\e[J"

如果我在字符串中添加一些测试字符:

Control-N: "BEFORE \e[J AFTER"

,然后插入字符串BEFORE并停在那里。

目前,我找到了这个解决方法,但它显然显示了带有echo命令的一行,而我不想要它:

Control-N: "echo -ne \"\\e[J\"\n"

是否可以通过绑定发送 ANSI 序列readline

答案1

两部分:

  • bash 允许你将一个键绑定到 readline清屏函数(这似乎是最初的目标)。
  • 在 bash 中,readline 的目的是准备文本(通过编辑等)以发出命令巴什。转义序列将被发送到终端。没有任何一个列出的函数for readline 将替代echoor printf

readline 的键绑定需要单个函数名称或文字字符串。在您的示例中, readline 读取它认为可能的函数名称,并忽略该行的其余部分。

所以:不,bash/readline 没有提供任何有用的功能来直接将转义序列作为键绑定进行回显。如前所述,您必须使用echo.

答案2

通过稍微改进echo命令内部.inputrc命令的使用,如果最终得到了我想要的结果:

我将以下 func 放入我的 中.bashrc,并特意为该 func 选择了一个短名称:

cbs()
{
    echo -ne '\e[J\e[F\e[2K'
    history -d $(history 1)
}

它使用 ANSI 序列清除屏幕底部 ( \\e[J),然后将光标移回到原来所在的同一行 ( \\e[F),最后清除插入命令的行 ( \\e[2K)。

该命令也被直接从 bash 历史记录中删除,以免污染它。

命令的简短名称很重要,因为如果该行在太小的控制台窗口中换行,则该技巧将无法正常工作。

然后我Ctrl-N相应地绑定.inputrc

Control-N: "cbs\n"

相关内容