[Из песочницы] GNU Emacs. Статья, которую я так и не нашел…

9b92f279ec8140e98169fa73ffde32c3.png Доброго времени суток, %username%! В данной статье хочу подробно рассказать про настройку замечательного текстового редактора GNU Emacs.

Операционная система GNU Emacs — программируемый текстовый редактор для программистов, написанный на программируемом языке программирования.

Для расширения Emacs используется диалект языка Lisp — Emacs Lisp.Строго говоря, Emacs нельзя назвать просто текстовым редактором. Emacs — это интерпретатор языка Emacs Lisp, конструктор текстового редактора Вашей мечты. Малая часть программы реализована на языке Си (около 30% — отвечает за базовое взаимодействие с ОС, ввод-вывод, отрисовку окон), а весь основной функционал — на Emacs Lisp (далее, elisp). Именно такая архитектура отличает GNU Emacs от других профессиональных текстовых редакторов — он, до неприличия, расширяем.

Функционал этого редактора настолько огромен и разнообразен, что новичку в этой среде крайне сложно освоиться. Чего стоит только процесс настройки — на это могут уйти годы, или вся жизнь. Именно поэтому я решил написать эту статью — подробное руководство по начальной настройке Emacs, для тех кто:

хочет начать использовать GNU Emacs, но не знает как; пишет на языках, поддержка которых в IDE оставляет желать лучшего или её вообще нет; пишет на разных языках, «программист-полиглот»; хочет иметь универсальную среду разработки на работе и дома, на нескольких компьютерах сразу; хочет иметь функциональную и мощную среду для plain/text заметок (organizer), ведения справочной информации, управления проектами, организации базы знаний и т.д. — org-mode; хочет автоматизировать процесс обработки большого числа текстовых файлов; хочет иметь нетребовательную к аппаратным ресурсам, кроссплатформенную среду для работы с любой текстовой информацией; хочет среду, которую можно без особых усилий, буквально «на лету», настроить под себя, свою конкретную задачу, расширить, самостоятельно добавив новый функционал; любит универсальность и расширяемость; пишет для web, на скриптовых языках: Python, Ruby, Perl и т.п.; хочет приобщиться к вечному, к Emacs — одному из самых долгоживущих проектов Open Source сообщества; etc. Стоит сказать, что в современной IT-индустрии все чаще появляются различные амбициозные проекты, связанные с разработкой «текстовых редакторов XXI века», убийц замен Emacs и/или Vim: Ну что сказать… Удачи им в этом нелегком труде. А мы, пожалуй, займемся настройкой GNU Emacs.Забыл предупредить: я пишу на Common Lisp (ещё один диалект языка Lisp), поэтому часть материала будет про то, как превратить Emacs в полноценную IDE с картами и девушками для этого языка программирования. Хороший пример, к стати…

Итак, поехали!

