打开 HTML 标记后立即关闭它们



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

所以如果我输入

<div>

我应该得到

<div></div>

不必打电话给自己sgml-close-tag

如何实现这一点?

如果你喜欢paredit(如果你是emacs用户,你很可能喜欢),你可能会对tagedit感兴趣,这是一个由Magnar Sveen编写的emacs软件包,它提供了类似paredit的功能来编辑html。

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

如果启用实验性功能 (tagedit-add-experimental-features) ,则它将自动为您关闭标记,并使相应的结束标记文本与开始标记文本匹配。这是在能够拼接、啜饮、啜饮和所有其他疯狂的事情之上,paredit让你在使用平衡的表情时做......我觉得很棒!

与其在

每次击键后调用钩子函数,不如仅在键入>后调用它。这可以通过在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-*\([^</> trn]+\)[^</>]*>")
    (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))

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

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

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

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

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

每当您插入">"时,函数sgml-close-tag都会为您运行

使用 sgml 模式对我来说很痛苦......当我在 html 文件中点击"C-c C-t"时,迷你缓冲区打开,我输入属性...但它在无限循环中不断要求更多属性......如果我按 C-g 退出无意义循环,它会删除我之前输入的所有内容......如何从 sgml-tag 迷你缓冲区循环中退出而不擦除文件中的标签?

最新更新