在 Zsh 中,要反向搜索命令历史记录,键盘快捷键是 Control-R。例如:
echo foo
echo bar
echo baz
然后按 Control-R > 输入ec
> 您将看到echo baz
> 再次按 Control-R > 您将看到echo bar
。
但是,如果在多次按下 Control-R 后,您决定向前移动而不是向后移动,该怎么办?我看到有人说可以用 Control-S 来实现这一点,但也有人说 Control-S 在许多终端中默认不起作用,而且似乎在 macOS 默认终端中也不起作用,在 iTerm2 中也不起作用。
然而,Ctrl-S 的问题在于有时会与 XON/XOFF 流控制相冲突。 - https://stackoverflow.com/a/791800
也许我的问题只是重复,但我不敢相信没有键盘快捷键或其他开箱即用的方法,无需调整。有什么想法吗?
当启用其选项时,
^S
/字符的处理^Q
会妨碍 的readline
(由 bash 使用)forward-search-history
小部件(在模式下绑定到Ctrl+ )或 zsh 的等效小部件(在 emacs 模式下绑定到+和+ ),而终端不会执行该操作。semacs
history-incremental-search-forward
CtrlsCtrlx sflowcontrol
它是由 tty 设备驱动程序或线路规则完成的,因此是计算机端,而不是终端端,独立于您正在使用的终端或终端仿真器。
当它被启用时(通常默认启用),就像
stty ixon
,以及 的默认值stty start
和stty stop
,在大多数系统上分别是^Q
和^S
,当终端设备驱动程序^S
从终端接收到控制字符时(通常发生在您键入Ctrl+时s),它会停止将任何内容发送回终端,包括应用程序写入终端设备文件的任何内容和您键入内容的本地回显,直到^Q
收到字符。请注意,虽然从终端读取的应用程序不会接收
^S
已由终端设备驱动程序处理的字符,但它仍将接收进一步的输入,只是输出被暂停。要在 zsh 的行编辑器中禁用该功能,您只需关闭该
flowcontrol
选项,如下所示:stty -ixon start '' stop ''
然后 zsh 将执行与其行编辑器处于活动状态时(在其提示符下)等效的操作,您可以使用Ctrl+s来调用history-incremental-search-forward
小部件或Ctrl+q来调用push-line
小部件。在 zle 之外,运行其他应用程序时,这些终端设备驱动程序流控制设置将不受影响。如果您还想在那里禁用它们(但请注意某些应用程序可能会撤消这些设置),您可以
stty -ixon start '' stop ''
手动运行它,然后该功能将在所有地方关闭,而不仅仅是在 zle 的提示下(至少直到某些东西将其重新打开)使用
flowcontrol
on,如上所述,您还可以使用+调用该history-incremental-search-forward
小部件,并且也绑定到+模式(绑定到目前大多数终端在+上发送的字符序列)。Ctrlx spush-line
Altqemacs
^[
q
Altq