我一直在探索terminfo
和stty
。如果我运行,stty -a|grep icanon
似乎已设置规范模式,但如果我尝试将其关闭stty -icanon
并再次检查,我发现它仍然设置。当我在 bash 下做同样的事情时,我可以禁用 icanon,但我没有注意到行为有任何变化。所以我有两个问题;为什么我无法在 zsh 中禁用 icanon,如果可以的话,它会如何影响行为?
答案1
当我在 bash 下做同样的事情时,我可以禁用 icanon,但我没有注意到行为有任何变化。
那是因为 bash 转变了规范模式离开当读取用户的命令时(为了能够实现终端驱动程序未提供的行编辑功能 - 例如插入文本、使用箭头键左右移动光标等),然后恢复运行任何命令行时的先前终端设置。
要查看其效果,请运行外部命令,例如cat
:
bash$ stty -icanon
bash$ cat
hheelloo
每个键都会被重复,一次因为stty echo
打开,一次因为cat
会立即读取它并写回,而不必等待完整的行。
[使用 zsh] 如果我尝试将其关闭
stty -icanon
并再次检查,我会发现它仍然设置。
当如上所述恢复以前的终端设置时,zsh
也强制执行一些合理的默认值(包括echo
和icanon
设置)。可能是因为它假设,如果命令离开规范模式离开终止后,这只是一个意外(例如,当全屏应用程序崩溃vi
或less
崩溃时)。
我无法找到任何zsh
可以使其像bash
使用 readline 库的其他程序一样工作的选项,但是如果您想在运行命令之前关闭 icanon 模式,您可以通过从相同的命令行:
zsh$ stty -icanon; cat
hheelloo