一打开HTML标签就关闭它们

时间:2013-09-05 08:12:22

标签: emacs html-mode sgml-mode

每当我打开一个HTML标签时,我都希望自动插入相应的关闭HTML标签。

所以,如果我输入

<div>

我应该

<div></div>

无需亲自致电sgml-close-tag

如何实现这一目标?

4 个答案:

答案 0 :(得分:4)

不是在每一个键击之后调用一个钩子函数,而是在键入&gt; 之后调用它是有意义的。这可以通过重新绑定sgml-mode使用的键映射中的&gt; 字符来实现。

此外,如果代码已经关闭,则不应调用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))

答案 1 :(得分:3)

如果您喜欢paredit(如果您是emacs用户,可能会这样做),您可能会对{1}}感兴趣,这是由Magnar Sveen编写的emacs包提供{{1} - 用于编辑html的功能。

图书馆在这里:https://github.com/magnars/tagedit,可以通过Melpa / Marmalade(tagedit)安装。

如果您启用了实验性功能paredit,那么它会自动为您关闭标记保持相应的结束标记文本与开始标记文本相匹配。这是能够拼接,啜饮,barf以及package-install tagedit允许你在使用平衡表达式时所做的所有其他疯狂的事情......我认为这很棒!

答案 2 :(得分:1)

我正在使用yasnippet来达到此目的。 要输入快捷方式这个答案,例如<kbd>C-o</kbd>,我有以下代码段:

# -*- mode: snippet -*-
# name: kbd
# key: kbd
# --
<kbd>$0</kbd>

所以我输入kbd C-o 然后用光标扩展到<kbd></kbd> 就在中间。您可以对div具有相同的行为。

答案 3 :(得分:1)

你可以在sgml-buffer上评估这个,或者在你的sgml-hook中添加ii:

(add-hook 'post-self-insert-hook
          (lambda () (and (eq (char-before) ?>) (sgml-close-tag))) nil t)

每当您插入“&gt;”时,系统都会运行sgml-close-tag函数