在TextMate中,可以使用ctrl-shift-w将文本包装在Open / Close标记中,并使用ctrl-shift-cmd-w将每行包装在Open / Close标记的区域中。如何使用emacs lisp在Emacs中实现相同的功能?
emacs becomes <p>emacs</p>
而且......
emacs textmate vi becomes <li>emacs</li> <li>textmate</li> <li>vi</li>
答案 0 :(得分:7)
This answer为您提供了包装区域的解决方案(一旦您修改它以使用尖括号)。
此例程将提示您输入要使用的标记,并应使用该类型的打开/关闭标记标记区域中的每一行:
(defun my-tag-lines (b e tag)
"'tag' every line in the region with a tag"
(interactive "r\nMTag for line: ")
(save-restriction
(narrow-to-region b e)
(save-excursion
(goto-char (point-min))
(while (< (point) (point-max))
(beginning-of-line)
(insert (format "<%s>" tag))
(end-of-line)
(insert (format "</%s>" tag))
(forward-line 1)))))
*注意:*如果您希望tag
始终为li
,则删除标记参数,从对交互的调用中删除文本\nMTag for line:
,并更新插入调用只需按照您的预期插入"<li\>"
。
答案 1 :(得分:5)
对于sgml-mode
代理,请标记要标记的区域,键入M-x sgml-tag
,然后键入您要使用的标记名称(按TAB
以获取可用HTML元素的列表)。尽管如此,此方法不允许您标记区域中的每一行,您可以通过录制键盘宏来解决此问题。
答案 2 :(得分:3)
yasnippet是针对Emacs的Textmate片段语法的一个特别好的实现。有了它,您可以导入所有Textmate的片段。如果你安装它,我写的这个片段应该做你想要的:
(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)
编辑:(好的,这是我最后一次尝试解决此问题。它与Textmate的版本完全相同。它甚至会在结束标记中的空格后忽略字符)
抱歉,我误解了你的问题。此功能应编辑区域中的每一行。
(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))))
答案 3 :(得分:0)
这个关于Trey答案的变体也会正确地缩进html。
(defun wrap-lines-region-html (b e tag)
"'tag' every line in the region with a tag"
(interactive "r\nMTag for line: ")
(setq p (point-marker))
(save-excursion
(goto-char b)
(while (< (point) p)
(beginning-of-line)
(indent-according-to-mode)
(insert (format "<%s>" tag))
(end-of-line)
(insert (format "</%s>" tag))
(forward-line 1))))