[О блоге] [наверх] [пред] [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 довольно редко
уже работаю и редко нуждаюсь просто в путешествии по его коду без запуска.

    [оставить комментарий]