Zsh

zsh 提示未正確轉義

  • February 6, 2022

這是我目前的提示定義:

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

游標有時會從實際提示後面的一個字元開始,例如在使用 搜尋歷史記錄時ctrl``R

您需要從列印工作目錄的 PROMPT 部分周圍刪除%{and 。%}

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

和序列旨在放置在不影響游標位置的提示位周圍(例如,硬編碼的控制序列)%{%}通過包圍實際移動游標的東西(通過列印目前工作目錄),您會混淆zsh的游標位置概念;當它需要重新繪製目前行的一部分時(例如,當您使用 Cr 搜尋時),它最終會將游標放在錯誤的位置。

您可以通過更改為具有更長列印表示的目錄來驗證這一點:如果您cd /tmp是 ,則游標將錯位 4 列( 的長度/tmp)而不是 1 列( 的長度~)。


此外,您通常可以使用%~而不是${PWD/#$HOME/~}包含目前工作目錄。因此,如果這是您唯一的替代品,那麼您可以關閉PROMPT_SUBST.

此外,${PWD/#$HOME/~}如果$PWD包含%或控製字元,您會遇到問題。如果可能,最好不要在內容中包含不受控制的數據,$PROMPT如果無法避免,您需要進行一些轉義,以便它作為提示字元串仍然有意義。

引用自:https://unix.stackexchange.com/questions/50123