我希望每当我打开一个时自动插入相应的关闭 HTML 标记。
所以如果我输入
<div>
我应该得到
<div></div>
不用打电话给sgml-close-tag
自己。
如何做到这一点?
与其在每次击键后调用钩子函数,不如只在>输入 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))
如果您喜欢paredit
(并且如果您是 emacs 用户,那么您很有可能会这样做),您可能会对tagedit
Magnar Sveen 编写的 emacs 包感兴趣,它提供了paredit
用于编辑 html 的类似功能。
该库在这里:https ://github.com/magnars/tagedit ,可以通过 Melpa/Marmalade ( package-install tagedit
) 安装。
如果您启用了实验性功能(tagedit-add-experimental-features)
,那么它会自动为您关闭标签,并保持相应的结束标签文本与开始标签文本匹配。这是在能够拼接、啜饮、吐痰和所有其他疯狂的事情的基础上,paredit
让你在处理平衡的表情时可以做到……我认为这很棒!
我正在yasnippet
为此目的使用。要键入此答案的快捷方式,例如<kbd>C-o</kbd>
,我有以下代码段:
# -*- mode: snippet -*-
# name: kbd
# key: kbd
# --
<kbd>$0</kbd>
所以我输入kbd
C-o,它被扩展为<kbd></kbd>
光标在中间。您可以对div
.
你可以在你的 sgml-buffer 上评估这个,或者将 ii 添加到你的 sgml-hook 中:
(add-hook 'post-self-insert-hook
(lambda () (and (eq (char-before) ?>) (sgml-close-tag))) nil t)
每当您插入“>”时,该功能sgml-close-tag
将为您运行