Очень хороший вопрос.
Похоже, что основной ответ лежит в алгоритме сортировки Unicode .
Я начал читать это из интереса, дошел до нормализации , но тут мой мозг взорвался. Поэтому я заключаю, что вся сортировка осуществляется по волшебству, и на этом останавливаюсь.
Вы устанавливаете содержимое подсказки раз и навсегда при обработке .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
для включения символа, который появляется в имени хоста.