zsh не перезагружает функции в подсказке

Очень хороший вопрос.

Похоже, что основной ответ лежит в алгоритме сортировки Unicode .

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

1
15.06.2020, 20:41
1 ответ

Вы устанавливаете содержимое подсказки раз и навсегда при обработке .zshrc. В вашем коде нет ничего, что говорит об изменении содержимого подсказки при изменении текущего каталога.

Одним из решений является размещение кода для изменения подсказки в ловушкеchpwd. Удалите setopt prompt_subst, так как вы не будете выполнять оценку содержимого PS1.

function set_prompt {
  PS1=$(printf "${BOLD}${BLUE}%s${NORM}@%s:[${BLUE}%s${NORM}]:$ " $USER $(hostname) "${$(_collapsed_pwd)//\%/%%}" )
}
chpwd_functions+=(set_prompt)
cd.

Пояснения:

  • cd.запускает хук chpwdодин раз при запуске zsh, чтобы изначально установить приглашение.
  • Двойные кавычки вокруг подстановки команды предотвращают ее разделение на отдельные слова, если вывод содержит пробелы.
  • Замена ${…//\%/%%}вокруг вывода _collapsed_pwdизменяет %на %%, потому что %будет интерпретироваться как быстрый выход ¹.

В качестве альтернативы можно установить параметрprompt_substи установить PS1на строку, содержащую код, который будет оцениваться каждый раз при отображении подсказки.

setopt prompt_subst
PS1='$(printf "${BOLD}${BLUE}%s${NORM}@%s:[${BLUE}%s${NORM}]:$ " $USER $(hostname) "${$(_collapsed_pwd)//\%/%%}" )'

Вы можете значительно упростить это, используя встроенные -функции zsh для включения переменных данных в подсказку . Для начала вот подсказка, которая отображает два последних компонента текущего каталога:

unsetopt prompt_subst
PS1='%B%F{blue}%n%f%b@%m:[%F{blue}%2~%f]:%(!.#.$) '

Чтобы сократить компоненты каталога, я думаю, вам нужно запустить некоторый zsh-код либо через хук chpwd, либо через prompt_subst. Чтобы избежать сложностей, связанных с расширением, используйте хук chpwd, чтобы установить psvarи%vдля ссылки на psvarв строке подсказки.

unsetopt prompt_subst
PS1='%B%F{blue}%n%f%b@%m:[%F{blue}%1v%f]:%(!.#.$) '
function abbreviate_pwd {
  psvar[1]=${(%):-%~}
  while [[ $psvar[1] =~ /[^/][^/]+/ ]]; do
    psvar[1]=${psvar[1][1,MBEGIN+1]}${psvar[1][MEND,-1]}
  done
}
chpwd_functions+=(abbreviate_pwd)
cd.

¹ Для дополнительной надежности$USER(см. также $USERNAMEавтоматически устанавливается с помощьюzsh$(hostname)(см. также $HOSTавтоматически устанавливается с помощьюzsh)также должны быть защищены, но обычно они не защищены. t не содержат каких-либо проблемных символов, при условии, что вы не измените значение IFSдля включения символа, который появляется в имени хоста.

2
18.03.2021, 23:27

Теги

Похожие вопросы