вступление

Я использую Emacs уже 6 лет, и последние пару лет Emacs был моим основным инструментом для написания Clojure в Helpshift Inc. За эти годы я осознал ценность Emacs. Это сделало меня продуктивным на работе, а организационный режим, безусловно, сделал меня более дисциплинированным. Идея редактора, который вы можете настраивать во время работы, сама по себе потрясающая! :)

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

Установка и интерактивное руководство

Я собираюсь использовать Emacs 26.1 на macOS. Вы можете получить его здесь для macOS, Linux или Windows.
(Версия на самом деле не имеет значения. Большая часть написанного здесь будет работать для любой версии Emacs.)

Как только вы запустите Emacs, вы увидите это:

Я бы посоветовал всем пройти через раздел «Учебник по Emacs», показанный выше. Способ работы Emacs немного отличается, и это интерактивное руководство прекрасно объясняет его. Это немного длинновато, но вы не пожалеете, что потратили на это время.

Но прежде чем вы пройдете через руководство, рассмотрите возможность сопоставления клавиши Caps Lock для управления. Управление часто используется в Emacs, и если вы не используете Caps Lock в качестве элемента управления, вы будете страдать от мизинца Emacs. Вот как это сделать для macOS, Linux и Windows.

Если вы не хотите это читать (хотя вам действительно стоит!), Вот суть учебника:

Краткое содержание учебника

(Если вы следовали интерактивному руководству, пропустите этот раздел и перейдите в раздел Настройка значений по умолчанию)

  • Emacs часто использует клавиши control и meta (alt / option). Привязки клавиш с control и meta будут описаны как C-<key> и M-<key> соответственно.
  • Нажмите C-x C-c (C-x, а затем C-c), чтобы выйти из Emacs.
  • C-g выйдет из текущей операции. Так что, если вы застряли и не знаете, что делать, нажмите C-g.
  • Местоположение курсора называется в Emacs «точкой».
  • Используйте C-f для перемещения точки вперед, C-b для назад, C-n для перехода к следующей строке и C-p для предыдущей строки.
  • C-a для перехода к началу текущей строки. C-e для конца текущей строки.
  • C-v для перехода к следующей странице. M-v для предыдущей страницы.
  • Приведенные выше привязки клавиш при использовании с мета будут работать с абстракциями на уровне слов. Например, M-f переместит курсор на одно слово вперед (против одного символа с C-f). M-a, M-e будут перемещаться между предложениями.
  • Файлы открываются в «буферах» в Emacs. Может быть буфер, не связанный ни с одним файлом. Но с файлом всегда будет связан буфер, когда вы откроете его в Emacs.
  • M-< (Мета + Меньше чем) перенесет вас в начало буфера, а M-> (Мета + Больше чем) перенесет вас в конец буфера.
  • Нажмите C-x k <RET>, чтобы убить буфер.
  • Нажмите C-x 3, чтобы разделить окно Emacs по горизонтали. Нажмите C-x 1, чтобы убрать разделенный экран.
  • Нажмите C-x C-f, чтобы открыть файл.
  • C-x C-s, чтобы сохранить изменения.
  • Когда вы открываете несколько файлов, предыдущий буфер остается активным. Чтобы перейти к предыдущему буферу, нажмите C-x b, введите имя буфера (имя файла) и нажмите <RET>.
  • Чтобы увидеть список буферов, нажмите C-x C-b. Нажмите q, чтобы закрыть это окно.
  • Термин «Windows» в Emacs отличается от того, который используется в вашей ОС. В Emacs «окна» ОС называются «фреймами». Разделенные экраны в Emacs называются «окнами». Например, когда вы разделяете экран, вы можете сказать, что у вас есть 2 «окна».
  • Используйте C-x o для перемещения между окнами.
  • C-d удалит символ в обратном направлении.
  • C-k удалит текст от точки до конца текущей строки.
  • Для поиска текста нажмите C-s и введите текст для поиска. Нажав на C-s после этого, вы перейдете к следующему месту появления текста. C-s движется в прямом направлении, а C-r - в обратном. Оба имеют упаковывающее поведение. Нажмите RET, чтобы остановить поиск и переместить точку к текущему вхождению.
  • Если ваша точка находится на каком-то тексте, который вы хотите найти, нажмите C-s w, чтобы заполнить минибуфер поиска текстом под точкой.
  • Вы можете использовать аргументы префикса для повторения команд. Нажмите C-u, чтобы задать команде аргумент префикса. Например, чтобы перейти на 10 страниц вперед, вы можете нажать C-u 10 C-v. Или, чтобы добавить строку из 72 *s, нажмите C-u 70 *.
  • Вместо перетаскивания для выделения текста нажмите C-<SPC> (Control + Пробел) в том месте, где вы хотите начать перетаскивание, а затем переместите точку в то место, где вы хотите закончить. Выбранный текст будет выделен. Нажмите C-w, чтобы вырезать, или M-w, чтобы скопировать.
  • Чтобы вставить, нажмите C-y. Вставка в терминологии Emacs называется «дерганием». «Разрезание» называется «убийством».
  • Вы также можете восстановить текст, который был убит ранее, нажмите C-y, а затем продолжайте нажимать M-y. Вы будете продолжать видеть свою историю убийств. Это потому, что Emacs сохраняет уничтожаемый вами текст в кольцевой структуре данных, называемой «kill ring».
  • Чтобы отменить, нажмите C-/. Отмена в Emacs сильно отличается от других редакторов. (Вы можете прочитать об этом в Руководстве; или просто поиграйте с ним, чтобы узнать, как это работает.)
  • В Emacs есть понятие режимов. Для любого буфера существует один основной режим и может быть несколько второстепенных режимов. Например, если вы откроете файл с исходным кодом Python, основным будет режим Python. Emacs попытается определить и использовать правильный основной режим для любого файла, который вы открываете. Второстепенные режимы - это режимы, которые выполняют небольшие задачи, такие как автоматический отступ, проверка орфографии, отображение номеров строк и т. Д. Таким образом, для каждого буфера можно включить более одного второстепенного режима.
  • Строка, которую вы видите в нижней части Emacs:

  • Она называется «строкой режима» и отображает полезную информацию о текущем буфере и состоянии Emacs. Например, он показывает, какой основной режим включен в данный момент. На изображении выше это «Основной» режим.

