Что: 9d4cf2a2b3af496ac3e719dd2c6ee73c4761379e Когда: 2021-05-13 17:02:46+03:00 ------------------------------------------------------------------------ Темы: 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 довольно редко уже работаю и редко нуждаюсь просто в путешествии по его коду без запуска. ------------------------------------------------------------------------ оставить комментарий: mailto:comment@blog.stargrave.org?subject=Re:%20%D0%94%D0%BE%D0%B2%D0%BE%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%81%D1%8C%20zsh-autoenv%20%289d4cf2a2b3af496ac3e719dd2c6ee73c4761379e%29 ------------------------------------------------------------------------ Сгенерирован: SGBlog 0.34.0