vem*_*emv 5 emacs html-mode sgml-mode
每当我打开一个HTML标签时,我都希望自动插入相应的关闭HTML标签.
所以,如果我输入
<div>
Run Code Online (Sandbox Code Playgroud)
我应该得到
<div></div>
Run Code Online (Sandbox Code Playgroud)
无需打电话给sgml-close-tag自己.
怎么做到这一点?
如果您喜欢paredit(如果您是 emacs 用户,那么您很可能会这样做),您可能会对tageditMagnar Sveen 编写的一个 emacs 包感兴趣,它提供了paredit用于编辑 html 的类似功能。
该库位于: https: //github.com/magnars/tagedit,可以通过 Melpa/Marmalade ( package-install tagedit) 安装。
如果您启用实验性功能(tagedit-add-experimental-features),那么它会自动为您关闭标签,并保持相应的结束标签文本与开始标签文本匹配。除此之外,paredit您还可以在使用平衡表达式时进行拼接、吸食、呕吐和所有其他疯狂的事情……我认为这太棒了!
与其在每次击键后调用挂钩函数,不如仅在>键入 a 后调用它。>这可以通过重新绑定所使用的键盘映射中的字符来实现sgml-mode。
此外,sgml-close-tag如果标签已经关闭,则不应调用。因此,以下代码为此添加了一个简单的正则表达式检查:
(defun my-sgml-insert-gt ()
"Inserts a `>' character and calls
`my-sgml-close-tag-if-necessary', leaving point where it is."
(interactive)
(insert ">")
(save-excursion (my-sgml-close-tag-if-necessary)))
(defun my-sgml-close-tag-if-necessary ()
"Calls sgml-close-tag if the tag immediately before point is
an opening tag that is not followed by a matching closing tag."
(when (looking-back "<\\s-*\\([^</> \t\r\n]+\\)[^</>]*>")
(let ((tag (match-string 1)))
(unless (and (not (sgml-unclosed-tag-p tag))
(looking-at (concat "\\s-*<\\s-*/\\s-*" tag "\\s-*>")))
(sgml-close-tag)))))
(eval-after-load "sgml-mode"
'(define-key sgml-mode-map ">" 'my-sgml-insert-gt))
Run Code Online (Sandbox Code Playgroud)