Собрался тут на досуге подточить конфиг своего zsh и столкнулся с довольно странным поведением — перестала обновляться строка статуса. Проблему я в итоге решил, чем и хочу поделиться.
Итак моя статусная строка состояла из отображения текущего пути, текущей ветки git и версий ruby и nodejs из asdf. Т.к. работаю с разными проектами и версиями которые переключаются автоматически то для меня важно видеть какая версия является текущей в данный момент. Но т. к. эта информация вторичная, но версии выводятся справа.
В zsh для этого у нас есть переменная RPROMPT, в которую соответственно можно вывести различные переменные. Долгое время я по своему скудоумию использовал для этого функцию zsh precmd (), которая вызывалась при смене текущей папки. В этой функции я зачитывал нужные переменные, а RPROMPT их благополучно отображал.
Но т. к. я слегка расширил кругозор и решил вынести все визуальные свистелки и перделки в собственную тему, то понял, что в общем-то RPROMPT может обновляться и сам при каждой смене папки. Соответственно используя вместо переменных функцию можно добиться того-же результата не насилуя precmd ().
И вот тут-то меня и подстерегал сюрприз — RPROMPT категорически отказался обновляться при переходе по папкам. Единственный вызов моих функций осуществлялся только при старте zsh. Не скажу, что решение нашлось быстро, но нашлось и оказалось довольно банальным.
Итак чтобы заставить RPROMPT обновляться при переходе по папкам нужно:
- Задать опцию
setopt prompt_subst
- Строку RPROMPT задавать завернув в одинарные кавычки, а не в двойные
Соответственно сейчас мой терминал выглядит вот так
Ссылка на тему
https://gist.github.com/webhive/761f1cefe36c386514e4737c1fcb6e1b
Комментарии