5

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

所以如果我输入

<div>

我应该得到

<div></div>

不用打电话给sgml-close-tag自己。

如何做到这一点?

4

4 回答 4

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))
于 2013-09-05T11:24:56.587 回答
3

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

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

如果您启用了实验性功能(tagedit-add-experimental-features),那么它会自动为您关闭标签,保持相应的结束标签文本与开始标签文本匹配。这是在能够拼接、啜饮、吐痰和所有其他疯狂的事情的基础上,paredit让你在处理平衡的表情时可以做到……我认为这很棒!

于 2013-09-05T13:18:02.300 回答
1

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

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

所以我输入kbdC-o,它被扩展为<kbd></kbd>光标在中间。您可以对div.

于 2013-09-05T08:46:40.267 回答
1

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

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

每当您插入“>”时,该功能sgml-close-tag将为您运行

于 2013-09-05T10:00:49.023 回答