Предотвращение использования псевдонимов zsh в CWD (подсказка)

Предотвращение использования псевдонимов zsh в CWD (подсказка)

У меня активирована следующая персонализированная тема oh-my-zsh(последняя версия zshи 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%}"

Я заметил, что в приглашении, когда у меня есть псевдоним для каталога, он отображает имя псевдонима как мой текущий каталог, а не фактический путь. Хотя это интересная функция, я хотел бы отключить ее.

Я новичок в oh-my-zsh, и я не уверен, является ли это функцией oh-my-zshили zsh, но как ее отключить?

решение1

Theпоследовательность быстрого выхода %~(включено в $current_dir) расширяется до текущего каталога, принимая во внимание сокращения. Сокращения:

  • ~для вашего домашнего каталога;
  • ~joeдля домашнего каталога пользователя joe;
  • ~fooдля именованного каталога: каталог, которому присвоен fooпсевдоним hash -d foo=…;
  • ~[bar]длядинамический именованный каталог.

Вы можете использовать %/вместо %~. Это никогда не использует никаких сокращений каталогов.

Если вы хотите быть более изящным, вы можете выполнить свой собственный код, чтобы определить, как отображается текущий каталог. Один из подходов — использовать подстановку параметров внутри строки приглашения. Для этого требуетсяprompt_substопция, которая должна быть установлена, что oh-my-zsh делает (иначе: setopt prompt_subst). Текущий каталог всегда доступен в параметреPWD. Вот простая версия, которая только сокращает ваш домашний каталог до ~:

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

${${PWD/#%$HOME/\~}/#$HOME\//\~/}означает: если $PWDточно такой же, как $HOME, то установите результат равным ~, в противном случае установите результат равным $PWD; затем, если текущий результат начинается с $HOME/, то замените этот префикс на ~/, в противном случае оставьте результат без изменений.

Более понятный подход — поддерживать параметр, содержащий красиво напечатанную версию текущего каталога. Обновите этот параметр вchpwdФункция hook, которая выполняется при каждом изменении текущего каталога. Также инициализируйте этот параметр в вашем .zshrc.

Там только одна chpwdфункция, так что не переопределяйте oh-my-zsh. Oh-my-zsh chpwdвызывает функцию в массиве chpwd_functions, так что добавьте свою в массив.

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

Если вы хотите сократить домашние каталоги пользователей, но не именованные каталоги, вы можете очистить домашние каталоги в подоболочке и использовать% флаг расширения параметрадля выполнения автоматических сокращений в подоболочке.

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

Или, если вы предпочитаете встроенный подход:

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

решение2

auto_name_dirsЗа такое поведение отвечает опция .

unsetopt auto_name_dirsЧтобы отключить его, используйте команду .

Связанный контент