防止 zsh 在 CWD 中使用別名(提示)

防止 zsh 在 CWD 中使用別名(提示)

我啟動了以下個性化主題 oh-my-zsh(最新版本zshoh-my-zsh):

local return_code="%(?..%{$fg[red]%}%? %{$reset_color%})"

local user_host='%{$terminfo[bold]$fg[green]%}%n @ %m%{$reset_color%}'
local current_dir='%{$terminfo[bold]$fg[cyan]%} %~%{$reset_color%}'
local rvm_ruby=''
local git_branch='$(git_prompt_info)%{$reset_color%}'

PROMPT="${user_host} %D{[%a, %b %d %I:%M:%S]} ${current_dir} ${rvm_ruby} ${git_branch}
%B$%b "
RPS1="${return_code}"

ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[yellow]%}‹"
ZSH_THEME_GIT_PROMPT_SUFFIX="› %{$reset_color%}"

我注意到,在提示中,每當我有目錄的別名時,它都會將別名的名稱顯示為我的當前目錄,而不是實際路徑。雖然這是一個有趣的功能,但我想停用它。

我對 比較陌生oh-my-zsh,我不確定這是否是一個oh-my-zshzsh功能,但如何禁用它?

答案1

提示轉義序列 %~(包含在 中$current_dir)擴展到目前目錄,同時考慮縮寫。縮寫為:

  • ~對於您的主目錄;
  • ~joe為使用者的主目錄joe
  • ~foofoo對於命名目錄:別名為with 的目錄hash -d foo=…
  • ~[bar]為一個動態命名目錄

您可以使用%/代替%~.這從不使用任何目錄縮寫。

如果您想要更高級,您可以執行自己的程式碼來確定目前目錄的顯示方式。一種方法是在提示字串內使用參數替換。這需要prompt_subst要設定的選項,oh-my-zsh 會執行此操作(否則:setopt prompt_subst)。目前目錄始終在參數中可用PWD。這是一個簡單的版本,僅將您的主目錄縮短為~

local current_dir='%{$terminfo[bold]$fg[cyan]%} ${${PWD/#%$HOME/~}/#$HOME\//~/}%{$reset_color%}'

${${PWD/#%$HOME/\~}/#$HOME\//\~/}意思是:如果$PWD與 完全相同$HOME,則將結果設為~,否則將結果設為$PWD;然後,如果當前結果以 開頭$HOME/,則將此前綴替換為~/,否則保持結果不變。

更清晰的方法是維護一個包含當前目錄的漂亮列印版本的參數。更新此參數chpwd在每次當前目錄變更時執行的鉤子函數。還要在您的.zshrc.

只有一個chpwd函數,所以不要覆蓋 oh-my-zsh 的函數。 Oh-my-zshchpwd呼叫數組中的函數chpwd_functions,因此將您的函數新增到數組中。

function my_update_pretty_PWD {
  case $PWD in
    $HOME(/*)#) pretty_PWD=\~${PWD#$HOME};;
    *) pretty_PWD=$PWD;;
  esac
}
chpwd_functions+=(my_update_pretty_PWD)
my_update_pretty_PWD
local current_dir='%{$terminfo[bold]$fg[cyan]%} ${pretty_PWD}%{$reset_color%}'

如果您想要縮寫使用者的主目錄而不是命名目錄,您可以在子 shell 中清除主目錄並使用% 參數擴展標誌在子 shell 中執行自動縮寫。

function my_update_pretty_PWD {
  pretty_PWD=$(hash -rd; print -lr -- ${(%)PWD})
}

或者,如果您更喜歡內聯方法:

local current_dir='%{$terminfo[bold]$fg[cyan]%} $(hash -rd; print -lr -- ${(%)PWD})%{$reset_color%}'

答案2

auto_name_dirs選項負責此行為。

使用命令unsetopt auto_name_dirs將其禁用。

相關內容