zsh:运行 zle 小部件后刷新提示

Liu*_*Sha 5 zsh zsh-zle

我定义了以下小部件

function cdd()
{
    cd /
}
zle -N cdd{,}
bindkey "^R" cdd
Run Code Online (Sandbox Code Playgroud)

按下组合键后,cwd 已更改,但终端提示未更新。例子,做完这个()

~/tmp/todelete$ | # press key ^R  here; "~$" is the prompt; "|" denotes cursor
Run Code Online (Sandbox Code Playgroud)

终端保持完全不变。如果我然后输入ls -ld .,它会显示

~/tmp/todelete$ ls -ld .
dr-xr-xr-x 23 root root 4096 Sep 14 07:52 ./

/$ |
Run Code Online (Sandbox Code Playgroud)

这意味着cwd当时ll正在运行的已经是/.

这是非常混乱的,可能会导致严重的错误。(例如,如果按下后^R我被打扰离开我的办公桌然后回来,我可能会忘记我做了什么)

如何让终端在按键后重新绘制提示?有没有一个zle功能可以做到这一点?

hch*_*baw 6

reset-prompt 可以拯救:

function cdd()
{
    cd /
    zle reset-prompt # XXX: added
}
Run Code Online (Sandbox Code Playgroud)

reset-prompt

强制重新展开屏幕左右两侧的提示,然后重新显示编辑缓冲区。这既反映了提示变量本身的更改,也反映了值扩展的更改(例如,时间或目录的更改,或提示引用的变量值的更改)。

否则,提示只会在每次 zle 启动时扩展,并且当显示被 shell 的另一部分(例如作业通知)的输出中断时,会导致重新打印命令行。

--- zshzle(1), reset-prompt, Miscellaneous, Widgets, zsh 命令行编辑器