Настройка значений по умолчанию

Теперь, когда мы завершили интерактивное учебное пособие по Emacs, мы не хотим, чтобы Emacs отображал учебное сообщение при запуске Emacs. Когда Emacs запускается, он ищет один из этих двух файлов: ~/.emacs.d/init.el или ~/.emacs. Если он найдет один из них, он начнет выполнение кода в этих файлах. Код в этих файлах должен быть кодом Elisp. Emacs Lisp или Elisp - это язык, созданный для Emacs и используемый им.

Итак, теперь мы продолжим и создадим этот файл.

  • Нажмите C-x f и напишите .emacs.d/init.el (~/ уже будет) и нажмите <RET>. Откроется новый буфер.
  • Запишите это содержимое в этот буфер: (setq inhibit-startup-message t) и сохраните (C-x C-s).
  • Закройте Emacs и перезапустите.
  • Emacs не будет показывать экран учебника, вместо этого он начнется с буфера с именем *scratch*. По соглашению, буферы, имена которых начинаются и заканчиваются на *, не имеют связанных с ними файлов.

Поздравляем с первой настройкой Emacs! :)

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

(setq inhibit-startup-message t)

Проще говоря, setq - это функция, которая устанавливает значение данной переменной на данное значение. В этом случае он установит inhibit-startup-message в t.

Сейчас хорошее время, чтобы воспользоваться функцией самодокументирования Emacs. setq - это функция, и мы можем получить помощь по функциям, нажав C-h f (C-h для справки и f для функций). Нажмите C-h f, введите setq и нажмите <RET>. В окне откроется буфер с именем *Help* (опять же, не связанный с файлом), который будет содержать информацию о функции setq. Нажмите C-x 1, чтобы снова развернуть *scratch*.

Теперь посмотрим, что такое inhibit-startup-message. Поскольку это переменная, мы попросим Emacs рассказать нам больше о переменных, нажав C-h v. Нажмите C-h v, введите inhibit-startup-message и нажмите RET. Обратите внимание, что для переменных также отображается их текущее значение. На этот раз, чтобы закрыть окно документации, переключитесь на него с помощью C-x o, а затем нажмите q.

