zsh 提示符未正确转义

zsh 提示符未正确转义

这是我当前的提示定义:

PROMPT='%(?..%F{红色}%?%f:)%F{蓝色}%n%f:%F{绿色}%{${PWD/#$HOME/~}%} %( !.%F{红色}.%f)%# %f'

光标有时会在实际提示后面开始一个字符,例如使用 搜索历史记录时ctrlR

答案1

您需要删除打印工作目录的提示部分周围的%{和。%}

PROMPT='%(?..%F{red}%?%f:)%F{blue}%n%f:%F{green}${PWD/#$HOME/~} %(!.%F{red}.%f)%# %f'

%{和序列%}旨在放置在不影响光标位置的提示位周围(例如,硬编码控制序列)。通过包围实际移动光标的东西(通过打印当前工作目录),您会感到困惑桀骜光标所在位置的概念;当它需要重画当前行的一部分时(例如,当您使用 Cr 进行搜索时),它最终会将光标放在错误的位置。

您可以通过更改为具有较长打印表示的目录来验证这一点:如果您cd /tmp,则光标将错位 4 列( 的长度/tmp)而不是 1 列( 的长度~)。


另外,您通常可以使用%~而不是${PWD/#$HOME/~}包含当前工作目录。因此,如果这是您唯一的替换,您可以关闭PROMPT_SUBST

另外,对于,如果包含或控制字符,${PWD/#$HOME/~}您会遇到问题。如果可能的话,最好不要在内容中包含不受控制的数据,如果无法避免,您需要进行一些转义,以便它作为提示字符串仍然有意义。$PWD%$PROMPT

相关内容