yasnippet è un'implementazione particolarmente valida della sintassi snippet di Textmate per Emacs. Con questo puoi importare tutti i frammenti di Textmate. Se si installa allora, questo frammento di codice che ho scritto dovrebbe fare quello che vuoi:
(defun wrap-region-or-point-with-html-tag (start end)
"Wraps the selected text or the point with a tag"
(interactive "r")
(let (string)
(if mark-active
(list (setq string (buffer-substring start end))
(delete-region start end)))
(yas/expand-snippet (point)
(point)
(concat "<${1:p}>" string "$0</${1:$(replace-regexp-in-string \" .*\" \"\" text)}>"))))
(global-set-key (kbd "C-W") 'wrap-region-or-point-with-html-tag)
EDIT: (Va bene questo è il mio ultimo tentativo di risoluzione di questo E 'esattamente come la versione di TextMate Essa ignora anche caratteri dopo a.. spazio nel tag di chiusura)
Spiacente ho letto male la tua domanda. Questa funzione dovrebbe modificare ogni riga nella regione.
(defun wrap-lines-in-region-with-html-tag (start end)
"Wraps the selected text or the point with a tag"
(interactive "r")
(let (string)
(if mark-active
(list (setq string (buffer-substring start end))
(delete-region start end)))
(yas/expand-snippet
(replace-regexp-in-string "\\(<$1>\\).*\\'" "<${1:p}>"
(mapconcat
(lambda (line) (format "%s" line))
(mapcar
(lambda (match) (concat "<$1>" match "</${1:$(replace-regexp-in-string \" .*\" \"\" text)}>"))
(split-string string "[\r\n]")) "\n") t nil 1) (point) (point))))