Разворачивание конфигов Emacs в одну команду
Задача
Итак, что мы имеем
- Машина с *nix на борту
- Сеть Интернет
- Сырой emacs
Что хотим получить
После выполнения единственной команды emacs готов к использованию также, как и на “родной” (домашней/рабочей) машине.
Немного предыстории
Когда-то давно (два года назад) меня научили пользоваться vagrant’ом. И для правки внутренних конфигов (недоступных с хоста) был выбор из трёх вариантов:
- не париться и использовать nano.
- поставить emacs и использовать его в сыром виде
- поставить emacs и в очередной раз руками копировать все настройки и пакеты.
Сначала я пользовался первым вариантом, затем мне надоело и я стал пользоваться третьим, а потом лень заставила перейти на второй.
Но меня это абсолютно не устраивало. Я хотел иметь в каждой виртуалке (а я обычно держал по виртуалке на проект, чтобы не было коллизий) установленный и сконфигурированный emacs, но делать это руками я никак не хотел.
В результате я потратил 3 дня и сделал “систему” разворачивания конфигов и пакетов.
Что нам потребуется
- Python. Если его в системе нет, то вы сами знаете, что надо сделать.
- Git. Тут тоже всё понятно.
Использованные технологии
Естественно, я не писал всё с нуля, а использовал готовые технологии.
Cask
Страница проекта (раньше была тут)
Для него-то и нужен python. Cask делает за нас всю грязную работу: устанавливает пакеты из файла (Caskfile) и делает это ещё и с учётом версий (отдельные установки на каждую версию).
Причём рассчитан он изначально на разработку программ и подпрограмм на emacs lisp. Но кто запрещает нам использовать его для поддержки проекта под названием emacs? :-)
Разработчики Cask либо изначально на это рассчитывали, либо быстро смекнули — на странице проекта написано про возможность использования для поддержания зависимостей emacs.
Pallet
Когда стало понятно, что Cask может быть использован для поддержания списка пакетов emacs’а, парни запилили недостающий компонент — систему для работы с Caskfile’ами из самого emacs’а.
Базовые функции этого пакета для меня сводятся к двум командам:
- Создание Caskfile’а на основе загруженных пакетов в запущенном emacs’е
- Установка пакетов из Caskfile’а.
Пользоваться для бутстрапа emacs’а мы будем только первой.
Как сделано
Начинаем
Итак, первое, что нам нужно сделать — установить cask и pallet.
Теперь открываем рабочий emacs и выполняем команду
pallet-init
Затем добавляем Caskfile в папку .emacs.d git-репозитория с нашими конфигами.
Готово! Мы восхитительны! Ну, почти…
Немного самописной автоматизации
Теперь нам достаточно скачать репку, установить на целевой машине cask и запустить установку пакетов. Но не будем же мы это делать руками?
Этим должна заниматься ЭВМ, благо энергии и сил у неё хоть отбавляй, а ума маловато.
Так вот, нам нужно автоматизировать шаги
- Установить cask.
- Выполнить установку пакетов через cask install.
Я выбрал самый топорный способ — скрипт на bash. Хотя никто не запрещает сделать это на python, к примеру. Мой скрипт на Github.
Мой скрипт достаточно стрёмный, поэтому если у вас есть хоть капля самоуважения — рекомендую его переписать или вообще написать с нуля. Мне уже лень.
Результат
В результате мы для разворачивания emacs должны руками выполнить только два шага
- Установить emacs.
- Запустить скрипт установки.
Первый шаг я не стал автоматизировать, ибо слишком сильно для разных платформ различается, а мне всё это описывать лень.
Второй выполняется так:
$ wget https://raw.github.com/ivalentinee/emacs_config/master/install.sh | bash
Вот теперь мы точно восхитительны!