5

我定义了以下小部件

function cdd()
{
    cd /
}
zle -N cdd{,}
bindkey "^R" cdd

按下组合键后 cwd 已更改,但终端提示未更新。例如,在这样做之后 ()

~/tmp/todelete$ | # press key ^R  here; "~$" is the prompt; "|" denotes cursor

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

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

/$ |

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

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

按键后如何让终端重绘提示?有这样做的zle功能吗?

4

1 回答 1

6

reset-prompt可以拯救:

function cdd()
{
    cd /
    zle reset-prompt # XXX: added
}

reset-prompt

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

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

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

于 2018-09-16T13:39:53.670 回答