我希望在 中有一个两行提示符zsh
,但在按下 后将其折叠成非常小的提示符ENTER
,这样它就不会显示在终端滚动历史记录中。输入两个命令后,输入第三个命令时终端应如下所示:
> echo Command 1
Command 1
> echo Command 2
Command 2
+------------ Long prompt ----------+
`> echo typing a new command here…
我尝试使用preexec
钩子和来获取某些东西zle reset prompt
,但是出现了错误widgets can only be called when ZLE is active
:
$ autoload -U add-zsh-hook
$ hook_function() { OLD_PROMPT="$PROMPT"; export PROMPT="> "; zle reset-prompt; export PROMPT="$OLD_PROMPT"; }
$ PROMPT=$'+------------ Long prompt ----------+\n\`> '
+------------ Long prompt ----------+
`> add-zsh-hook preexec hook_function
+------------ Long prompt ----------+
`> echo Test
hook_function:zle: widgets can only be called when ZLE is active
Test
+------------ Long prompt ----------+
`>
答案1
preexec
当调用该函数时,zle
它已经完成,因此 zle 小部件不再可用。
ENTER
因此,您必须在终止之前拦截按键zle
。默认情况下,ENTER
绑定到accept-line
,但这可能取决于您已经使用的其他技巧;
$ bindkey | grep '\^M'
"^M" accept-line
我们现在编写一个我们想要绑定的新小部件ENTER
:
del-prompt-accept-line() {
OLD_PROMPT="$PROMPT"
PROMPT="> "
zle reset-prompt
PROMPT="$OLD_PROMPT"
zle accept-line
}
逻辑取自您的方法。在最后一行中,我们调用accept-line
小部件或按下 时执行的任何其他操作ENTER
。
最后我们引入新的小部件zle
并将其绑定到ENTER
:
zle -N del-prompt-accept-line
bindkey "^M" del-prompt-accept-line
瞧:
> echo foo bar
foo bar
+------------ Long prompt ----------+
`> echo this is my new command... not pressed ENTER, yet!