[О блоге]
[наверх]
[пред]
[2021-05-13 17:02:46+03:00]
[9d4cf2a2b3af496ac3e719dd2c6ee73c4761379e]
Темы: [tip][zsh]
Довольствуюсь zsh-autoenv
https://github.com/Tarrasch/zsh-autoenv
https://direnv.net/
Вспыхнула любовь к этому небольшому плагину для zsh. Вообще я напоролся
изначально на direnv.net. Но запускать, пускай даже очень быструю из-за
Go, команду на каждый чих -- мне не нравится. Я ведь разъярюсь если
увижу задержку в строке приглашения!
Благо есть скрипт для zsh, вполне себе компактный, использующий только
родные zsh возможности -- прозрачные, быстрые и лёгкие, без TOML и
прочего ужаса (для такой простой задачи то!).
У меня есть прилично проектов в которых я храню .init файл, на который
делаю "." чтобы начать "работать" с проектом. Это в основном изменение
разных переменных окружения. Для Python это включение virtualenv-а.
Source я делаю руками. Процедуры "выхода" из проекта нет -- просто
запускаю другой shell. Очень часто бывает что я перехожу не в корень
проекта, а куда-нибудь типа ~/work/nss/dist/FreeBSD12.0_DBG.OBJ/bin,
после чего, точнее после падения на "ld-elf.so.1: Shared object
"libnssutil3.so" not found", выполняю ". ../../../.init", благо,
сохранённый в истории.
Но всё равно ведь не удобно. Для других Си проектов у меня есть
инициализация переменных окружения и ещё "cd ~проект", чтобы и путь был
красивый и чтобы я мог одним только ". ~проект/.init" начать с ним
работу. С Python проектами -- всё иначе.
zsh-autoenv позволяет переходя в директории, найти .autoenv.zsh,
выполнить его, и при выходе из иерархии, возможно выполнить
.autoenv_leave.zsh. Overhead-а от перемещения по директориям толком нет.
Скрипт хэширует содержимое этих файлов и потребует явной авторизации их
исполнения, чтобы не выполнить что-то лишнее ненароком от
склонированного репозитория недоверенного. Теперь просто сделав
"cd ~проект/любые/дебри" у меня и virtualenv и всё что угодно другое
может выполнится автоматом. А выключить virtualenv можно просто через
"echo deactivate >> ~проект/.autoenv_leave.zsh".
Особо понравилось что есть возможность stash (как git stash) переменных
окружения, без надобности их ручного восстановления через _leave.zsh
файл! Супер удобно!
% cat ~nss/.autoenv.zsh
autostash LD_LIBRARY_PATH
ld_library_path=(~nss/dist/lib ~nss/dist/FreeBSD12.0_DBG.OBJ/lib $ld_library_path)
autostash NSPR_LOG_MODULES=all:5 SSLDEBUG=1 SSLTRACE=125
А так как мне не хочется после перезагрузки компьютера на каждый этот
autoenv делать авторизацию исполнения, то я просто явно в .zshrc добавил:
for d (`cat ~/.zautoenv-authorized`)
for f (${~d}/.autoenv.zsh ${~d}/.autoenv_leave.zsh)
[[ -e $f ]] && _autoenv_authorize $f
где в .zautoenv-authorized просто перечислены директории которым я
доверяю. И что прекрасно: так как это всё через zsh выполняется, то и
пути в виде hashed directories (hash -d nss=~/work/nss) применимы.
Прям даже неловко от того, что я ни к чему не могу придраться. Штука
которую я так давно хотел, но не настолько чтобы самостоятельно написать
подобное. Эх... пойду переделывать все свои .init файлы под неё,
автоматом получая восстановление состояния переменных окружения.
Пытаюсь ещё понять а всегда ли мне нужно выполнять этот autoenv --
возможно мне захочется простой перейти в директорию? Но вроде на
практике таких случаев не припоминаю. Ну разве что в Python проектах
придётся иметь задержку от venv-а, но, благо, я с Python довольно редко
уже работаю и редко нуждаюсь просто в путешествии по его коду без запуска.
[оставить комментарий]