防止 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将其禁用。

相关内容