Это вторая часть серии Настройка Emacs с нуля.
Вы можете прочитать первую часть здесь.

В последней части мы изменили некоторые значения Emacs по умолчанию. Но Emacs вовсе не ограничивается настройкой значений по умолчанию. Emacs имеет огромную экосистему внешних пакетов, которые вы можете установить. Менеджер пакетов по умолчанию для Emacs называется пакет. Пакет может получать пакеты из нескольких источников. Elpa (архив пакетов Emacs Lisp) - это источник, который он использует по умолчанию. Но пользователи обычно добавляют Melpa и Marmalade в свой список источников пакетов.

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

Установка пакетов

Сначала мы скажем package включить Melpa в свой список архивов пакетов. Для этого добавьте эти строки в свой init.el:

(require 'package)
(package-initialize)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/") t)

Первая строка указывает Emacs загрузить функцию / файл с именем «package». Это загрузит функции и переменные из package.
Вторая строка - это некоторая инициализация, которую выполняет package.
Третья строка сообщает пакету, что нужно добавить melpa в package-archives. В Elisp пару можно построить с помощью (<element 1> . <element 2>). Последний аргумент t означает, что пара должна быть добавлена ​​в список. Без t пара будет добавлена ​​к package-archives.

Перейдите в конец строки (require 'package) и выполните ее, нажав C-x C-e. Сделайте то же самое с (package-initialize). Теперь проверьте, каково значение package-archives с C-h v package-archives, как мы это делали все это время. Выполните вызов функции add-to-list, а затем проверьте значение package-archives, чтобы убедиться, что melpa добавлен. Также обратите внимание, что значение представляет собой список пар.

Давайте посмотрим все пакеты, доступные для Emacs (конечно, из источников, перечисленных в package-archives). Нажмите M-x и запустите package-refresh-contents. Это позволит получить обновленный контент. Теперь вы можете увидеть все пакеты с M-x package-list-packages.

На момент написания этой статьи существует 4705 пакетов (от gnu + melpa). Теперь давайте установим какой-нибудь пакет из этого списка. Тема Emacs по умолчанию довольно непривлекательна, поэтому давайте изменим тему. Найдите spacemacs-theme (на момент написания это было в строке # 4008). Нажмите RET, когда точка находится на имени. Подробная информация о spacemacs-theme откроется в новом окне. Нажмите install (да, я прошу вас щелкнуть мышью / трекпадом. 😛), а затем Yes в окне подтверждения.

Этот пакет содержит светлую и темную версии темы spacemacs, чтобы применить темную версию, нажмите M-x load-theme <RET> spacemacs-dark <RET>. Emacs спросит вас, нормально ли, если эта тема запускает какой-то код - ответьте y. Затем он спросит, следует ли рассматривать эту тему как безопасную для будущих сессий - ответьте y. И вот вам красивая темная тема (используемая Spacemacs)! :)

Emacs, должно быть, добавил код в конец вашего init.el. Когда вы сказали да, чтобы пометить эту тему как безопасную для будущих сеансов Emacs, откуда Emacs должен знать об этом в будущих сеансах? Добавляя код в init.el!
Если вы прочитаете код, вы поймете, что он просто добавляет эту тему в custom-safe-themes.

Чтобы указать Emacs добавить такой код в какой-нибудь другой файл вместо init.el, напишите эту строку в init.el:

(setq custom-file "~/.emacs.d/custom-file.el")

Выполните эту строку. Затем создайте custom-file.el в ~/.emacs.d/ и вставьте код, добавленный Emacs, в этот файл и удалите его из init.el. Также добавьте эту строку в init.el, чтобы убедиться, что custom-file загружен.

(load-file custom-file)

Примечание. Добавление здесь load-file может показаться странным и ненужным. Но позже мы увидим, зачем это нужно.

Подумайте о том, что мы только что сделали: мы перешли к списку всех пакетов, установили пакет и затем использовали его. Как вы думаете, что произойдет, когда вы перезапустите Emacs? Будет ли посылка? Останется ли тема?

Что ж, попробуй! Закройте Emacs (не с помощью кнопки с крестиком; с C-x C-c), а затем запустите его снова.

Что случилось?
Emacs вернулся к своей старой мягкой теме. :(

Пакет был там?
Проверить это несложно. В вашем терминале выполните эту команду:

ls ~/.emacs.d/elpa/

Здесь вы увидите spacemacs-theme. Итак, пакет находится на диске.
(По умолчанию Emacs хранит свои пакеты в каталоге elpa.)

Почему это произошло?
Все очень просто. Когда вы запускаете Emacs, он открывает init.el и выполняет код в нем. Есть ли в init.el какой-нибудь код, который говорит Emacs использовать тему spacemacs-dark? Нет!
Давайте добавим этот код. В конце init.el добавьте эту строку:

(load-theme 'spacemacs-dark)

Выполните эту строку, и вы увидите, что тема применена!
Теперь каждый раз, когда вы перезапускаете Emacs, он будет начинаться с темы spacemacs-dark.

Примечание. Мы написали load-file строку, в которой я сказал, что объясню, почему это было необходимо. Пришло время объяснить следующее:
Когда мы впервые загрузили тему, Emacs спросил нас, безопасно ли использовать эту тему в будущих сессиях, а затем Emacs добавил код, чтобы пометить ее как безопасную. Мы переместили этот код на custom-file.el. Теперь нам нужно убедиться, что код в custom-file.el выполняется перед строкой load-theme, иначе Emacs снова задаст нам те же вопросы. Вот почему необходима строка load-file.

Как обычно, не забывайте писать хорошие комментарии. Ваш init.el должен выглядеть примерно так:

Настройка пакета

У каждого пакета есть несколько переменных, с помощью которых вы можете настроить его поведение. Все переменные имеют префикс имени пакета. Чтобы увидеть переменные spacemacs-theme, нажмите C-h v spacemacs-theme- <TAB>.

Вы можете прочитать подробную информацию о каждой переменной, нажав C-h v <variable-name>. Я подчеркиваю многие C-h команды, потому что очень важно усвоить привычку использовать справочную систему Emacs.

Что мне не нравится в теме spacemacs, так это то, что у комментариев другой цвет фона. Давай изменим это. Вы можете сделать это, написав этот код в init.el:

(setq spacemacs-theme-comment-bg nil)

Эта строка должна быть добавлена ​​перед строкой load-theme, потому что тема должна быть перезагружена после установки этой переменной.

Таким образом, чтобы настроить любой пакет, вы должны просмотреть все переменные, которые он предоставляет. Очень удобно искать переменные, предоставляемые пакетом, поскольку они имеют префикс с именем пакета.

Другой способ настроить его для использования customize меню графического интерфейса пользователя. Customize чрезвычайно полезен, и также важно знать этот способ настройки. Так что давайте заставим spacemacs-theme отображать комментарии курсивом с Customize.

Введите M-x customize <RET>. Вы увидите это:

Перейдите в поле поиска и введите spacemacs-theme <RET>. Вы увидите это:

Первый переключатель Spacemacs Theme Comment Bg выключен и помечен как CHANGED outside Customize. Это правильно, поскольку мы изменили его, написав Elisp в init.el.

Теперь разверните Spacemacs Theme Comment Italic и щелкните Toggle, чтобы включить его. Щелкните Apply and Save и щелкните Yes в окне подтверждения. Нажмите q, чтобы выйти из spacemacs-theme буфера настройки, а затем снова q, чтобы выйти из customize буфера (ваша точка может быть в поле поиска - в этом случае переместите его из поля поиска и затем нажмите q). Загрузите тему еще раз, чтобы изменения вступили в силу.

Теперь, как Emacs (или spacemacs-theme) узнает, что комментарии должны выделяться курсивом при перезапуске? Должно быть, он где-то добавил какой-то код elisp. Угадай где? Пользовательский файл!

Перейдите в файл настройки, и вы увидите два изменения: spacemacs-theme-comment-bg устанавливается на nil, а spacemacs-theme-comment-italic устанавливается на t. Это были измененные значения (отличные от значений по умолчанию) в буфере настройки. Когда вы щелкнули по Apply and Save, Emacs добавил этот код в custom-file.

Меню настройки - хорошее место для поиска настроек, но мы всегда должны возвращать изменения в наш код Elisp. Итак, здесь мы добавим следующую строку в init.el перед строкой load-theme:

(setq spacemacs-theme-comment-italic t)

После этого мы можем удалить эти две строки из настраиваемого файла:
(Не разбалансируйте парантез при этом. Внимательно проверьте парантез.)

'(spacemacs-theme-comment-bg nil)
'(spacemacs-theme-comment-italic t)

Вы, должно быть, заметили одну (досадную) вещь: у нас нет автозаполнения при написании Elisp. Давай исправим это.
Установите пакет company (СОЗДАТЬ ЛЮБОЙ), набрав M-x package-install company <RET>. Чтобы включить его для этого и будущих сеансов Emacs, напишите (global-company-mode t) в init.el и выполните это.
Попробуйте написать какой-нибудь код на Elisp, и вы увидите небольшое окно завершения, отображающее возможные завершения. Например, когда вы напишете load-, вы увидите следующее:

Это мило! Но как перемещаться между этими завершениями?
Клавиши со стрелками. :(
Мы не хотим отходить от стандартной позиции для набора текста вслепую. Давайте изменим привязки клавиш и будем использовать C-n и C-p для навигации между завершениями. Кроме того, завершения появляются с задержкой в ​​0,5 секунды. Давайте сделаем так, чтобы они появлялись без промедления.
Для этого напишите этот код в конце вашего init.el:

(define-key company-active-map (kbd "C-n") 'company-select-next)
(define-key company-active-map (kbd "C-p") 'company-select-previous)
(setq company-idle-delay 0.0)

Здесь мы говорим Emacs использовать C-n для company-select-next и C-p для company-select-previous. Нам нужны эти привязки только тогда, когда у нас отображается буфер автозавершения. В противном случае мы переопределим привязки, чтобы перейти к следующей и предыдущей строкам. Итак, мы говорим Emacs определять эти привязки только в company-active-map. Существуют таблицы ключей для конкретных пакетов, и очень полезно определять определенные привязки только для определенного пакета.
Затем мы говорим Emacs показывать возможные завершения без какой-либо задержки, устанавливая company-idle-delay на 0.0.

Выполните эти строки и попробуйте написать еще немного Elisp. Это будет намного проще с включенным автозаполнением. Попробуйте установить и настроить другой пакет. Теперь в вашем арсенале мощное автозаполнение! :)

Как обычно, не забывайте писать хорошие комментарии. Ваш init.el будет выглядеть примерно так:

Заключение

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

Вы бы также поняли, что параметры настройки в Emacs гораздо более детализированы, чем в любой из IDE. Мы можем настроить даже мельчайшие детали, и это дает нам возможность заставить Emacs вести себя так, как мы хотим! :)

Далее: Как сделать вашу установку организованной и портативной