如何将预输入应用于 bash 历史搜索 (Ctrl-R)?

如何将预输入应用于 bash 历史搜索 (Ctrl-R)?

语境

在 bash 中提前输入:很好

当 bash shell 繁忙时(初始化、运行命令),可以在出现下一个提示之前键入

如果 shell 启动了一个程序,该程序将捕获按键,但如果没有程序运行或者该程序没有捕获输入,则在出现提示后,将在 shell 中插入键入的内容。

例如:键入sleep 5,按 Enter,然后键入ls并按 Enter。 ls将在睡眠完成后运行。在现实生活中,ls会被cprsync许多其他程序取代。这是一个典型的提前输入当您提前知道要输入什么内容时,这可以节省大量时间。

它也非常好,因为它允许复制粘贴多个命令并让它们按顺序运行。

实际用例包括 shell 需要时间初始化的情况。可能是计算机由于任何原因速度变慢,或者 shell 处于缓慢的网络链接等。

bash 中的历史搜索:很好

在 bash 提示符下,可以键入内容Ctrl-R来搜索历史记录。

当重用一些旧的命令行,甚至命令行序列时,这可以节省宝贵的时间。按Ctrl-R,键入要搜索的命令的几个典型字符,Ctrl-O根据需要多次按以从那里重播记录的命令。

历史搜索中的提前输入:如何?

但有一个限制。我经常使用上面的序列,发现如果我Ctrl-R ls在 shell 提示符实际出现之前输入eg,该Ctrl-R部分会被忽略,但ls会显示该部分。

最终的结果是,在键入之前必须等待 shell 提示符出现Ctrl-R,从而浪费了部分节省的时间。

问题

有没有办法Ctrl-R即使在预先输入的情况下也能获得荣誉?

答案1

您的Ctrl-r正在被基于内核的终端 cookied 行处理引擎拦截。

运行时sleep,终端处于烘焙模式,这意味着基于内核的 tty 行编辑器正在工作。 tty 行编辑器支持基本的命令行编辑。擦除键(通常设置为Ctrl- h(退格)或Del)和终止键(通常为Ctrl-U)是可在此模式下使用的最著名的特殊编辑键。这个行编辑器很有用:它可以让既不使用 readline 也不使用curses 的交互式实用程序从终端读取完整的输入行,同时允许用户进行打字更正。

但在此模式下还有另一个处于活动状态的特殊键。您可以在stty -a名称下的输出中看到它以及其他关键设置rprnt,其默认设置是...您猜对了... Ctrl- r。该键的功能是重新绘制当前命令行,以防它由于其他终端输出而损坏或未对齐。

为了避免这种情况,您可以使用 禁用该功能stty rprnt undef

就我个人而言,我习惯了Ctrl-r被解释为重绘命令,每次我尝试这样做时我都会感到惊讶,bash它会做一些不同的事情!

相关内容