Verhindern, dass zsh Aliase in CWD verwendet (Eingabeaufforderung)

Verhindern, dass zsh Aliase in CWD verwendet (Eingabeaufforderung)

Ich habe das folgende personalisierte Theme aktiviert mit oh-my-zsh(neueste Version von zshund 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%}"

Mir ist aufgefallen, dass in der Eingabeaufforderung, wenn ich einen Alias ​​für ein Verzeichnis habe, der Name des Alias ​​als mein aktuelles Verzeichnis angezeigt wird und nicht der tatsächliche Pfad. Obwohl dies eine interessante Funktion ist, würde ich sie gerne deaktivieren.

Ich bin relativ neu bei oh-my-zshund bin nicht sicher, ob dies eine oh-my-zshoder zshFunktion ist, aber wie kann ich sie deaktivieren?

Antwort1

DerEingabeaufforderungs-Escapesequenz %~(included in $current_dir) expandiert zum aktuellen Verzeichnis und berücksichtigt dabei Abkürzungen. Die Abkürzungen lauten:

  • ~für Ihr Home-Verzeichnis;
  • ~joefür das Home-Verzeichnis des Benutzers joe;
  • ~foofür ein benanntes Verzeichnis: das Verzeichnis, dem foomit hash -d foo=…; ​​ein Alias ​​zugewiesen wurde.
  • ~[bar]Für eindynamisches benanntes Verzeichnis.

Sie können %/anstelle von verwenden %~. Dabei werden niemals Verzeichnisabkürzungen verwendet.

Wenn Sie es etwas raffinierter haben möchten, können Sie Ihren eigenen Code ausführen, um zu bestimmen, wie das aktuelle Verzeichnis angezeigt wird. Ein Ansatz besteht darin, eine Parametersubstitution innerhalb der Eingabeaufforderungszeichenfolge zu verwenden. Dies erfordert dieprompt_substOption gesetzt werden, was oh-my-zsh tut (sonst: setopt prompt_subst). Das aktuelle Verzeichnis ist immer im Parameter verfügbarPWD. Hier ist eine einfache Version, die Ihr Home-Verzeichnis nur auf Folgendes verkürzt ~:

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

${${PWD/#%$HOME/\~}/#$HOME\//\~/}bedeutet: wenn $PWDgenau gleich ist wie $HOME, dann setze das Ergebnis auf ~, andernfalls setze das Ergebnis auf $PWD; dann, wenn das aktuelle Ergebnis mit beginnt $HOME/, dann ersetze dieses Präfix durch ~/, andernfalls lasse das Ergebnis unverändert.

Ein klarerer Ansatz besteht darin, einen Parameter zu pflegen, der eine schön gedruckte Version des aktuellen Verzeichnisses enthält. Aktualisieren Sie diesen Parameter imchpwdHook-Funktion, die bei jedem aktuellen Verzeichniswechsel ausgeführt wird. Initialisieren Sie diesen Parameter auch in Ihrem .zshrc.

Es gibt nur eine chpwdFunktion, überschreiben Sie also nicht die von oh-my-zsh. Oh-my-zsh chpwdruft die Funktion im Array auf chpwd_functions, fügen Sie also Ihre zum Array hinzu.

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%}'

Wenn Sie die Home-Verzeichnisse der Benutzer abkürzen möchten, aber nicht die benannten Verzeichnisse, können Sie die Home-Verzeichnisse in einer Subshell löschen und den% Parametererweiterungsflagum die automatischen Abkürzungen in der Subshell durchzuführen.

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

Oder wenn Sie den Inline-Ansatz bevorzugen:

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

Antwort2

Die auto_name_dirsOption ist für dieses Verhalten verantwortlich.

Verwenden Sie den Befehl unsetopt auto_name_dirs, um es zu deaktivieren.

verwandte Informationen