Pull to refresh

Emacs. Полезности и трюки

Reading time 6 min
Views 14K
это мой первый пост на хабре и в блогах вообще, так что не судите строго. emacs — это чудо-конструктор, из него можно слепить практически всё что угодно (или возможно). и чем больше вы с ним работете, тем больше вы ощущаете его безгранность и мощь. здесь вам и почтовый клиент, и джаббер, и шелл, универсальная среда для разработки, файловый менеджер, игры… этот список можно продолжать и дополнять.

первый запуск emacs' вам не покажет ничего особенного, но как только у вас возникнет проблема или неудобство, вы объязательно найдете решение (если конечно захотите). в этом посте я покажу вам некоторые вещи, которые помогли мне и, надеюсь, помогут вам. заранее предупреждаю, что некоторые функции из тех что я перечислю ниже, написаны не мною и выражаю благодарность их авторам за то что они сделали.

проверено и работает на emacs cvs.

ВИД.

1) начну с элементарного. интерфейс. я не пользуюсь кнопками, меню, скролл баром, т.к. считаю их не эффективными и безполезными. убираем их.

;; scroll bar
(scroll-bar-mode -1)

;; tool bar
(tool-bar-mode -1)

;; menu bar
(menu-bar-mode -1)


2) мне не нравятся цвета, что идут по умолчанию. решил заменить их на более темные и приятные глазу (у меня LCD).

(set-background-color "#333333")
(set-foreground-color "#ffffff")

если они вас не устраивают, вы можете посмотреть список всех цветов 'M-x list-color-display' и изменить на понравившийся. цвет курсора — (set-cursor-color <цвет>)

3) шрифты. вот тут можно спорить бесконечно. как многим известно в emacs с относительно недавних пор появилась поддержка xft. кому-то оно может и нравится, но для программирования я больше предпочитаю bitmap шрифты. единственный минус — это utf8, далеко не все держат его. по этой причине я выбрал terminus. и 0 от о в нем отличишь, а это важный момент. я меняю шрифты через .Xdefaults. в windows это делается через реестр, гугл поможет.

Emacs.font: -*-terminus-medium-*-*-*-16-*-*-*-*-*-*-*


4) utf8. для правильного отображения utf8 в shell и dired.

(setq file-name-coding-system 'utf-8)


ГОРЯЧИЕ КЛАВИШИ И ПОЛЕЗНЫЕ МЕЛОЧИ

5) поменяйте capslock на ctrl. очень важная вещь. это, думаю, самое главное для эффективного использования emacs. насчет этого тоже возникает множество споров, но мне кажется это довольно удобным. добавьте в .xmodmaprc (если его нет у вас, создайте) следущее:

keycode 66 = Control_L
clear Lock
add Control = Control_L


добавьте строку в .xinitrc или .xsession, в зависимости от того как вы грузите иксы.

xmodmap .xmodmaprc


6) удобный скроллинг и выделение текущей строки. по умолчанию emacs прокручивает почти на половину экрана, что крайне не удобно. исправим это. и еще бывает что теряешь место курсора, для этого включаем подсветку текущей строки.

(setq scroll-step 1)
(global-hl-line-mode 1)


7) мы знаем, 'C-x o' переключает фокус на следущее окно. а если окон 5 или 10? делаем навигацию проще.

(windmove-default-keybindings 'meta)


теперь навигация будет проходить следущим образом: alt + \arrow keys\.

8) изменять размеры окна, по умолчанию, можно мышкой… для этого нужно убирать руку от клавиатуры. а это удобно? я тоже так думаю. добавлем следущее в .emacs.

(defun win-resize-top-or-bot ()
"Figure out if the current window is on top, bottom or in the
middle"
(let* ((win-edges (window-edges))
(this-window-y-min (nth 1 win-edges))
(this-window-y-max (nth 3 win-edges))
(fr-height (frame-height)))
(cond
((eq 0 this-window-y-min) "top")
((eq (- fr-height 1) this-window-y-max) "bot")
(t "mid"))))

(defun win-resize-left-or-right ()
"Figure out if the current window is to the left, right or in the
middle"
(let* ((win-edges (window-edges))
(this-window-x-min (nth 0 win-edges))
(this-window-x-max (nth 2 win-edges))
(fr-width (frame-width)))
(cond
((eq 0 this-window-x-min) "left")
((eq (+ fr-width 4) this-window-x-max) "right")
(t "mid"))))

(defun win-resize-enlarge-horiz ()
(interactive)
(cond
((equal "top" (win-resize-top-or-bot)) (enlarge-window -1))
((equal "bot" (win-resize-top-or-bot)) (enlarge-window 1))
((equal "mid" (win-resize-top-or-bot)) (enlarge-window -1))
(t (message "nil"))))

(defun win-resize-minimize-horiz ()
(interactive)
(cond
((equal "top" (win-resize-top-or-bot)) (enlarge-window 1))
((equal "bot" (win-resize-top-or-bot)) (enlarge-window -1))
((equal "mid" (win-resize-top-or-bot)) (enlarge-window 1))
(t (message "nil"))))

