Impedindo que o zsh use aliases no CWD (prompt)

Impedindo que o zsh use aliases no CWD (prompt)

Tenho o seguinte tema personalizado ativado com oh-my-zsh(versão mais recente de zshe 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%}"

Percebi que no prompt, sempre que tenho um alias para um diretório, ele exibe o nome do alias como meu diretório atual, em oposição ao caminho real. Embora este seja um recurso interessante, gostaria de desativá-lo.

Sou relativamente novo no oh-my-zshe não tenho certeza se esse é um recurso oh-my-zshou zsh, mas como posso desativá-lo?

Responder1

Osequência de escape imediata %~(incluído em $current_dir) expande para o diretório atual, levando em consideração as abreviações. As abreviaturas são:

  • ~para seu diretório inicial;
  • ~joepara o diretório inicial do usuário joe;
  • ~foopara um diretório nomeado: o diretório com fooalias hash -d foo=…;
  • ~[bar]paradiretório nomeado dinâmico.

Você pode usar %/em vez de %~. Isso nunca usa nenhuma abreviação de diretório.

Se quiser ser mais sofisticado, você pode executar seu próprio código para determinar como o diretório atual é exibido. Uma abordagem é usar uma substituição de parâmetro dentro da string do prompt. Isto requer oprompt_substopção a ser definida, o que oh-my-zsh faz (caso contrário setopt prompt_subst:). O diretório atual está sempre disponível no parâmetroPWD. Aqui está uma versão simples que apenas encurta seu diretório inicial para ~:

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

${${PWD/#%$HOME/\~}/#$HOME\//\~/}significa: se $PWDfor exatamente igual a $HOME, então defina o resultado como ~, caso contrário defina o resultado como $PWD; então, se o resultado atual começar com $HOME/, substitua esse prefixo por ~/, caso contrário, deixe o resultado inalterado.

Uma abordagem mais clara é manter um parâmetro contendo uma versão bem impressa do diretório atual. Atualize este parâmetro nochpwdfunção hook que é executada em cada mudança de diretório atual. Inicialize também esse parâmetro no seu arquivo .zshrc.

Há apenas uma chpwdfunção, então não substitua oh-my-zsh. Oh-my-zsh chpwdchama a função no array chpwd_functions, então adicione a sua ao array.

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

Se você quiser abreviar os diretórios iniciais dos usuários, mas não os diretórios nomeados, poderá limpar os diretórios iniciais em um subshell e usar o comando% sinalizador de expansão de parâmetropara realizar as abreviações automáticas no subshell.

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

Ou se você preferir a abordagem inline:

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

Responder2

A auto_name_dirsopção é responsável por esse comportamento.

Use o comando unsetopt auto_name_dirspara desativá-lo.

informação relacionada