Почему закрывалось это окно справки, когда мы нажимали q? Окно *scratch* не закрывается при нажатии q, оно просто вставляет букву q. Давай узнаем почему!

В Emacs каждая клавиша привязана к функции, и есть способ выяснить, какая клавиша привязана к какой функции. И эти привязки для каждого буфера. Итак, q должен быть связан с двумя разными вещами, поскольку мы видим два разных поведения при нажатии q.

Перейдите в буфер справки, нажав C-x b *Help* <RET>. А теперь давайте выясним, с чем связан q. Нажмите C-h k и нажмите q. «Q запускает команду quit-window». Теперь мы знаем, почему q закрывает окно; он выполнял функцию quit-window.

Давайте разберемся, с чем связан q в *scratch* буфере. Закройте окно справки, нажав, угадайте, q! Вы вернетесь в буфер *scratch*. Теперь нажмите C-h k, а затем q. «Q запускает команду self-insert-command». self-insert-command просто вставляет набранный вами символ. Таким образом, все печатаемые символы на клавиатуре должны быть привязаны к «self-insert-command». Вы можете попробовать это проверить. Кроме того, вы можете прочитать документацию для «self-insert-command» точно так же, как мы читаем документацию для setq.

Теперь мы полностью понимаем, почему q по-разному действовал в разных буферах. И угадайте, мы ни разу не покидали Emacs! :)
(Что-нибудь интересное, чтобы попробовать самостоятельно: узнать, с чем связан C-h k.)

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

Так что давайте отключим это. Перейдите в свой init.el буфер и напишите (tool-bar-mode -1) в новой строке. Теперь давайте заставим этот код вступить в силу без перезапуска Emacs.

Выполните этот код, поставив один символ после закрывающей круглой скобки. Нажмите C-x C-e, чтобы выполнить этот код. Панель инструментов исчезла!
Поздравляем с первой настройкой Emacs в реальном времени! :)
(Теперь вы должны выяснить, к чему привязан C-x C-e. Это хорошая привычка всегда проверять, какие функции вы используете, а не просто запоминать привязки клавиш.)

Теперь давайте отключим строку меню и полосу прокрутки. Поместите этот код в новую строку в ini.el:

(menu-bar-mode -1)
(scroll-bar-mode -1)

Чтобы четко видеть, на какой строке вы находитесь, вы можете выделить текущую строку с помощью этого кода: (global-hl-line-mode t). Вам нужно будет выполнить эту строку, как мы делали раньше.

Еще одна важная вещь, которой не хватает, - это знать номера строк и номеров столбцов. Для этого добавьте (line-number-mode t). Вы увидите (строка №, столбец №) координаты местоположения точки в строке режима. Чтобы перейти к определенной строке, нажмите M-g M-g, введите номер строки и нажмите <RET>.

[Если вы используете macOS, проще использовать «командные» клавиши как «мета». Добавьте эту строку, чтобы это произошло: (setq mac-command-modifier 'meta).]

В последних 4 строках Elisp, приведенных выше, мы просто меняем второстепенные режимы. Мы отключили второстепенные режимы, которые отображают панель инструментов, строку меню и полосу прокрутки; мы включили второстепенный режим, который выделяет текущую строку в буфере. Если вам нужна дополнительная информация о включенных в настоящее время основных и второстепенных режимах, нажмите C-h m. При нажатии открывается минибуфер. Помимо прочего, этот буфер будет описывать обычно необходимые привязки клавиш для соответствующих режимов.

Теперь, когда мы увидели, как настроить параметры Emacs по умолчанию в соответствии с вашими потребностями, вы можете прочитать раздел Используйте лучшие значения по умолчанию в моей конфигурации Emacs и выбрать то, что было бы вам полезно.
[ Пользователи Linux и macOS: пожалуйста, пройдите Лучшее взаимодействие с буфером обмена X.]

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

Заключение

На протяжении этого сеанса мы использовали C-h <some key> много раз. C-h - это префиксный ключ для получения помощи в Emacs. Мы использовали его здесь достаточно хорошо, и вам следует продолжать следовать этому шаблону использования справки, чтобы узнать больше о Emacs! :)
Знание того, как пользоваться справочной системой, имеет решающее значение для освоения Emacs!

Далее: Установка и настройка новых пакетов