Zsh:在交互模式下编写多行语句时如何删除块前缀?

Zsh:在交互模式下编写多行语句时如何删除块前缀?

当我在 Zsh 中以交互模式编写多行语句时,它会在我的语句前面加上我所在的块类型,如下所示:

% for i in $(seq 3); do
for> echo $i
for> done
1
2
3
% function foo() {
function> echo bar
function> }
% foo
bar

我不喜欢看到for>andfunction>和其他代码块前缀。我什至不确定这些前缀被称为什么来充分搜索如何抑制它们。 Bash 也只使用角色来做到这一点>,但我没有运气从这条路线中找出它。有没有办法在 Zsh 中禁用这些?

- 编辑 -

事实证明,$PS2Zsh 中的默认值是PS2=%_>,对于任何有一天通过搜索引擎遇到此问题的人来说。从文档

%_

解析器的状态,即已在命令行上启动的 shell 结构(如“if”和“for”)。如果给定一个整数,将打印许多字符串;零或负数或无整数意味着打印尽可能多的值。这在提示 PS2 连续行和 PS4 使用 XTRACE 选项进行调试时最有用;在后一种情况下,它也将以非交互方式工作。

根据已接受的答案,我最终得到了这样的 PS2 设置,它为每个块添加了 2 个空格缩进,并占用了初始 2 个空格以与我的 PS1 长度对齐:

PS2='${${${(%):-%_}//[^ ]}// /  }    '

答案1

PS2这是第二个提示符,在所有 Bourne 风格的 shell(包括 zsh)中通过变量配置。在zsh中,它默认显示哪些 shell 结构(循环、引号等)是打开的,使用%_ 迅速逃脱在bash中,它默认为>你可以使用转义序列但它们不是很有用。

如果您不需要任何辅助提示,请将其留空:

PS2=

启用该prompt_subst选项后,您可以使其每层嵌套都有一个空格,这会提供一些视觉反馈,但可以从终端复制代码。

setopt prompt_subst
PS2='${${(%):-%_}//[^ ]} '

相关内容