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

    это мой первый пост на хабре и в блогах вообще, так что не судите строго. 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.
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 55
    • +8
      уберите под хабракат
      • +4
        Полезная штука. Спасибо большое
        • +2
          извините. я отправляю запрос, но без результатно. не обновляет.
          • 0
            нужно самостоятельно выбирать что уходит под кат
            пример

            это мой первый пост на хабре и в блогах вообще,

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


        • +2
          почему без результатно? я ставлю в середине и в конце теги. но ничего не меняется.
          • 0
            вроде изменилось ;)
            спасибо.
            появилось желание пробнуть использовать)
          • +2
            Спасибо, очень полезный мануал, доберусь домой буду эксперементировать!
            • +1
              спасибо за советы. я еще раз изиняюсь, что так получилось.
              • 0
                Класс! Спасибо за workspaces! Если не видели, то советую посмотреть на anything — эта штука довольно неплохо решает проблему переключения между буферами, закладками, выбора команд и еще миллион вещей.
                • +3
                  Где же bobuk?
                  • НЛО прилетело и опубликовало эту надпись здесь
                  • 0
                    Спасибо, очень полезно!
                    • НЛО прилетело и опубликовало эту надпись здесь
                      • 0
                        Дык, работали хорошо значит ;-)
                        • НЛО прилетело и опубликовало эту надпись здесь
                          • 0
                            А у меня в емаксе jabber и irc =)
                            Я могу стучать жестоко и не работая.
                            • 0
                              Зачем палишь?! =)
                              • 0
                                А ещё emacs-w3m не присматриваясь трудно отличить от кода, тоже хорошая штука.: D
                        • 0
                          меня всегда удивляла особенность суровых nix программистов использующих vi и emacs.
                          Эти ребята ради их толковой настройки готовы чуть ли не ядро патчить, чего уж там говорить про настройки иксов, фонтового сервера и прочих вещей. :)
                          • 0
                            А вы попробуйте — глядишь и тоже станете «суровым программистом использующим „
                            • 0
                              Необходимость в емаксе/виме возникает, когда появляется опыт, а с опытом уменме ценить собственное время. Если поискать на тытрубе по тегам emacs, vim, можно убедиться насколько эти среды помогают экономить время на рутинных задачах.
                            • –4
                              ru.wikipedia.org/wiki/Caps_Lock
                              • –2
                                самый анти эргономичный editor всех времен и народов :)
                                (щя меня забют чую)
                                • 0
                                  Самый неочевидный — полностью соглашусь, но если есть навык, то ничего удобнее пожалуй сложно придумать. Ну разве что вим с его режимами, но не все могут с ними уживаться.
                                  • 0
                                    вообще-то емакс не эдитор.
                                    • +1
                                      There is a free tip for you: editor is 'редактор' in Russian.
                                      • +2
                                        editor?
                                        try this one :-)
                                        • +1
                                          Яркий пример программы, написанной программистами без менеджеров. Но если в нем разобраться, все остальное покажется недоредакторами =)
                                          • 0
                                            скорее вы поймете, что emacs — это не редактор.
                                            • –4
                                              Emacs is a class of feature-rich *text editors*, usually characterized by their extensibility.
                                              (http://en.wikipedia.org/wiki/Emacs)

                                              Emacs ist ein ursprünglich von Richard Stallman entwickelter Texteditor
                                              (http://de.wikipedia.org/wiki/Emacs)

                                              Emacs è un editor di testo libero estremamente versatile molto popolare fra i programmatori.
                                              (http://it.wikipedia.org/wiki/Emacs)

                                              Emacs是一种强大的文本编辑器
                                              (http://zh.wikipedia.org/wiki/Emacs)
                                              • –3
                                                что вы мне ссылки показываете? я знаю что там написано. он редактор по назначению, но это не значит, что он ТОЛЬКО редактор.
                                                • –4
                                                  1) Вы написали, что «emacs — это не редактор», что, очевидно, не соответствует истине. Это редактор. Даже более, но это не опровергает то, что он редактор.

                                                  2) Где вы прочитали оспариваемое вами утверждение, что «он ТОЛЬКО редактор»?

                                                  Из ваших двух постов понятно, что вы хотели сказать: «emacs — это не ТОЛЬКО редактор». Так бы и сказали и никто с вами не спорил бы.
                                                  • –3
                                                    я имел ввиду, что это нечто большее, которое включает в себя редактор. похоже мы не поняли друг друга.
                                                    • 0
                                                      Это редактор, который включает в себя нечто большее. Вот эта небольшая разница приходит с изучением elisp'а. Реализуйте в нём какую-нибудь примитивную менюшку с переключением буфферов.
                                                      • +1
                                                        Это интерпретатор собственного языка со встроенным редактором и набором других приложений. В одну только базовую поставку emacs23 входит не только почтовый и news клиент или планировщик, но и игры и всякие феньки вроде тайм-трекеров.
                                                        Так что скорее это платформа для приложений с отличным редактором inside.
                                        • +1
                                          Чтобы не переназначать C-w, можно использовать Ctrl-backspace, особо уодбно на клавиатурах, где backspace это левая часть пробела.
                                          • +2
                                            Спасибо за статью, многие советы действительно полезны, особенно перебиндить CapsLock и Ctrl. Первых дней 5 нервничаешь, а потом уже не понимаешь как жил раньше без этого. Грустно только когда приходишь к чужому компу.
                                            • +2
                                              Вот пару tip-ов.

                                              Чтобы не подтверждать закрытие буфера:

                                              (defun kill-current-buffer ()
                                                (interactive)
                                                (kill-buffer (current-buffer)))
                                              
                                              (global-set-key (kbd "C-x k") 'kill-current-buffer)
                                              


                                              Показывать в статусе номер строки и столбца:

                                              (column-number-mode t)

                                              Курсор в стандартном виде «палочки» а не прямоугольника:

                                              (bar-cursor-mode t)

                                              В дебиане и убунте этот mode и множество других полезных штук лежит в emacs-goodies-el

                                              • 0
                                                Под windows шрифты меняются не реестром, emacs вообще не использует реестр.
                                                А меняются они так:
                                                (set-face-font 'default «Courier New: Regular:10:: Cyrillic»)
                                                Под юниксами так тоже можно, только шрифты естественно называются подругому.
                                                • 0
                                                  вот это тогда что?
                                                  я редактирую через x, потому что так нагляднее, видишь какое приложение какой шрифт использует.
                                                  • 0
                                                    Да, действительно. Просто несколько лет использую xemacs for win и в реестре ни одного упоминания про него.
                                                  • +2
                                                    полезно, когда емакс на весь экран открыт отображение времени в статусе:

                                                    (setq display-time-interval 1)
                                                    (setq display-time-format "%H:%M:%S")
                                                    (display-time-mode)
                                                    
                                                    • 0
                                                      а мне больше всего емакс запомнился психологом, которого можно установить отдельным модулем, и поболтать с ним о том о сем%) правда только на английском%)
                                                      • 0
                                                        Насколько мне известно, сейчас он идёт в стандартной поставке.

                                                        Есть ещё такая замечательная вещь в нём hanoi называется. Очень полезна когда грустно и одиноко. Если совсем грустно и одиноко, то лучше всего стартовать так C-u 10 M-x hanoi. В принципе число можно увеличивать и дальше, но психологически тяжело
                                                        • 0
                                                          ханойские башни… помню задачу такую решал)
                                                      • +1
                                                        Для выбора буфера в iswitchb можно использовать C-s и C-r
                                                        • 0
                                                          Долго читал слово «безгранность», много думал.
                                                          • 0
                                                            Вместо некошерного -1 нужно использовать православный nil :)
                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                • 0
                                                                  7) Мне больше нравится вот это для переключения между окнами: www.emacswiki.org/cgi-bin/wiki/NumberedWindows
                                                                  10) Для переключения между буферами мне нравится ido-mode, он тоже inside emacs by default
                                                                  • 0
                                                                    Очень интересная статья, огромное спасибо автору! :)
                                                                    • 0
                                                                      Где все это уже было

                                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.