Zsh

防止 print -P 替換環境變數

  • December 13, 2018

我在 zsh 中使用prompt pure作為我的提示。在內部,它用於print -Pn ...列印目前目錄。出於某種原因,如果我有一個與目前目錄開頭匹配的環境變數集,則該環境變數名稱將被替換到輸出中。

例如,

> export SOME_DIR=/home/bschlenk/some/path
> cd ~/some/path/deeper/nested/path
> print -Pn %~
~SOME_DIR/deeper/nested/path

如何防止它將隨機環境變數替換為恰好匹配的路徑?我希望它列印出目前路徑,用/home/bschlenk替換~,但沒有其他替換。

從以下文件%~

如果它有一個命名目錄作為其前綴,則該部分被替換為 a~後跟目錄的名稱,但前提是結果比完整路徑短

下面是對動態靜態命名目錄的引用。您看到的是一個靜態命名目錄

~如果 之後的文本是字元串 shell 參數的名稱,其值以 開頭,則也可以定義它們/

因此,如果變數的SOME_DIR值為/home/bschlenk/some/paththen~SOME_DIR是一個靜態命名目錄,其值為/home/bschlenk/some/path. 提示擴展%~看到/home/bschlenk/some/path並將其縮寫為~SOME_DIR.

但這還不是全部。事實上,這個縮寫只有在SOME_DIR被使用“啟動”時才會出現~SOME_DIR。這記錄在optionauto_name_dirs下,它消除了預先啟動的需要,但預設關閉。

任何設置為目錄絕對名稱的參數都會立即成為該目錄的名稱,將由%~和相關提示序列使用,並且在對以 開頭的單詞執行完成時可用~。(否則,必須先在表單中使用參數~param。)

%~為替換而啟動的參數(以及在 之後完成~)顯示為命名目錄雜湊表中的一個條目,您可以使用 列出該條目hash -d

我們已經將這些部分放在一起以了解發生了什麼。你怎麼能解決你的問題?這取決於是什麼導致SOME_DIR被啟動。

如果您auto_name_dirs打開了該選項,那麼顯然您應該將其關閉。

如果您以前使用~SOME_DIR過,可以使用

unhash -d SOME_DIR

這不是永久性的:如果您再次使用它會再次彈出~SOME_DIR。但是考慮到你可以在任何可以使用的$SOME_DIR地方使用~SOME_DIR~SOME_DIR這並不是一個非常有用的功能。

如果您無法擺脫構成SOME_DIR命名目錄的原因,並且您想用$HOME→來縮寫目前目錄~,則可以手動實現此轉換。

if [[ $PWD = $HOME ]]; then
 HPWD=\~
elif [[ $PWD = $HOME/* ]]; then
 HPWD=\~/${PWD#$HOME/}
else
 HPWD=$PWD
fi

然後使用print -rn $HPWD而不是print -Pn %~.

如果您無法阻止SOME_DIR成為命名目錄並且您無法更改使用的程式碼%~,那麼它會變得更加棘手。您可以使用 清空目錄雜湊表hash -r,但無法將其設為函式的本地(僅限於子shell)。

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