一打开HTML标签就关闭它们

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自己.

怎么做到这一点?

Dan*_*eal 5

如果您喜欢paredit(如果您是 emacs 用户,那么您很可能会这样做),您可能会对tageditMagnar Sveen 编写的一个 emacs 包感兴趣,它提供了paredit用于编辑 html 的类似功能。

该库位于: https: //github.com/magnars/tagedit,可以通过 Melpa/Marmalade ( package-install tagedit) 安装。

如果您启用实验性功能(tagedit-add-experimental-features),那么它会自动为您关闭标签,并保持相应的结束标签文本与开始标签文本匹配。除此之外,paredit您还可以在使用平衡表达式时进行拼接、吸食、呕吐和所有其他疯狂的事情……我认为这太棒了!


Tho*_*mas 4

与其在每次击键后调用挂钩函数,不如仅在>键入 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)