Evitar que zsh use alias en CWD (mensaje)

Evitar que zsh use alias en CWD (mensaje)

Tengo el siguiente tema personalizado activado con oh-my-zsh(última versión de zshy 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%}"

He notado que en el mensaje, cada vez que tengo un alias para un directorio, muestra el nombre del alias como mi directorio actual en lugar de la ruta real. Si bien esta es una característica interesante, me gustaría desactivarla.

Soy relativamente nuevo en esto oh-my-zshy no estoy seguro de si se trata de una característica oh-my-zsho zsh, pero ¿cómo puedo desactivarla?

Respuesta1

Elsecuencia de escape inmediata %~(incluido en $current_dir) se expande al directorio actual, teniendo en cuenta las abreviaturas. Las abreviaturas son:

  • ~para su directorio personal;
  • ~joepara el directorio de inicio del usuario joe;
  • ~foopara un directorio con nombre: el directorio con alias foocon hash -d foo=…;
  • ~[bar]paradirectorio con nombre dinámico.

Puedes usar %/en lugar de %~. Esto nunca utiliza ninguna abreviatura de directorio.

Si quiere ser más sofisticado, puede ejecutar su propio código para determinar cómo se muestra el directorio actual. Un enfoque es utilizar una sustitución de parámetros dentro de la cadena del mensaje. Esto requiere laprompt_substopción a configurar, lo cual hace oh-my-zsh (de lo contrario setopt prompt_subst:). El directorio actual siempre está disponible en el parámetro.PWD. Aquí hay una versión simple que solo acorta su directorio de inicio a ~:

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

${${PWD/#%$HOME/\~}/#$HOME\//\~/}significa: si $PWDes exactamente igual a $HOME, entonces establezca el resultado en ~; de lo contrario, establezca el resultado en $PWD; luego, si el resultado actual comienza con $HOME/, reemplace este prefijo por ~/; de lo contrario, deje el resultado sin cambios.

Un enfoque más claro es mantener un parámetro que contenga una versión impresa del directorio actual. Actualice este parámetro en elchpwdfunción de enlace que se ejecuta en cada cambio de directorio actual. También inicialice ese parámetro en su .zshrc.

Sólo hay una chpwdfunción, así que no anules la de oh-my-zsh. Oh-my-zsh chpwdllama a la función en la matriz chpwd_functions, así que agrega la tuya a la 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%}'

Si desea abreviar los directorios de inicio de los usuarios pero no los directorios con nombre, puede borrar los directorios de inicio en un subshell y usar el% bandera de expansión de parámetrospara realizar las abreviaturas automáticas en el subshell.

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

O si prefiere el enfoque en línea:

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

Respuesta2

La auto_name_dirsopción es responsable de este comportamiento.

Utilice el comando unsetopt auto_name_dirspara desactivarlo.

información relacionada