solovyov.net

Emacs

· · software, emacs

Ясное дело, любой человек, который достаточно плотно общается с компами - ищет себе подходящий редактор. Но если у большинства людей эта проблема не стоит достаточно остро, у программистов вообще IDE обычно есть, то для никсового админа редактор - основной инструмент производства. И лидером у большинства из них является vim, который хоть и модальный, но зато после небольшого разбирательства очень простой и лёгкий (быстро запускающийся) редактор. Есть, конечно, некоторое количество отступников - которые используют, к примеру, joe (превед, Антонз ;), или там еще какой jed/nano/etc.

Особняком стоит Emacs, который создавался как инструмент для программиста - но в действительности он содержит столько удобных вещей, что является реально удобным инструментом. Раньше я его использовал в основном только как почтовый клиент да xml-редактор, а потом забросил - уж больно тяжко запускался. Но тут пришлось редактировать файлики с кодом, а нормальных редакторов на замену найти не могу (из лучшего - EmEditor и SCiTE, но они оба и в подмётки :)), потому достал емаксище с полки.

Ну и заодно зашёл на emacswiki.org, который, как оказалось, достаточно сильно обновился. Ну я и решил сюда позаписывать на всякий случай всякие удобные фичи.


Первым делом - переключалка буферов. Кинуть в load-path, и написать в конфиг такую вот фигню:

(require 'prh-bufsw)
(setq stesla-hated-buffer-regexps '("^ " "*Buffer" "^\\*trace" "^\\*tramp" "^\\*"))
(pc-bufsw::bind-keys [C-tab] [C-S-tab])
(pc-bufsw::bind-keys [f12] [f11])
(setq pc-bufsw::quite-time 1)

Переопределяю тут регулярное выражение, маскирующее лишние буферы (я себе убрал все, что начинаются на *), плюс биндятся стандартные по другим программам клавиши C-tab/C-S-tab и, для удобства, F11 и F12. Ну и ставится таймаут на время показывания списка буферов переключаемых в 1 секунду.

Вот с такой штукой в минибуфере будет появлятся список буферов (которые не попали под исключающие правила), среди которых будет выделен текущий выбранный.


Теперь немножко GnuServ’е. Это такая дрянь, которую я не знаю, где скачать, и у меня сильно дурной инет, для того чтобы выкладывать. Называется gnuserv.exe и gnuclientw.exe. Плюс gnuserv.el.

В .emacs пишется (require 'gnuserv), и Емакс запускается программой gnuclientw.exe. Теперь будет один емакс, а всё остальное - его фреймы. Что быстро. ;)

Плюс можно сделать так, чтоб не появлялось их большое количество, а всё открывалось в одном (первом) фрейме.

(defadvice server-find-file (before server-find-file-in-one-frame activate)
    "Make sure that the selected frame is stored in `gnuserv-frame', and raised."
    (setq gnuserv-frame (selected-frame))
    (raise-frame))

(defadvice server-edit (before server-edit-in-one-frame activate)
    "Make sure that the selected frame is stored in `gnuserv-frame', and lowered."
    (setq gnuserv-frame (selected-frame))
    (lower-frame))

Эти функции заодно и поднимают его окошко наверх, когда в каком-то тотале его повесишь на F4. И нажмёшь эту кнопку. ;)


Теперь - парочка полезных комбинаций клавиш.

  • M-z - спрашивает символ, и удаляет до его первого появления в тексте дальше. С префиксом - удаляет до н-ного (соответственно, можно и до негативного - удалить назад).
  • C-M-k - удаляет так сказать завершённую фразу. Ну, к примеру, от кавычки до соответствующей кавычки. Или от открывающей скобки до соответствующей ей закрывающей скобке.
  • C-u M-! - вставляет результат исполнения шелл-команды в текущий буфер.
  • C-u M-| - берёт выделенный регион как stdin для программы, и заменяет его её stdout’ом.

Всякая фигня, которую я написал, чтоб было веселее жить. ;)

;; kill current buffer
(defun prh:kill-current-buffer ()
    (interactive)
    (kill-buffer (current-buffer)))

(global-set-key (kbd "C-x w") 'prh:kill-current-buffer)

;; set right ;) font and maximizes
(defun prh:ajust-frame ()
  "Ajusts current frame to display properties"
  (interactive)
  (set-default-font "-outline-Unifont-normal-r-normal-normal-16-120-96-96-c-*-*")
  (w32-send-sys-command 61488))

(global-set-key [C-f12] 'prh:ajust-frame)

И собственно разные неочевидные фичи.

  • Всякие замены при выделенном регионе производятся конкретно над ним.

Позже, может, еще допишу. Да и выложу конфиги + всякую всячину.