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

7
我有以下的小部件定义:
function cdd()
{
    cd /
}
zle -N cdd{,}
bindkey "^R" cdd

按下键组合后,当前工作目录已经更改,但终端提示符未更新。例如,在执行此操作后(())

~/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 ./

/$ |

这意味着在运行ll命令时的cwd已经是/了。

这很容易让人产生困惑,可能会导致严重错误。(例如,如果我按下^R后被打断离开我的桌子,然后回来时可能会忘记我做了什么)

我怎样才能让终端在按键后重新绘制提示符?是否有zle函数可以做到这一点?


有一个小部件(clear-screen)可以清除屏幕并重新绘制提示符,但我没有看到仅重新绘制提示符的方法。 - chepner
1个回答

9

reset-prompt可以拯救:

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

reset-prompt

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接