(defun win-resize-enlarge-vert ()
(interactive)
(cond
((equal "left" (win-resize-left-or-right)) (enlarge-window-horizontally -1))
((equal "right" (win-resize-left-or-right)) (enlarge-window-horizontally 1))
((equal "mid" (win-resize-left-or-right)) (enlarge-window-horizontally -1))))

(defun win-resize-minimize-vert ()
(interactive)
(cond
((equal "left" (win-resize-left-or-right)) (enlarge-window-horizontally 1))
((equal "right" (win-resize-left-or-right)) (enlarge-window-horizontally -1))
((equal "mid" (win-resize-left-or-right)) (enlarge-window-horizontally 1))))

(global-set-key [C-M-down] 'win-resize-mi2nimize-vert)
(global-set-key [C-M-up] 'win-resize-enlarge-vert)
(global-set-key [C-M-left] 'win-resize-minimize-horiz)
(global-set-key [C-M-right] 'win-resize-enlarge-horiz)
(global-set-key [C-M-up] 'win-resize-enlarge-horiz)
(global-set-key [C-M-down] 'win-resize-minimize-horiz)
(global-set-key [C-M-left] 'win-resize-enlarge-vert)
(global-set-key [C-M-right] 'win-resize-minimize-vert)


как видно из keymap' ом, 'ctrl + alt + \arrow keys\' резайзит окна.

9) думаю, не только меня раздражает, то что надо всегда набирать yes или no, когда закрываешь буффер или покидаешь emacs. не легче набрать y или n?

(fset 'yes-or-no-p 'y-or-n-p)


это сэкономит от одного, до двух лишних нажатий.

10) при работе с большим количеством буферов, я испытывал неудобство при переключении между ними, я долго не мог найти то что мне нужно. оказывается у emacs'а был режим и для этого.

(iswitchb-mode 1)


кстати это старый вариант переключения между буфферами. не пойму зачем его убрали. теперь по нажатию 'C-x b' будет вызыватся iswitchb-buffer. он автоматически отбрасывает не нужное, а когда остается единственный вариант, то достаточно нажать tab и вы переключитесб на нужный буфер. единственный минус который я заметил — если есть буферы с названиями: in и main, то введя in он выбирает main, а обратиться к in бывает невозможно. может и есть на это клавиша или команда, но я не нашел.

и еще я решил добавить более удобные клавиши для переключения на следущий/предыдущий буфер.

(global-set-key [?\C-,] 'previous-buffer)
(global-set-key [?\C-.] 'next-buffer)


11) бывают моменты когда забываешь зажать ctrl для навигации через 'C-n' 'C-p' и т.д. и получаются не нужные последовательности типа: nnnnnnnnnnnn ppppppppppp ffffffff. не удалять же все backspace' ом… можно сделать горячюю клавишу для bacward-kill-word.

(global-set-key "\C-w" 'backward-kill-word)
(global-set-key "\C-x\C-k" 'kill-region)
(global-set-key "\C-c\C-k" 'kill-region)


теперь чтобы «убить» выделенный текст придется нажимать 'C-x C-k', т.к. на 'C-w' мы назначили bacward-kill-region.

12) макросы — мощная вещь как в программировании, так и в emacs. они достойны того чтобы выделить им удобные кейбиндинги.

(global-set-key [f2] 'kmacro-call-macro)
(global-set-key [f3] 'kmacro-start-macro-or-insert-counter)
(global-set-key [f4] 'kmacro-end-or-call-macro)


f2 — call macro
f3 — start macro
f4 — end macro

13) часто бывает, когда надо переключится на начало буффера, а потом обратно на место, где был ранее. для этого есть закладки. для удобства я добавил горячие клавиши для их вызова.

(global-set-key [f5] 'bookmark-set)
(global-set-key [f6] 'bookmark-jump)


f5, вводите имя закладки, делайте что нужно, f6, вводите имя закладки, и вы опять на том же месте.

14) используйте воркспейсы. это дает много новых возможностей. например, вы сможете читать почту с помощью gnus на первом воркспейсе, отлаживать программу на втором, редактировать код на третьем, а на пятом шелл. чертовски удобно, неправда ли?

вот ссылка на workspaces.el.

скопируйте его в свою загрузочную директорию. если у вас ее нет. то создайте директорию elisp (или как вам удобно) в домашнем каталоге (или как вам удобно) и добавьте в .emacs:

(add-to-list 'load-path "~/elisp") ;; если уже подгрузили, то естественно это уже писать не надо
(require 'workspaces)
(global-set-key [?\C-q] 'workspace-goto)


я решил выбрать 'C-q'. 'C-q' \0-9\ — переключает на нужный воркспейс. как вы уже, наверное, поняли максимальное их количество- 9.

15) если вы работаете с большим количеством файлов/буферов и решили закрыть emacs, а потом решили возобновить работу. не открывать же их заново… попросим emacs сохранять сессию перед выходом.

(desktop-save-mode t)


КОНЕЦ

на этом всё. если вас интересует мой .emacs, обращайтесь, у меня там еще несколько записей касающиеся программирования и отладки. буду рад услышать вашу критику. с уважением, wzrd.
Tags:
Hubs:
+37
Comments 55
Comments Comments 55

Articles