Задача

Итак, что мы имеем

  1. Машина с *nix на борту
  2. Сеть Интернет
  3. Сырой emacs

Что хотим получить

После выполнения единственной команды emacs готов к использованию также, как и на “родной” (домашней/рабочей) машине.

Немного предыстории

Когда-то давно (два года назад) меня научили пользоваться vagrant’ом. И для правки внутренних конфигов (недоступных с хоста) был выбор из трёх вариантов:

  1. не париться и использовать nano.
  2. поставить emacs и использовать его в сыром виде
  3. поставить emacs и в очередной раз руками копировать все настройки и пакеты.

Сначала я пользовался первым вариантом, затем мне надоело и я стал пользоваться третьим, а потом лень заставила перейти на второй.

Но меня это абсолютно не устраивало. Я хотел иметь в каждой виртуалке (а я обычно держал по виртуалке на проект, чтобы не было коллизий) установленный и сконфигурированный emacs, но делать это руками я никак не хотел.

В результате я потратил 3 дня и сделал “систему” разворачивания конфигов и пакетов.

Что нам потребуется

  • Python. Если его в системе нет, то вы сами знаете, что надо сделать.
  • Git. Тут тоже всё понятно.

Использованные технологии

Естественно, я не писал всё с нуля, а использовал готовые технологии.

Cask

Страница проекта (раньше была тут)

Для него-то и нужен python. Cask делает за нас всю грязную работу: устанавливает пакеты из файла (Caskfile) и делает это ещё и с учётом версий (отдельные установки на каждую версию).

Причём рассчитан он изначально на разработку программ и подпрограмм на emacs lisp. Но кто запрещает нам использовать его для поддержки проекта под названием emacs? :-)

Разработчики Cask либо изначально на это рассчитывали, либо быстро смекнули — на странице проекта написано про возможность использования для поддержания зависимостей emacs.

Pallet

Страница проекта

Когда стало понятно, что Cask может быть использован для поддержания списка пакетов emacs’а, парни запилили недостающий компонент — систему для работы с Caskfile’ами из самого emacs’а.

Базовые функции этого пакета для меня сводятся к двум командам:

  1. Создание Caskfile’а на основе загруженных пакетов в запущенном emacs’е
  2. Установка пакетов из Caskfile’а.

Пользоваться для бутстрапа emacs’а мы будем только первой.

Как сделано

Начинаем

Итак, первое, что нам нужно сделать — установить cask и pallet.

Теперь открываем рабочий emacs и выполняем команду

pallet-init

Затем добавляем Caskfile в папку .emacs.d git-репозитория с нашими конфигами.

Готово! Мы восхитительны! Ну, почти…

Немного самописной автоматизации

Теперь нам достаточно скачать репку, установить на целевой машине cask и запустить установку пакетов. Но не будем же мы это делать руками?

Этим должна заниматься ЭВМ, благо энергии и сил у неё хоть отбавляй, а ума маловато.

Так вот, нам нужно автоматизировать шаги

  1. Установить cask.
  2. Выполнить установку пакетов через cask install.

Я выбрал самый топорный способ — скрипт на bash. Хотя никто не запрещает сделать это на python, к примеру. Мой скрипт на Github.

Мой скрипт достаточно стрёмный, поэтому если у вас есть хоть капля самоуважения — рекомендую его переписать или вообще написать с нуля. Мне уже лень.

Результат

В результате мы для разворачивания emacs должны руками выполнить только два шага

  1. Установить emacs.
  2. Запустить скрипт установки.

Первый шаг я не стал автоматизировать, ибо слишком сильно для разных платформ различается, а мне всё это описывать лень.

Второй выполняется так:

$ wget https://raw.github.com/ivalentinee/emacs_config/master/install.sh | bash

Вот теперь мы точно восхитительны!