УстановкаДля MS Windows: скачать архив с официального сайта; создать директорию C:\emacs\ и распаковать в него скаченный архив; запустить файл C:\emacs\bin\addpm.exe (создаст пункт в меню Пуск для запуска Emacs). Для дистрибутивов GNU/Linux (на примере deb-based дистрибутивов) есть четыре способа: Для Mac OS X: На момент написания статьи последняя версия редактора — Emacs-24.4. Вот ее и берите для Mac OS X или MS Windows. Для GNU/Linux советую использовать ту версию, которая представлена в стандартных репозиториях Вашего дистрибутива.Настройка Есть, как минимум, четыре способа настройки Emacs: написанием конфигурационного файла .emacs; через меню программы; с помощью команды M-x customize (C-x означает Control-x, M-x означает Meta-x, где Meta может означать «нажать-отпустить Esc» или «нажать Alt». (т.е. например Meta-x это или нажать Esc, затем x, или удерживая Alt, нажать x); спереть позаимствовать чужой файл .emacs и начать работать (не советую). Мы не ищем легких путей! Будем писать конфигурационный файл на языке elisp! Сказано — сделано! Файл конфигурации .emacs После того, как Вы успешно установили GNU Emacs на свой компьютер, необходимо создать файл с названием .emacs и уже в нем прописать основные настройки.Обозначения, используемые в статье (повторение — мать учения): C-a: Ctrl-a; M-a: Meta-a (Если у Вас нет клавиши Meta (Alt), используете клавишу Esc); C-M-a: Ctrl-Meta-a. Итак, запускаем Emacs. С помощью комбинации клавиш C-x C-f создаем новый файл .emacs и начинаем в нем писать. Не обижайтесь, но вдаваться в синтаксис языка elisp не стану — это превратит статью в монстра. В конце просто приведу ссылки на необходимые ресурсы.Для начала, расскажем Emacs о том, в какой операционной системе он запустился. Для этого напишем на elisp две функции, которые нам в этом помогут:

;; System-type definition (defun system-is-linux () (string-equal system-type «gnu/linux»)) (defun system-is-windows () (string-equal system-type «windows-nt»)) Теперь, вызывая эти функции как условия для операторов ветвления, мы можем настроить кроссплатформенный файл конфигурации для Emacs (результатом наших трудов будет файл .emacs, который прекрасно работает в ОС MS Windows и дистрибутивах GNU/Linux. На Mac OS X не проверял).IDE для Common Lisp Для превращения Emacs в полноценную среду разработки для языка Common Lisp нам понадобится два пакета: реализация Common Lisp. Я выбрал SBCL; Slime — режим Emacs для разработки приложений на языке Common Lisp. Если Вы пользователь ОС MS Windows и, вдруг, пишете на Common Lisp, то Вам нужно: скачать SBCL; установить в C:\sbcl\ скаченный SBCL; скачать Slime; разместить в C:\slime\ скаченный Slime. На GNU/Linux все проще: выполнить из командной строки: sudo aptitude install slime sbcl Поехали дальше Если Вы счастливый пользователь Mac OS X или дистрибутива GNU/Linux, то Emacs полезно запустить как сервер: ;; Start Emacs as a server (when (system-is-linux) (require 'server) (unless (server-running-p) (server-start))) Далее, укажем Emacs пути по которым, но сможет найти установленные дополнения (в частности, пакеты Slime и SBCL): ;; MS Windows path-variable (when (system-is-windows) (setq win-sbcl-exe «C:/sbcl/sbcl.exe») (setq win-init-path «C:/.emacs.d») (setq win-init-ct-path «C:/.emacs.d/plugins/color-theme») (setq win-init-ac-path «C:/.emacs.d/plugins/auto-complete») (setq win-init-slime-path «C:/slime») (setq win-init-ac-dict-path «C:/.emacs.d/plugins/auto-complete/dict»))

;; Unix path-variable (when (system-is-linux) (setq unix-sbcl-bin »/usr/bin/sbcl») (setq unix-init-path »~/.emacs.d») (setq unix-init-ct-path »~/.emacs.d/plugins/color-theme») (setq unix-init-ac-path »~/.emacs.d/plugins/auto-complete») (setq unix-init-slime-path »/usr/share/common-lisp/source/slime/») (setq unix-init-ac-dict-path »~/.emacs.d/plugins/auto-complete/dict»)) Давайте расскажем Emacs о том, кто мы такие (мало-ли, решите через Emacs почту отправлять или в jabber’e переписываться…): ;; My name and e-mail adress (setq user-full-name »%user-name%») (setq user-mail-adress »%user-mail%») Мой любимый dired-mode. Настроим его: ;; Dired (require 'dired) (setq dired-recursive-deletes 'top) ;; чтобы можно было непустые директории удалять… Замечательный способ «прыгать» по определениям функций почти для всех языков программирования — Imenu. Предположим, что у Вас файл с программой на 100500 строк с кучей функций. Не беда! Нажимаем F6 и в минибуфере вводим часть имени искомой функции и TAB’ом дополняем. Нажали Enter — и мы на определении искомой функции: ;; Imenu (require 'imenu) (setq imenu-auto-rescan t) (setq imenu-use-popup-menu nil) (global-set-key (kbd »») 'imenu) Пишем название открытого буфера в шапке окна: ;; Display the name of the current buffer in the title bar (setq frame-title-format «GNU Emacs: %b») Помните, что мы определили пути, по которым Emacs ищет дополнения и внешние программы? Пусть «пройдется» по этим путям (где дополнения) при запуске: ;; Load path for plugins (if (system-is-windows) (add-to-list 'load-path win-init-path) (add-to-list 'load-path unix-init-path)) Еще не забыли, что Emacs предоставляет Вам прекрасную среду для plain/text заметок (organizer), ведения справочной информации, управления проектами, организации базы знаний и т.д. — org-mode? Настроим: ;; Org-mode settings (require 'org) (global-set-key »\C-ca» 'org-agenda) (global-set-key »\C-cb» 'org-iswitchb) (global-set-key »\C-cl» 'org-store-link) (add-to-list 'auto-mode-alist '(»\\.org$» . Org-mode)) ;; ассоциируем *.org файлы с org-mode Наведем аскетизм красоту — уберем экраны приветствия при запуске: ;; Inhibit startup/splash screen (setq inhibit-splash-screen t) (setq ingibit-startup-message t) Выделим выражения между {},[],(), когда курсор находится на одной из скобок — полезно для программистов: ;; Show-paren-mode settings (show-paren-mode t) (setq show-paren-style 'expression) В новых версиях Emacs внедрили electic-mod’ы. Первый из них автоматически расставляет отступы (работает из рук вон плохо), второй — закрывает скобки, кавычки и т.д. Отключим первый (Python программисты меня поймут…) и включим второй: ;; Electric-modes settings (electric-pair-mode 1) (electric-indent-mode -1) Хотим иметь возможность удалить выделенный текст при вводе поверх? Пожалуйста: ;; Delete selection (delete-selection-mode t) Уберем лишнее: всякие меню, scroll-bar’ы, tool-bar’ы и т.п.: ;; Disable GUI components (tooltip-mode -1) (menu-bar-mode -1) (tool-bar-mode -1) (scroll-bar-mode -1) (blink-cursor-mode -1) (setq use-dialog-box nil) (setq redisplay-dont-pause t) (setq ring-bell-function 'ignore) ;; отключить звуковой сигнал Никаких автоматических сохранений и резервных копий! Только hardcore: ;; Disable backup/autosave files (setq make-backup-files nil) (setq auto-save-default nil) (setq auto-save-list-file-name nil) Самое больное и сложное место в настройке — кодировки: ;; Coding-system settings (set-language-environment 'UTF-8) (if (system-is-linux) (progn (setq default-buffer-file-coding-system 'utf-8) (setq-default coding-system-for-read 'utf-8) (setq file-name-coding-system 'utf-8) (set-selection-coding-system 'utf-8) (set-keyboard-coding-system 'utf-8-unix) (set-terminal-coding-system 'utf-8) (prefer-coding-system 'utf-8)) (progn (prefer-coding-system 'windows-1251) (set-terminal-coding-system 'windows-1251) (set-keyboard-coding-system 'windows-1251-unix) (set-selection-coding-system 'windows-1251) (setq file-name-coding-system 'windows-1251) (setq-default coding-system-for-read 'windows-1251) (setq default-buffer-file-coding-system 'windows-1251))) Включаем нумерацию строк: ;; Linum plugin (require 'linum) (line-number-mode t) (global-linum-mode t) (column-number-mode t) (setq linum-format » %d») Продолжаем наводить красоту: ;; Fringe settings (fringe-mode '(8 . 0)) (setq-default indicate-empty-lines t) (setq-default indicate-buffer-boundaries 'left)

;; Display file size/time in mode-line (setq display-time-24hr-format t) (display-time-mode t) (size-indication-mode t) Автоматический перенос длинных строк: ;; Line wrapping (setq word-wrap t) (global-visual-line-mode t) Определим размер окна с Emacs при запуске: ;; Start window size (when (window-system) (set-frame-size (selected-frame) 100 50)) Интерактивный поиск и открытие файлов? Пожалуйста: ;; IDO plugin (require 'ido) (ido-mode t) (icomplete-mode t) (ido-everywhere t) (setq ido-vitrual-buffers t) (setq ido-enable-flex-matching t) Быстрая навигация между открытыми буферами: ;; Buffer Selection and ibuffer settings (require 'bs) (require 'ibuffer) (defalias 'list-buffers 'ibuffer) ;; отдельный список буферов при нажатии C-x C-b (global-set-key (kbd »») 'bs-show) ;; запуск buffer selection кнопкой F2 Цветовые схемы. Как без них? Для этого: скачаем пакет color-theme для Emacs отсюда; создадим директории .emacs.d/plugins/color-theme; распакуем туда содержимое архива с темами; расположить папку .emacs.d в: для MS Windows в корень диска C:\.emacs.d для GNU/Linux в домашнюю директорию ~/.emacs.d запишем в наш .emacs следующие строки: ;; Color-theme definition (defun color-theme-init () (require 'color-theme) (color-theme-initialize) (setq color-theme-is-global t) (color-theme-charcoal-black)) (if (system-is-windows) (when (file-directory-p win-init-ct-path) (add-to-list 'load-path win-init-ct-path) (color-theme-init)) (when (file-directory-p unix-init-ct-path) (add-to-list 'load-path unix-init-ct-path) (color-theme-init))) Подсветка кода: ;; Syntax highlighting (require 'font-lock) (global-font-lock-mode t) (setq font-lock-maximum-decoration t) Настройки отступов: ;; Indent settings (setq-default indent-tabs-mode nil) (setq-default tab-width 4) (setq-default c-basic-offset 4) (setq-default standart-indent 4) (setq-default lisp-body-indent 4) (global-set-key (kbd «RET») 'newline-and-indent) (setq lisp-indent-function 'common-lisp-indent-function) Плавный скроллинг: ;; Scrolling settings (setq scroll-step 1) (setq scroll-margin 10) (setq scroll-conservatively 10000) Укоротить сообщения в минибуфере: ;; Short messages (defalias 'yes-or-no-p 'y-or-n-p) Общий с ОС буфер обмена: ;; Clipboard settings (setq x-select-enable-clipboard t) Настройки пустых строк в конце буфера: ;; End of file newlines (setq require-final-newline t) ;; добавить новую пустую строку в конец файла при сохранении (setq next-line-add-newlines nil) ;; не добавлять новую строку в конец при смещении ;; курсора стрелками Выделять результаты поиска: ;; Highlight search resaults (setq search-highlight t) (setq query-replace-highlight t) Перемещение между сплитами при помощи комбинаций M-arrow-keys (кроме org-mode): ;; Easy transition between buffers: M-arrow-keys (if (equal nil (equal major-mode 'org-mode)) (windmove-default-keybindings 'meta)) Удалить лишние пробелы в конце строк, заменить TAB’ы на пробелы и выровнять отступы при сохранении буфера в файл, автоматически: ;; Delete trailing whitespaces, format buffer and untabify when save buffer (defun format-current-buffer () (indent-region (point-min) (point-max))) (defun untabify-current-buffer () (if (not indent-tabs-mode) (untabify (point-min) (point-max))) nil) (add-to-list 'write-file-functions 'format-current-buffer) (add-to-list 'write-file-functions 'untabify-current-buffer) (add-to-list 'write-file-functions 'delete-trailing-whitespace) Пакет CEDET — работа с C/C++/Java (прекрасная статья Alex Ott’a по CEDET): ;; CEDET settings (require 'cedet) (add-to-list 'semantic-default-submodes 'global-semanticdb-minor-mode) (add-to-list 'semantic-default-submodes 'global-semantic-mru-bookmark-mode) (add-to-list 'semantic-default-submodes 'global-semantic-idle-scheduler-mode) (add-to-list 'semantic-default-submodes 'global-semantic-highlight-func-mode) (add-to-list 'semantic-default-submodes 'global-semantic-idle-completions-mode) (add-to-list 'semantic-default-submodes 'global-semantic-show-parser-state-mode) (semantic-mode t) (global-ede-mode t) (require 'ede/generic) (require 'semantic/ia) (ede-enable-generic-projects) Автодополнение ввода. Для этого: скачаем пакет auto-complete для Emacs отсюда; создадим директории .emacs.d/plugins/auto-complete; распакуем туда содержимое архива с auto-complete; расположить папку .emacs.d в: для MS Windows в корень диска C:\.emacs.d для GNU/Linux в домашнюю директорию ~/.emacs.d запишем в наш .emacs следующие строки: ;; Auto-complete plugin (defun ac-init () (require 'auto-complete-config) (ac-config-default) (if (system-is-windows) (add-to-list 'ac-dictionary-directories win-init-ac-dict-path) (add-to-list 'ac-dictionary-directories unix-init-ac-dict-path)) (setq ac-auto-start t) (setq ac-auto-show-menu t) (global-auto-complete-mode t) (add-to-list 'ac-modes 'lisp-mode) (add-to-list 'ac-sources 'ac-source-semantic) (add-to-list 'ac-sources 'ac-source-variables) (add-to-list 'ac-sources 'ac-source-functions) (add-to-list 'ac-sources 'ac-source-dictionary) (add-to-list 'ac-sources 'ac-source-words-in-all-buffer) (add-to-list 'ac-sources 'ac-source-files-in-current-dir)) (if (system-is-windows) (when (file-directory-p win-init-ac-path) (add-to-list 'load-path win-init-ac-path) (ac-init)) (when (file-directory-p unix-init-ac-path) (add-to-list 'load-path unix-init-ac-path) (ac-init))) Настроим среду для Common Lisp — Slime: ;; SLIME settings (defun run-slime () (require 'slime) (require 'slime-autoloads) (setq slime-net-coding-system 'utf-8-unix) (slime-setup '(slime-fancy slime-asdf slime-indentation))) ;;; for MS Windows (when (system-is-windows) (when (and (file-exists-p win-sbcl-exe) (file-directory-p win-init-slime-path)) (setq inferior-lisp-program win-sbcl-exe) (add-to-list 'load-path win-init-slime-path) (run-slime))) ;;; for GNU/Linux (when (system-is-linux) (when (and (file-exists-p unix-sbcl-bin) (file-directory-p unix-init-slime-path)) (setq inferior-lisp-program unix-sbcl-bin) (add-to-list 'load-path unix-init-slime-path) (run-slime))) Настроим Bookmark — закладки, которые помогают быстро перемещаться по тексту: ;; Bookmark settings (require 'bookmark) (setq bookmark-save-flag t) (when (file-exists-p (concat user-emacs-directory «bookmarks»)) (bookmark-load bookmark-default-file t)) (global-set-key (kbd »») 'bookmark-set) (global-set-key (kbd »») 'bookmark-jump) (global-set-key (kbd »») 'bookmark-bmenu-list) (setq bookmark-default-file (concat user-emacs-directory «bookmarks»)) Собственно, всё! Можно нажать C-x C-s и сохранить файл .emacs. Куда положить файл .emacs и папку .emacs.d (если использовать пути из моего .emacs): MS Windows:

.emacs в C:\Users\%username%\AppData\Roaming\ папку .emacs.d в корень диска C:\ GNU/Linux:.emacs в домашнюю директорию: /home/%username%/ папку .emacs.d в домашнюю директорию: /home/%username%/ Полную версию с моим .emacs и папкой с дополнениями .emacs.d можно скачать с моей странички на GitHub.Мой Emacs:

image

Полезные ссылки Множество полезных статей по GNU Emacs на Хабрахабр. Также есть серия замечательных скринкастов на YouTube про Emacs, опубликованных Дмитрием Бушенко: Чтобы не обижать пользователей другого замечательного редактора — Vim, вот ссылка на мой .vimrc на GitHub. Там все подробно описано (если что, могу и по Vim статью написать…).С нетерпением жду Ваших комментариев, уважаемые читатели. Надеюсь, Вы нашли что-то полезное/новое для себя.

Спасибо за внимание.

© Habrahabr.ru