Emacs. Большая и сложная программа. Ему как ничему другому подходит это определение. Эмакс был создан очень давно в лаборатории искуственного интллекта MIT, он несет в себе гены очень своеобразной культуры лисп-хакеров былых времен. С тех пор он не раз переписывался, улучшался, дополнялся и обрастал тысячами расширений в течение десятков лет. Эмакс, если и был когда-то мощным текстовым редактором, сейчас стал некоей универсальной программой, в нём можно делать абсолютно всё что угодно, если это хотя бы немного затрагивает собой задачу отображения или редактирования текста, и даже больше. Людям знающим универсальность играет на руку, ведь одной программой можно делать тысячу разных дел, при этом не прилагая усилий для переучивания к разным интерфейсам. Людей, впервые запустивших эмакс подобная универсальность и непривычный интерфейс поначалу пугает. Научиться пользоваться эмаксом, понять его идею и проникнуться ею задача непростая, трудоемкая и долгая (как говорится, пологая кривая обучаемости).
Напутствие начинающим пользователям подобного рода врядли вызовет у них энтузиазм, скорее наоборот, но… дорогу осилит идущий и тут главное начать—часто эмакс становится чем-то вроде игрушки.
Настройка эмакса это своего рода декоративно-прикладное искусство, она—одновременно благословение и проклятье пользователя. В отличие
от vi, главная прелесть которого, на мой взгляд, в том, что в нём всё «из коробки» прекрасно настроено—бери да пользуйся, эмакс в
своем изкоробочном состоянии далеко не так хорош и удобен, как мог бы быть. С первого же запуска начинается эпопея—эмаксер затачивает редактор под себя, ставит расширения, заводит свои конфигурационные файлы, подсматривает кусочки кода у других, по крупицам собирает свои собственные настройки по всей сети—со временем накапливается приличная база кода. И всё бы ничего, но процесс доводки до более-менее юзабельного состояния очень долог—на это могут уйти целые месяцы и даже годы (на самом деле настройка эмакса не прекращается никогда).
Всё то время, что я пользовался эмаксом я именно так и поступал: собирал конфиг по кусочкам из тысячи разных мест—форумы (в основном ЛОР), хабр, эмакс-вики, статьи, репозитории с настройками продвинутых пользователей (в основном Alex Ott), и т.п. В итоге конфиг разросся и превратился в страшную кашу. В общем, всё было плохо пока я не наткнулся на замечательный скринкаст Meet Emacs от Peepcode. В скринкасте автор не усердствует с базовой настройкой, а сразу после установки эмакса копирует в свою директорию
Оригинальный Emacs Starter Kit (ныне «центральный репозиторий» оного на github.com)—это личный конфиг Фила Хагельберга (Phil Hagelberg aka Technomancy), собранный им за долгие годы использования эмакса. Сейчас же kit—это сотни форков репозитория и тысячи следящих за ним на гитхабе.
Starter Kit рассчитан на легкую расширяемость пользовательскими настройками и на легкую переносимость одной конфигурации между машинами пользователя—так что владельцам нескольких компьютеров должно понравиться.
Для работы требуется GNU Emacs версии 22 или выше. С форками вроде XEmacs работать не будет.
Установка Emacs Starter Kit элементарна: клонируйте репозиторий с гитхаба в директорию
Вуаля. Запускайте Emacs.
Чтобы запустить эмакс с kit'ом на посмотреть—склонируйте репозиторий в какую-нибудь другую директорию и запустите эмакс командой:
В директории
Самый главный файл—это
Следующими подгружаются файлы
В последнюю очередь загружаются пользовательские файлы:
Пакетный менеджер для эмакса. Уже сейчас в больше сотни популярных расширений, автоматически поддерживает зависимости между ними. Элементарен в использовании: M-x package-list-packages, i—отметить для установки, x—установить. Пакеты устанавливаются в директорию
![ELPA](https://habrastorage.org/r/w780q1/getpro/habr/post_images/f9b/c1a/bc2/f9bc1abc2ec8c1294b02e6f0d8517816.jpg)
Для автоматической установки нужных пакетов при первом запуске эмакса нужно отредактировать переменную
Starter Kit развивается уже очень давно и из
Режим ido везде где нужно—при переключении буферов, открытии и сохранении файлов и прочем, в минибуфере он очень облегчает выбор вариантов.
![ido-find-file](https://habrastorage.org/r/w780q1/getpro/habr/post_images/ee1/a37/fe5/ee1a37fe5cdfe201297585a6aa19264e.jpg)
Еще одна жутко удобная фича—imenu, позволяет прыгнуть к определению символа в исходнике, вызывается по C-x i или C-x Tab
![ido-imenu](https://habrastorage.org/r/w780q1/getpro/habr/post_images/4fe/222/776/4fe222776e9b747075cc4861f5e805c3.jpg)
Более функциональная замена стандартной переключалке буферов.
![ibuffer](https://habrastorage.org/r/w780q1/getpro/habr/post_images/fb6/f6b/5a0/fb6f6b5a026e8651704ba3b5e2b26eff.jpg)
Полоска сбоку, показывающая конец буфера. Очень удобная.
Уж не знаю, один ли я такой, но раньше мне приходилось запускать vi под sudo специально для редактирования системных файлов. В kit'е есть функция M-x sudo-edit.
Лямбды в лиспокоде отображаются греческими буквами λ. Только вчера добавилась замена fn на ƒ в исходниках Clojure.
![fn-in-clojure](https://habrastorage.org/r/w780q1/getpro/habr/post_images/a4e/fd9/dc0/a4efd9dc083a850b9e8523f8697eab4c.jpg)
Множество всевозможных удобств для пользователей динамических языков: JavaScript, Emacs Lisp, Clojure, Common Lisp, Ruby, Perl. Сам-то в основном лиспами пользуюсь, поэтому улучшения в режимах лиспа и приведу.
В первую очередь это, конечно, paredit-mode—режим структурного редактирования лиспокода. Проще говоря, он расставляет, переставляет и удаляет скобочки с учётом семантики кода. Возможно, сразу его освоить не получиться, потому что этот режим выполнен в лучших традициях эмакса с добрым десятком зубодробительных комбинаций, но после длительного использования и привыкания без него будет уже непросто.
Показываются аргументы функций Emacs Lisp'а в минибуфере.
![show-elisp-args](https://habrastorage.org/r/w780q1/getpro/habr/post_images/aad/d63/f63/aadd63f63b3ca59cba0c2e3f9c2a955b.jpg)
Нет скроллбара, нет тулбара, нет меню, нет диалоговых окон. Всего этого нет, ибо экономия движения—наше всё. Графические элементы управления требуют мышь, а чтобы дотянуться до мыши нужно оторвать руку от клавиатуры, в случае меню еще потратить уйму времени на поиск нужного пункта. От того, что эти элементы управления отключены—от пользователя не убудет—функционал отключеных элементов продублирован в интерфейсе. Во время редактирования если и используются меню, то это меню текущих режимов, а они доступны в полоске modeline. Скроллбар прекрасно заменяется стандартными клавишами для перемещения по буферу и колёсиком мыши. Тулбар же просто не нужен—выполнить любое действие проще через кейбиндинг.
Честно говоря, комбинации клавиш в Emacs Starter Kit мне не очень нравятся, тем более, что они не сильно отличаются от стандартных. Так что я приведу некоторые свои комбинации (которые можно найти в файле
Сперва, однако, стоит вспомнить о том, что Emacs—древнейшая ныне живая и широко используемая софтина, и оригинальные кейбиндинги рассчитаны вовсе не на современные PC/Apple/… клавиатуры, а на клавиатуры почивших 20 лет назад лисп-машин (например, в мануале по Zmacs для Ti Explorer 1985 года можно найти те же самые комбинации, что используются сейчас). Вспомнить и принять меры, иначе незадачливый эмаксер рискует стать жертвой «синдрома эмаксового мизинца»—из-за активного использования клавиши Control, которую на современных клавиатурах жуть как неудобно нажимать несколько сотен раз в час. Есть много способов сохранить здоровье своих рук:
Итак, расскажу о некоторых своих комбинациях:
C-m
Альтернатива клавише Enter. Комбинация особенна полезна как окончание в цепочке, в которой все клавиши нажимаются вместе с Control'ом—чтобы не отпускать его и тянуться к Enter, например я переключаюсь между буферами даже не отжимая Control: C-Tab C-s C-s C-s C-m. Еще это комбинация полезна как замена M-x: C-x C-m, если до альта долго тянуться.
C-w
Практически во всех эмуляторах терминалов эта клавиша удаляет слово слева от курсора, в эмаксе же она не делает ничего хорошего. Я забиндил на неё удаление слова назад и вырезание региона, если он выделен—это очень удобно, Backspace практически не нужен. Ко всему, M-w копирует выделенный регион.
C-g
Забудьте об Esc. Если что-то пошло не так—это клавиша универсальной отмены.
C-q
Замена C-/. Отмена редактирования. Таким образом ряд сочетаний, который в стандартных оконных системах расположен внизу— C-z, C-x, C-c у меня переезжает наверх— C-q, C-w, M-w. (Если кто подскажет как совместить эту клавишу с C-g—буду очень благодарен).
C-Tab
Обычно я держу очень много буферов и часто между ними переключаюсь. Нажимать для этого двумя руками C-x b—невероятная расточительность.
S-Tab, C-S-Tab
Переход на следующее/предыдущее окно. Быстро и удобно. Таким образом, три клавиши, расположенные вплотную одна-над-другой используются для переключения между буферами.
C-x C-k
Убивать буфер гораздо легче не отпуская клавишу Control—так можно в разы быстрее убить сразу несколько буферов.
C-s, C-r
Эти клавиши привязаны к поиску по регэкспу вперёд и назад. Помнится, один из авторов Макинтоша, Джеф Раскин, положил подобный поиск в основу интерфейса компьютера для работы с текстом Cannon Cat. Это конечно, не Cannon Cat, но тоже ничего.
Эти клавиши используются не только для поиска в буфере, но и для перехода к следующему/предыдущему элементу в минибуфере в режиме ido—для переключения между буферами или для поиска и открытия файла. И еще в режиме выделения региона.
S-Space
Очень умное автодополнение. Иногда достаточно просто раз пять нажать эту комбинацию и программа чудесным образом напишется сама.
M-Space
Переключение между языками. Две легко доступные, вплотную расположенные клавиши—это лучший вариант.
F3, F4, F4
Начало записи макроса, конец записи макроса, вызов макроса.
В общем, если пользуетесь Эмаксом—очень рекомендую поставить Emacs Starter Kit—с ним Эмаксом даже можно пользоваться :)
Литературную версию программы Emacs Starter Kit смотрите в моем блоге.
Напутствие начинающим пользователям подобного рода врядли вызовет у них энтузиазм, скорее наоборот, но… дорогу осилит идущий и тут главное начать—часто эмакс становится чем-то вроде игрушки.
1.1 Настройка
Настройка эмакса это своего рода декоративно-прикладное искусство, она—одновременно благословение и проклятье пользователя. В отличие
от vi, главная прелесть которого, на мой взгляд, в том, что в нём всё «из коробки» прекрасно настроено—бери да пользуйся, эмакс в
своем изкоробочном состоянии далеко не так хорош и удобен, как мог бы быть. С первого же запуска начинается эпопея—эмаксер затачивает редактор под себя, ставит расширения, заводит свои конфигурационные файлы, подсматривает кусочки кода у других, по крупицам собирает свои собственные настройки по всей сети—со временем накапливается приличная база кода. И всё бы ничего, но процесс доводки до более-менее юзабельного состояния очень долог—на это могут уйти целые месяцы и даже годы (на самом деле настройка эмакса не прекращается никогда).
1.2 Находка
Всё то время, что я пользовался эмаксом я именно так и поступал: собирал конфиг по кусочкам из тысячи разных мест—форумы (в основном ЛОР), хабр, эмакс-вики, статьи, репозитории с настройками продвинутых пользователей (в основном Alex Ott), и т.п. В итоге конфиг разросся и превратился в страшную кашу. В общем, всё было плохо пока я не наткнулся на замечательный скринкаст Meet Emacs от Peepcode. В скринкасте автор не усердствует с базовой настройкой, а сразу после установки эмакса копирует в свою директорию
.emacs.d
репозиторий emacs-starter-kit. Сперва я скептически отнёсся к такому подходу, но попробовав starter kit раз, удалив, и попробовав во второй раз я проникся: его оказалось достаточно чтобы просто пользоваться эмаксом, не задумываясь о его серьезных улучшениях. Всё что мне осталось—установить через пакетный менеджер эмакса и операционной системы необходимые мне расширения, да добавить настройки шрифтов и клавиатуры для нетбука и настольного компьютера.2 Emacs Starter Kit
Оригинальный Emacs Starter Kit (ныне «центральный репозиторий» оного на github.com)—это личный конфиг Фила Хагельберга (Phil Hagelberg aka Technomancy), собранный им за долгие годы использования эмакса. Сейчас же kit—это сотни форков репозитория и тысячи следящих за ним на гитхабе.
Starter Kit рассчитан на легкую расширяемость пользовательскими настройками и на легкую переносимость одной конфигурации между машинами пользователя—так что владельцам нескольких компьютеров должно понравиться.
Для работы требуется GNU Emacs версии 22 или выше. С форками вроде XEmacs работать не будет.
2.1 Установка
Установка Emacs Starter Kit элементарна: клонируйте репозиторий с гитхаба в директорию
.emacs.d
(предварительно сохранив свои старые настройки и удалив .emacs
):git clone http://github.com/technomancy/emacs-starter-kit.git ~/.emacs.d
Вуаля. Запускайте Emacs.
Чтобы запустить эмакс с kit'ом на посмотреть—склонируйте репозиторий в какую-нибудь другую директорию и запустите эмакс командой:
emacs -q -l ~/emacs-starter-kit/init.el
2.2 Устройство
В директории
.emacs.d
kit'а есть несколько основных файлов:.emacs.d/ ... elpa/ init.el starter-kit-bindings.el starter-kit-defuns.el starter-kit-elpa.el ... ... и пользовательские ... haru.el haru/ color-theme.el info.el irc.el jabber.el haru-desktop.el harubook.jolicloud-domain.el
Самый главный файл—это
init.el
, с него начинается загрузка. Он отключает графический интерфейс, загружает пакетный менеджер эмакса ELPA, и, при первом запуске, доустанавливает из сети несколько полезных пакетов (конечно, можно автоматически доустанавливать еще и свои любимые пакеты).Следующими подгружаются файлы
starter-kit-*.el
—в них находятся всевозможные дополнительные функции, настройки комбинаций клавиш и режимов для некоторых динамических языков—в общем всё то, что делает эмакс более удобным, чем по-умолчанию.В последнюю очередь загружаются пользовательские файлы:
- Файл пользователя—файл с именем текущего пользователя с расширением
.el
на конце, например,haru.el
Starter Kit настолько хорош сам по себе, что в этом файле у меня всего
лишь одна строка лиспокода, которая включает мою цветовую тему.
- Директория пользователя—директория с именем текущего пользователя с множеством
.el
файлов внутри, например,haru/ color-theme-dzhan.el info.el irc.el jabber.el
Я держу в этой директории файлы с настройками режимов—IRC, Jabber, Info, и еще самодельную цветовую тему.
- Файл с настройками машины пользователя—чтобы узнать имя этого файла достаточно вычислить в эмаксе значение функции
(system-name)
и добавить.el
в конец, например:harubook.jolicloud-domain.el
для нетбука иharu-desktop.el
для десктопа.
Я держу в нём настройки дефолтного шрифта и настройку кнопок alt и command для яблочной клавиатуры.
2.3 Фичи
2.3.1 Emacs Lisp Package Archive
Пакетный менеджер для эмакса. Уже сейчас в больше сотни популярных расширений, автоматически поддерживает зависимости между ними. Элементарен в использовании: M-x package-list-packages, i—отметить для установки, x—установить. Пакеты устанавливаются в директорию
~/.emacs.d/elpa
.![ELPA](https://habrastorage.org/getpro/habr/post_images/f9b/c1a/bc2/f9bc1abc2ec8c1294b02e6f0d8517816.jpg)
Для автоматической установки нужных пакетов при первом запуске эмакса нужно отредактировать переменную
starter-kit-packages
в файле starter-kit-elpa.el
. Мне, например никак без Clojure, и я активно пользуюсь сервисом gist.github.com:(defvar starter-kit-packages (list 'idle-highlight 'ruby-mode 'clojure-mode 'clojure-test-mode 'swank-clojure 'slime 'slime-repl 'inf-ruby 'css-mode 'yaml-mode 'magit 'gist))
Starter Kit развивается уже очень давно и из
elpa-to-submit/
, бывает, удаляют код некоторых пакетов, но это ничего—удаленный код перетекает в ELPA. Если с очередным обновлением (я имею в виду pull/merge с «центральным» репозиторием) возникают проблемы—удалите всё из директории ~/.emacs.d/elpa
и запустите M-x starter-kit-elpa-install
.2.3.2 IDO
Режим ido везде где нужно—при переключении буферов, открытии и сохранении файлов и прочем, в минибуфере он очень облегчает выбор вариантов.
![ido-find-file](https://habrastorage.org/getpro/habr/post_images/ee1/a37/fe5/ee1a37fe5cdfe201297585a6aa19264e.jpg)
Еще одна жутко удобная фича—imenu, позволяет прыгнуть к определению символа в исходнике, вызывается по C-x i или C-x Tab
![ido-imenu](https://habrastorage.org/getpro/habr/post_images/4fe/222/776/4fe222776e9b747075cc4861f5e805c3.jpg)
2.3.3 IBuffer
Более функциональная замена стандартной переключалке буферов.
![ibuffer](https://habrastorage.org/getpro/habr/post_images/fb6/f6b/5a0/fb6f6b5a026e8651704ba3b5e2b26eff.jpg)
2.3.4 Полоска сбоку
Полоска сбоку, показывающая конец буфера. Очень удобная.
2.3.5 Редактирование под sudo
Уж не знаю, один ли я такой, но раньше мне приходилось запускать vi под sudo специально для редактирования системных файлов. В kit'е есть функция M-x sudo-edit.
2.3.6 Lambda
Лямбды в лиспокоде отображаются греческими буквами λ. Только вчера добавилась замена fn на ƒ в исходниках Clojure.
![fn-in-clojure](https://habrastorage.org/getpro/habr/post_images/a4e/fd9/dc0/a4efd9dc083a850b9e8523f8697eab4c.jpg)
2.3.7 Улучшения в режимах динамических языков
Множество всевозможных удобств для пользователей динамических языков: JavaScript, Emacs Lisp, Clojure, Common Lisp, Ruby, Perl. Сам-то в основном лиспами пользуюсь, поэтому улучшения в режимах лиспа и приведу.
В первую очередь это, конечно, paredit-mode—режим структурного редактирования лиспокода. Проще говоря, он расставляет, переставляет и удаляет скобочки с учётом семантики кода. Возможно, сразу его освоить не получиться, потому что этот режим выполнен в лучших традициях эмакса с добрым десятком зубодробительных комбинаций, но после длительного использования и привыкания без него будет уже непросто.
Показываются аргументы функций Emacs Lisp'а в минибуфере.
![show-elisp-args](https://habrastorage.org/getpro/habr/post_images/aad/d63/f63/aadd63f63b3ca59cba0c2e3f9c2a955b.jpg)
2.3.8 Отключенный графический интерфейс
Нет скроллбара, нет тулбара, нет меню, нет диалоговых окон. Всего этого нет, ибо экономия движения—наше всё. Графические элементы управления требуют мышь, а чтобы дотянуться до мыши нужно оторвать руку от клавиатуры, в случае меню еще потратить уйму времени на поиск нужного пункта. От того, что эти элементы управления отключены—от пользователя не убудет—функционал отключеных элементов продублирован в интерфейсе. Во время редактирования если и используются меню, то это меню текущих режимов, а они доступны в полоске modeline. Скроллбар прекрасно заменяется стандартными клавишами для перемещения по буферу и колёсиком мыши. Тулбар же просто не нужен—выполнить любое действие проще через кейбиндинг.
2.3.9 Комбинации клавиш
Честно говоря, комбинации клавиш в Emacs Starter Kit мне не очень нравятся, тем более, что они не сильно отличаются от стандартных. Так что я приведу некоторые свои комбинации (которые можно найти в файле
starter-kit-bindings.el
в моём форке kit'а на гитхабе: http://github.com/zahardzhan/emacs-starter-kit). Сперва, однако, стоит вспомнить о том, что Emacs—древнейшая ныне живая и широко используемая софтина, и оригинальные кейбиндинги рассчитаны вовсе не на современные PC/Apple/… клавиатуры, а на клавиатуры почивших 20 лет назад лисп-машин (например, в мануале по Zmacs для Ti Explorer 1985 года можно найти те же самые комбинации, что используются сейчас). Вспомнить и принять меры, иначе незадачливый эмаксер рискует стать жертвой «синдрома эмаксового мизинца»—из-за активного использования клавиши Control, которую на современных клавиатурах жуть как неудобно нажимать несколько сотен раз в час. Есть много способов сохранить здоровье своих рук:
- Самый простой: поменять Caps Lock и Control. Если вы не счастливый обладатель Happy Hacking Keyboard—меняйте, даже не думайте. Я пользуюсь Ubuntu—в ней поменять не проблема—ищите опцию в параметрах системы.
- Купить нормальную клавиатуру. Из нормальных мне известные, разве что эргономичная микрософтовская клава и клавиатуры Kinesis.
- Поменять кейбиндинги в эмаксе. Ибо большинство дефолтных—не фонтан. Но особо усердствовать не стоит—кейбиндинги эмакса используются во многих местах, в первую очередь в bash и zsh.
Итак, расскажу о некоторых своих комбинациях:
C-m
Альтернатива клавише Enter. Комбинация особенна полезна как окончание в цепочке, в которой все клавиши нажимаются вместе с Control'ом—чтобы не отпускать его и тянуться к Enter, например я переключаюсь между буферами даже не отжимая Control: C-Tab C-s C-s C-s C-m. Еще это комбинация полезна как замена M-x: C-x C-m, если до альта долго тянуться.
C-w
Практически во всех эмуляторах терминалов эта клавиша удаляет слово слева от курсора, в эмаксе же она не делает ничего хорошего. Я забиндил на неё удаление слова назад и вырезание региона, если он выделен—это очень удобно, Backspace практически не нужен. Ко всему, M-w копирует выделенный регион.
C-g
Забудьте об Esc. Если что-то пошло не так—это клавиша универсальной отмены.
C-q
Замена C-/. Отмена редактирования. Таким образом ряд сочетаний, который в стандартных оконных системах расположен внизу— C-z, C-x, C-c у меня переезжает наверх— C-q, C-w, M-w. (Если кто подскажет как совместить эту клавишу с C-g—буду очень благодарен).
C-Tab
Обычно я держу очень много буферов и часто между ними переключаюсь. Нажимать для этого двумя руками C-x b—невероятная расточительность.
S-Tab, C-S-Tab
Переход на следующее/предыдущее окно. Быстро и удобно. Таким образом, три клавиши, расположенные вплотную одна-над-другой используются для переключения между буферами.
C-x C-k
Убивать буфер гораздо легче не отпуская клавишу Control—так можно в разы быстрее убить сразу несколько буферов.
C-s, C-r
Эти клавиши привязаны к поиску по регэкспу вперёд и назад. Помнится, один из авторов Макинтоша, Джеф Раскин, положил подобный поиск в основу интерфейса компьютера для работы с текстом Cannon Cat. Это конечно, не Cannon Cat, но тоже ничего.
Эти клавиши используются не только для поиска в буфере, но и для перехода к следующему/предыдущему элементу в минибуфере в режиме ido—для переключения между буферами или для поиска и открытия файла. И еще в режиме выделения региона.
S-Space
Очень умное автодополнение. Иногда достаточно просто раз пять нажать эту комбинацию и программа чудесным образом напишется сама.
M-Space
Переключение между языками. Две легко доступные, вплотную расположенные клавиши—это лучший вариант.
F3, F4, F4
Начало записи макроса, конец записи макроса, вызов макроса.
В общем, если пользуетесь Эмаксом—очень рекомендую поставить Emacs Starter Kit—с ним Эмаксом даже можно пользоваться :)
Литературную версию программы Emacs Starter Kit смотрите в моем блоге.