这是我当前的提示定义:
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