Evitando que o zsh use aliases no CWD (prompt)

6

Eu 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%}"

Eu notei que no prompt, sempre que eu 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 em oh-my-zsh e não tenho certeza se esse é um recurso oh-my-zsh ou zsh , mas como posso desativá-lo?

    
por Amelio Vazquez-Reina 10.04.2013 / 16:51

2 respostas

6

A sequência de escape do prompt %~ (incluída em $current_dir ) expande para o diretório atual, levando em conta abreviações. As abreviaturas são:

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

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

Se você quiser ser mais chique, 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 de prompt. Isso requer que a opção prompt_subst seja definida, o que oh-my-zsh faz (caso contrário: setopt prompt_subst ). O diretório atual está sempre disponível no parâmetro PWD . Aqui está uma versão simples que apenas encurta seu diretório pessoal para ~ :

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

${${PWD/#%$HOME/\~}/#$HOME\//\~/} significa: se $PWD for exatamente igual a $HOME , defina o resultado como ~ , caso contrário, defina o resultado como $PWD ; em seguida, 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 esse parâmetro na função chpwd que é executada em todas as alterações de diretório atuais . Também inicialize esse parâmetro no seu .zshrc .

Existe apenas uma função chpwd , por isso não substitua as de oh-my-zsh. O chpwd de Oh-my-zsh chama a função na matriz chpwd_functions , então adicione a sua à matriz.

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 base em uma subshell e usar o % Flash de expansão do parâmetro para executar as abreviaturas automáticas na subshell.

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

Ou se preferir a abordagem em linha:

local current_dir='%{$terminfo[bold]$fg[cyan]%} $(hash -rd; print -lr -- ${(%)PWD})%{$reset_color%}'
    
por 11.04.2013 / 03:32
0

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

Use o comando unsetopt auto_name_dirs para desativá-lo.

    
por 11.04.2013 / 00:15

Tags