13 окт. 2007 г.

Несколько прибамбасов для более удобной работы с текстом.

Захват всей строки.

Этот прибамбас я подсмотрел в 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 "")
  (goto-char (+ end 2 (length tag-name)))
  )

(global-set-key [(control <)] 'html-surround-region-with-tag)
 

Жмём control-< и даём название тега без знаков '<' и '>'. Всё осталное Emacs сделает сам.