Emacs, Tips & Tricks (Полезности для любимого редактора)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
wzrd
Сообщения: 323
ОС: Debian Lenny

Emacs, Tips & Tricks

Сообщение wzrd »

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

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

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

ВИД.

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

Код: Выделить всё

(scroll-bar-mode nil)
(tool-bar-mode nil)
(menu-bar-mode nil)



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.
Спасибо сказали:

h1t
Сообщения: 44
ОС: Emacs 23.0.0

Re: Emacs, Tips & Tricks

Сообщение h1t »

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

1. Биндинги. есть соглашение, по которому все пользовательские
биндиниги начинаются с префикса C-c. Это неудобно, потому что
возможны пересечения с плагинами, написанными другими.
Мне нужен был префикс, который бы никто никогда не использовал.
Идеальный кандидат - это хелповский C-h. Я забиндил префикс для
хелпа на C-q, а на C-h вешаю свои комбинации.
я использую дворак, поэтому буква h набирается нажатием
клавиши J, т.е. указательным пальцем правой руки.
Для меня это удобно.

2. через xmodmap назначил Caps Lock на Menu
это позволяет заменить два нажатия при наборе M-x
на одно.

3. C-x в двораке неудобно набирать. поэтому сделал
это префикс для клавиши в центре.
я выбрал клавишу К.
у меня дворак поэтому набирается буква t
т.е. префикс C-x дублируюется префиксом C-t
это префикс набирается средним пальцем правой руки
что тоже удобно для меня.

4. для переключения между буферами использую ido
с включенным параметром ido-enable-flex-matching
Это позволяет видеть список буферов, имена которых
содержат подстроку введенную в minibuffer. Режим
флекс позволяет искать не подстроку а набранные символы.
Пример: открыты файлы text1 text2 text3 text4
при наборе в minibuffer `te' эти буферы отобразятся
как возможные для дополнения. Далее можно пользоваться
навигационными клавишами для выбора текущего буфера
C-s/C-r а можно набрать цифру. Например для `te1' будет
выбран буфер text1

5. Комппляция проектов. у меня java проекты собираются
ant скриптами. и один биндинг для сборки - клавиша f5
написал немного кода которые хранит информацию о прокте:
путь к скрипту сборки и другие нужные параметры.
дальше вызывавается функция set-curr-project, которая
считывает название проекта из minibuffer(с вариантами
дополнений конечно) и жму f5. и сборка запустилась.

6. Правка файлов с правами root. Нашел в инете
такую функцию: если find-file пытается открыть
рутовский файл то пользователю об этом сообщается
и предлагается два варианта: открыть с правами рута(через su)
или в режиме чтения. Т.е больше не нужно набирать
C-x C-f /su::/file-path RET

7. Дворак. не пользуюсь иксовыми переключалками раскладки клавиатуры.
использую только емаксовую. Встроенными русскими раскладками
пользоватся не могу т.к они сделаны для qwerty клавиатурами.
Поэтому написал русскую расклдаку для дворак клавиатуры

9. Чтение книжек. режим когда статусная разделительная линия
не нужна. Сделал спец режим в котором отключаю эту линию
и добавил биндинг для перевода слова под курсором (дома нет инета
поэтому переводит с помощью мюллера, на работе - перевод беру с сайта
lingvo)

8. Messenger. Пользуюсь тремя видами: локальный чат в офисе, icq и jabber
сделал один интерфейс ко всем ним. идею оформления взял с jabber.el
Мне понравилась там оповещение - выводится имя того кто отправил сообщение
в статусной строке. Этот текст может обрабатывать события мышки: например
при нажатии на нем открыть окно чата с этим челом.
Клиент локального чата написан на С. Emacs просто ждет вывода от процесса
и делает то что нужно. ICQ и jabber сделаны через d-bus оповещение с pidgin'ом.
(гуи pidgin'а не нужен. я запускаю его консольный вариант finch в screen'е)
В новом емаксе ввели поддержку d-bus. но если бы не ввели то можно было бы
написать С программу которая бы слушала события и запустить ее из emacs.

Если кому-нибудь будут нужны подробные детали этих фич, то пишите вопросы
в ветке LinuxForum > Общий > Программы > Конфигурация (x)emacs
Спасибо сказали: