ZSH:在运行命令之前更改提示符

ZSH:在运行命令之前更改提示符

我希望在 中有一个两行提示符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!

相关内容