zsh が CWD (プロンプト) でエイリアスを使用しないようにする

zsh が CWD (プロンプト) でエイリアスを使用しないようにする

私は以下のパーソナライズされたテーマを有効にしています oh-my-zshzsh(およびの最新バージョンoh-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;
  • ~foo名前付きディレクトリの場合: ;fooでエイリアスされたディレクトリ。hash -d foo=…
  • ~[bar]のために動的な名前付きディレクトリ

%/の代わりにを使用できます%~。この場合、ディレクトリの省略形は使用されません。

もっと凝ったことをしたい場合は、現在のディレクトリの表示方法を決定する独自のコードを実行することができます。1つの方法は、プロンプト文字列内でパラメータ置換を使用することです。これには、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

関数は 1 つしかないのでchpwd、oh-my-zsh の関数をオーバーライドしないでください。oh-my-zsh のchpwd関数は配列内の関数を呼び出すので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%}'

ユーザーのホームディレクトリを省略したいが、名前付きディレクトリを省略したくない場合は、サブシェルでホームディレクトリをクリアし、% パラメータ拡張フラグサブシェル内で自動省略を実行します。

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無効にします。

関連情報