© 2021 WebHive

Неочевидный нюанс при написании плагинов для ZSH

Собрался тут на досуге подточить конфиг своего zsh и столкнулся с довольно странным поведением — перестала обновляться строка статуса. Проблему я в итоге решил, чем и хочу поделиться.

Итак моя статусная строка состояла из отображения текущего пути, текущей ветки git и версий ruby и nodejs из asdf. Т.к. работаю с разными проектами и версиями которые переключаются автоматически то для меня важно видеть какая версия является текущей в данный момент. Но т. к. эта информация вторичная, но версии выводятся справа.

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

Но т. к. я слегка расширил кругозор и решил вынести все визуальные свистелки и перделки в собственную тему, то понял, что в общем-то RPROMPT может обновляться и сам при каждой смене папки. Соответственно используя вместо переменных функцию можно добиться того-же результата не насилуя precmd ().

И вот тут-то меня и подстерегал сюрприз — RPROMPT категорически отказался обновляться при переходе по папкам. Единственный вызов моих функций осуществлялся только при старте zsh. Не скажу, что решение нашлось быстро, но нашлось и оказалось довольно банальным.

Итак чтобы заставить RPROMPT обновляться при переходе по папкам нужно:

  1. Задать опцию setopt prompt_subst
  2. Строку RPROMPT задавать завернув в одинарные кавычки, а не в двойные

Соответственно сейчас мой терминал выглядит вот так

Ссылка на тему

https://gist.github.com/webhive/761f1cefe36c386514e4737c1fcb6e1b

Источник

Комментарии