Захват всей строки.
Этот прибамбас я подсмотрел в Textmate. Заключается он в том, чтобы замаркировать всю строку и переместить курсор в начало следуюшей строки. При этом совершенно неважно, в каком месте строки находился курсор до этого.
(defun my-mark-line ()
(interactive)
(beginning-of-line)
(cua-set-mark)
(end-of-line)
(next-line)
(beginning-of-line))
(global-set-key [(alt k)] 'my-mark-line)
Дублирование строки одной командой.
Ну тут, помоему, и объяснять много не надо: обыкновенное дублирование строки по alt-d
(defun my-copy-line ()
(interactive)
(kill-ring-save (line-beginning-position) (line-end-position))
(end-of-line)
(newline)
(cua-paste nil))
(global-set-key [(alt d)] 'my-copy-line)
Новая строка.
Создаём новую строку с отступом.
(defun my-new-line ()
(interactive)
(end-of-line)
(newline-and-indent))
(global-set-key [(alt o)] 'my-new-line)
Комментарии.
Удобное комментирование и разкомментирование либо одной строки, либо замакированного блока, используя одну и ту же команду.
(defun my-comment-or-uncomment-region (arg)
(interactive "*P")
(comment-normalize-vars)
(if (and (not mark-active) (save-excursion (beginning-of-line) (not (looking-at "\\s-*$"))))
(comment-or-uncomment-region (line-beginning-position) (line-end-position))
(comment-dwim arg)))
(global-set-key (kbd "A-/") 'my-comment-or-uncomment-region)
При этом мне очень важно, чтобы знаки комментариев учитывали актуальный отступ строки. Для этого делаем:
(setq comment-style 'indent)
Поиск парной скобки.
Мне дико нравился в своё время поиск парной скобки в Vim по нажатию %. Поэтому решил сделать подобное и в Emacs. Вот что получилось:
(defun my-match-paren (arg)
(interactive "p")
(cond ((looking-at "\\s\(")
(forward-list 1) (backward-char 1))
((looking-at "\\s\)")
(forward-char 1) (backward-list 1))
(t (self-insert-command (or arg1)))))
(global-set-key (kbd "A-%") 'my-match-paren)
Ну и напоследок.
Этот прибамбас облегчает на порядок написание SGML/HTML/XML тегов.
(defun html-surround-region-with-tag (tag-name beg end)
(interactive "sTag name: \nr")
(insert "<" tag-name ">")
(insert "" tag-name ">")
(goto-char (+ end 2 (length tag-name)))
)
(global-set-key [(control <)] 'html-surround-region-with-tag)
Жмём control-< и даём название тега без знаков '<' и '>'. Всё осталное Emacs сделает сам.