.png)
Tenho o seguinte tema personalizado ativado com oh-my-zsh
(versão mais recente de zsh
e 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-zsh
e não tenho certeza se esse é um recurso oh-my-zsh
ou 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;~joe
para o diretório inicial do usuáriojoe
;~foo
para um diretório nomeado: o diretório comfoo
aliashash -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_subst
opçã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 $PWD
for 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 nochpwd
funçã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 chpwd
função, então não substitua oh-my-zsh. Oh-my-zsh chpwd
chama 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_dirs
opção é responsável por esse comportamento.
Use o comando unsetopt auto_name_dirs
para desativá-lo.