- PVSM.RU - https://www.pvsm.ru -
Доброго времени суток, %username%!
В данной статье хочу подробно рассказать про настройку замечательного текстового редактора GNU Emacs [1].
Операционная система GNU Emacs — программируемый текстовый редактор для программистов, написанный на программируемом языке программирования.
Для расширения Emacs используется диалект языка Lisp [2] — Emacs Lisp [3].
Строго говоря, Emacs нельзя назвать просто текстовым редактором. Emacs — это интерпретатор языка Emacs Lisp, конструктор текстового редактора Вашей мечты. Малая часть программы реализована на языке Си (около 30% — отвечает за базовое взаимодействие с ОС, ввод-вывод, отрисовку окон), а весь основной функционал — на Emacs Lisp (далее, elisp). Именно такая архитектура отличает GNU Emacs от других профессиональных текстовых редакторов — он, до неприличия, расширяем.
Функционал этого редактора настолько огромен и разнообразен, что новичку в этой среде крайне сложно освоиться. Чего стоит только процесс настройки — на это могут уйти годы, или вся жизнь. Именно поэтому я решил написать эту статью — подробное руководство по начальной настройке Emacs, для тех кто:
Стоит сказать, что в современной IT-индустрии все чаще появляются различные амбициозные проекты, связанные с разработкой «текстовых редакторов XXI века», убийц замен Emacs и/или Vim [9]:
Ну что сказать… Удачи им в этом нелегком труде. А мы, пожалуй, займемся настройкой GNU Emacs.
Забыл предупредить: я пишу на Common Lisp [14] (ещё один диалект языка Lisp), поэтому часть материала будет про то, как превратить Emacs в полноценную IDE с картами и девушками для этого языка программирования. Хороший пример, к стати…
Итак, поехали!
Для MS Windows:
Для дистрибутивов GNU/Linux (на примере deb-based дистрибутивов) есть четыре способа:
sudo aptitude install emacs emacs-goodies-el
Для Mac OS X:
На момент написания статьи последняя версия редактора — Emacs-24.4 [23]. Вот ее и берите для Mac OS X или MS Windows. Для GNU/Linux советую использовать ту версию, которая представлена в стандартных репозиториях Вашего дистрибутива.
Есть, как минимум, четыре способа настройки Emacs:
Мы не ищем легких путей! Будем писать конфигурационный файл на языке elisp [24]!
Сказано — сделано!
После того, как Вы успешно установили GNU Emacs на свой компьютер, необходимо создать файл с названием .emacs и уже в нем прописать основные настройки.
Обозначения, используемые в статье (повторение — мать учения):
Итак, запускаем 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 не проверял).
Для превращения Emacs в полноценную среду разработки для языка Common Lisp нам понадобится два пакета:
Если Вы пользователь ОС MS Windows и, вдруг, пишете на Common Lisp, то Вам нужно:
На 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 [29]. Настроим его:
;; Dired
(require 'dired)
(setq dired-recursive-deletes 'top) ;; чтобы можно было непустые директории удалять...
Замечательный способ «прыгать» по определениям функций почти для всех языков программирования — Imenu [30]. Предположим, что у Вас файл с программой на 100500 строк с кучей функций. Не беда! Нажимаем F6 и в минибуфере вводим часть имени искомой функции и TAB'ом дополняем. Нажали Enter — и мы на определении искомой функции:
;; Imenu
(require 'imenu)
(setq imenu-auto-rescan t)
(setq imenu-use-popup-menu nil)
(global-set-key (kbd "<f6>") '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 [31]? Настроим:
;; 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 "<f2>") 'bs-show) ;; запуск buffer selection кнопкой F2
Цветовые схемы. Как без них? Для этого:
;; Color-theme definition <http://www.emacswiki.org/emacs/ColorTheme>
(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 [33] — работа с C/C++/Java (прекрасная статья [34] Alex Ott [35]'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 plugin <http://www.emacswiki.org/emacs/AutoComplete>
(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 [37] — закладки, которые помогают быстро перемещаться по тексту:
;; 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 "<f3>") 'bookmark-set)
(global-set-key (kbd "<f4>") 'bookmark-jump)
(global-set-key (kbd "<f5>") 'bookmark-bmenu-list)
(setq bookmark-default-file (concat user-emacs-directory "bookmarks"))
Собственно, всё! Можно нажать C-x C-s и сохранить файл .emacs. Куда положить файл .emacs и папку .emacs.d (если использовать пути из моего .emacs):
MS Windows:
GNU/Linux:
Полную версию с моим .emacs и папкой с дополнениями .emacs.d можно скачать [38] с моей странички на GitHub.
Мой Emacs:

Множество полезных статей [39] по GNU Emacs на Хабрахабр. Также есть серия замечательных скринкастов на YouTube про Emacs, опубликованных Дмитрием Бушенко:
Чтобы не обижать пользователей другого замечательного редактора — Vim, вот ссылка на мой .vimrc [53] на GitHub. Там все подробно описано (если что, могу и по Vim статью написать...).
С нетерпением жду Ваших комментариев, уважаемые читатели. Надеюсь, Вы нашли что-то полезное/новое для себя.
Спасибо за внимание.
Автор: karlkorp
Источник [54]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/80448
Ссылки в тексте:
[1] GNU Emacs: https://ru.wikipedia.org/wiki/Emacs
[2] Lisp: https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%81%D0%BF
[3] Emacs Lisp: https://ru.wikipedia.org/wiki/Emacs_Lisp
[4] org-mode: http://orgmode.org/
[5] Python: https://www.python.org/
[6] Ruby: https://www.ruby-lang.org/ru/
[7] Perl: https://www.perl.org/
[8] etc.: http://habrahabr.ru/post/190790/
[9] Vim: http://www.vim.org/
[10] Light Table;: http://lighttable.com/
[11] Sublime Text;: http://www.sublimetext.com/
[12] Atom: https://atom.io/
[13] GitHub.: https://github.com/
[14] Common Lisp: https://ru.wikipedia.org/wiki/Common_Lisp
[15] скачать: http://mirror.tochlab.net/pub/gnu/emacs/windows/
[16] официального сайта;: http://www.gnu.org/software/emacs/
[17] synaptic;: https://ru.wikipedia.org/wiki/Synaptic
[18] собрать: http://habrahabr.ru/post/134951/
[19] исходников: http://mirror.tochlab.net/pub/gnu/emacs/
[20] тут: http://emacsformacosx.com/
[21] здесь: http://www.emacswiki.org/emacs/EmacsForMacOS
[22] сюда: http://aquamacs.org/
[23] Emacs-24.4: http://habrahabr.ru/post/241063/
[24] elisp: https://www.gnu.org/software/emacs/manual/elisp.html
[25] SBCL: https://ru.wikipedia.org/wiki/Steel_Bank_Common_Lisp
[26] Slime: https://ru.wikipedia.org/wiki/SLIME
[27] скачать: http://www.sbcl.org/platform-table.html
[28] скачать: http://common-lisp.net/project/slime/#downloading
[29] dired-mode: http://www.emacswiki.org/emacs/DiredMode
[30] Imenu: http://emacswiki.org/emacs/ImenuMode
[31] org-mode: http://en.wikipedia.org/wiki/Org-mode
[32] отсюда: http://download.savannah.gnu.org/releases/color-theme/
[33] CEDET: http://cedet.sourceforge.net/
[34] статья: http://alexott.net/ru/writings/emacs-devenv/EmacsCedet.html
[35] Alex Ott: http://alexott.net/ru/emacs/
[36] отсюда: http://auto-complete.org/
[37] Bookmark: http://www.emacswiki.org/emacs/BookMarks
[38] скачать: https://github.com/karlkorp/.emacs
[39] статей: http://habrahabr.ru/hub/emacs/
[40] Изучаем Emacs. Эпизод 01: http://www.youtube.com/watch?v=1Asfqt13G-0
[41] Изучаем Emacs. Эпизод 02: http://www.youtube.com/watch?v=0K1MI10iFBM
[42] Изучаем Emacs. Эпизод 03: http://www.youtube.com/watch?v=qjGpJZpOasc
[43] Изучаем Emacs. Эпизод 04: http://www.youtube.com/watch?v=fF_qB7gimco
[44] Изучаем Emacs. Эпизод 05: http://www.youtube.com/watch?v=F-NpS_zd5z4
[45] Изучаем Emacs. Эпизод 06: http://www.youtube.com/watch?v=bilY2OYCyfY
[46] Изучаем Emacs. Эпизод 07: http://www.youtube.com/watch?v=TFTakTifBQs
[47] Изучаем Emacs. Эпизод 08: Инструменты работы с ELisp-кодом: http://www.youtube.com/watch?v=_Bmw3tadsFg
[48] Изучаем Emacs. Эпизод 09: ediff, magit, psvn и emacs --daemon : http://www.youtube.com/watch?v=7gGtzUwDUJw
[49] Изучаем Emacs. Эпизод 10: Базовые возможности Org-mode, literate programming и экспорт в html/pdf: http://www.youtube.com/watch?v=lpPS6JPUUME
[50] Изучаем Emacs. Эпизод 11: Средства работы с Clojure-кодом : http://www.youtube.com/watch?v=MXt7z94-7Tk
[51] Изучаем Emacs. Эпизод 12: Макросы, ООП, DSL : http://www.youtube.com/watch?v=MtVYwcuZ_E8
[52] Изучаем Emacs: Эпизод 13. Управление проектами при помощи EDE: http://www.youtube.com/watch?v=AiMYN9_ceHs
[53] .vimrc: https://github.com/karlkorp/.vimrc
[54] Источник: http://habrahabr.ru/post/248663/
Нажмите здесь для печати.