это мой первый пост на хабре и в блогах вообще, так что не судите строго. emacs — это чудо-конструктор, из него можно слепить практически всё что угодно (или возможно). и чем больше вы с ним работете, тем больше вы ощущаете его безгранность и мощь. здесь вам и почтовый клиент, и джаббер, и шелл, универсальная среда для разработки, файловый менеджер, игры… этот список можно продолжать и дополнять.
первый запуск emacs' вам не покажет ничего особенного, но как только у вас возникнет проблема или неудобство, вы объязательно найдете решение (если конечно захотите). в этом посте я покажу вам некоторые вещи, которые помогли мне и, надеюсь, помогут вам. заранее предупреждаю, что некоторые функции из тех что я перечислю ниже, написаны не мною и выражаю благодарность их авторам за то что они сделали.
проверено и работает на emacs cvs.
ВИД.
1) начну с элементарного. интерфейс. я не пользуюсь кнопками, меню, скролл баром, т.к. считаю их не эффективными и безполезными. убираем их.
2) мне не нравятся цвета, что идут по умолчанию. решил заменить их на более темные и приятные глазу (у меня LCD).
если они вас не устраивают, вы можете посмотреть список всех цветов 'M-x list-color-display' и изменить на понравившийся. цвет курсора — (set-cursor-color <цвет>)
3) шрифты. вот тут можно спорить бесконечно. как многим известно в emacs с относительно недавних пор появилась поддержка xft. кому-то оно может и нравится, но для программирования я больше предпочитаю bitmap шрифты. единственный минус — это utf8, далеко не все держат его. по этой причине я выбрал terminus. и 0 от о в нем отличишь, а это важный момент. я меняю шрифты через .Xdefaults. в windows это делается через реестр, гугл поможет.
4) utf8. для правильного отображения utf8 в shell и dired.
ГОРЯЧИЕ КЛАВИШИ И ПОЛЕЗНЫЕ МЕЛОЧИ
5) поменяйте capslock на ctrl. очень важная вещь. это, думаю, самое главное для эффективного использования emacs. насчет этого тоже возникает множество споров, но мне кажется это до��ольно удобным. добавьте в .xmodmaprc (если его нет у вас, создайте) следущее:
добавьте строку в .xinitrc или .xsession, в зависимости от того как вы грузите иксы.
6) удобный скроллинг и выделение текущей строки. по умолчанию emacs прокручивает почти на половину экрана, что крайне не удобно. исправим это. и еще бывает что теряешь место курсора, для этого включаем подсветку текущей строки.
7) мы знаем, 'C-x o' переключает фокус на следущее окно. а если окон 5 или 10? делаем навигацию проще.
теперь навигация будет проходить следущим образом: alt + \arrow keys\.
8) изменять размеры окна, по умолчанию, можно мышкой… для этого нужно убирать руку от клавиатуры. а это удобно? я тоже так думаю. добавлем следущее в .emacs.
как видно из keymap' ом, 'ctrl + alt + \arrow keys\' резайзит окна.
9) думаю, не только меня раздражает, то что надо всегда набирать yes или no, когда закрываешь буффер или покидаешь emacs. не легче набрать y или n?
это сэкономит от одного, до двух лишних нажатий.
10) при работе с большим количеством буферов, я испытывал неудобство при переключении между ними, я долго не мог найти то что мне нужно. оказывается у emacs'а был режим и для этого.
кстати это старый вариант переключения между буфферами. не пойму зачем его убрал��. теперь по нажатию 'C-x b' будет вызыватся iswitchb-buffer. он автоматически отбрасывает не нужное, а когда остается единственный вариант, то достаточно нажать tab и вы переключитесб на нужный буфер. единственный минус который я заметил — если есть буферы с названиями: in и main, то введя in он выбирает main, а обратиться к in бывает невозможно. может и есть на это клавиша или команда, но я не нашел.
и еще я решил добавить более удобные клавиши для переключения на следущий/предыдущий буфер.
11) бывают моменты когда забываешь зажать ctrl для навигации через 'C-n' 'C-p' и т.д. и получаются не нужные последовательности типа: nnnnnnnnnnnn ppppppppppp ffffffff. не удалять же все backspace' ом… можно сделать горячюю клавишу для bacward-kill-word.
теперь чтобы «убить» выделенный текст придется нажимать 'C-x C-k', т.к. на 'C-w' мы назначили bacward-kill-region.
12) макросы — мощная вещь как в программировании, так и в emacs. они достойны того чтобы выделить им удобные кейбиндинги.
f2 — call macro
f3 — start macro
f4 — end macro
13) часто бывает, когда надо переключится на начало буффера, а потом обратно на место, где был ранее. для этого есть закладки. для удобства я добавил горячие клавиши для их вызова.
f5, вводите имя закладки, де��айте что нужно, f6, вводите имя закладки, и вы опять на том же месте.
14) используйте воркспейсы. это дает много новых возможностей. например, вы сможете читать почту с помощью gnus на первом воркспейсе, отлаживать программу на втором, редактировать код на третьем, а на пятом шелл. чертовски удобно, неправда ли?
вот ссылка на workspaces.el.
скопируйте его в свою загрузочную директорию. если у вас ее нет. то создайте директорию elisp (или как вам удобно) в домашнем каталоге (или как вам удобно) и добавьте в .emacs:
я решил выбрать 'C-q'. 'C-q' \0-9\ — переключает на нужный воркспейс. как вы уже, наверное, поняли максимальное их количество- 9.
15) если вы работаете с большим количеством файлов/буферов и решили закрыть emacs, а потом решили возобновить работу. не открывать же их заново… попросим emacs сохранять сессию перед выходом.
КОНЕЦ
на этом всё. если вас интересует мой .emacs, обращайтесь, у меня там еще несколько записей касающиеся программирования и отладки. буду рад услышать вашу критику. с уважением, wzrd.
первый запуск 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.
