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

Emacs 打开HTML标记后立即关闭它们,emacs,html-mode,sgml-mode,Emacs,Html Mode,Sgml Mode,我希望在每次打开一个HTML标签时自动插入相应的关闭HTML标签 所以如果我打字 <div> 我应该 <div></div> 无需调用sgml close标记我自己 如何实现这一点?为此,我正在使用yasnippet。 要键入此答案,如C-o,我有以下代码片段: # -*- mode: snippet -*- # name: kbd # key: kbd # -- <kbd>$0</kbd> #-*-模式:代码段-*- #

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

所以如果我打字

<div>

我应该

<div></div>

无需调用
sgml close标记
我自己


如何实现这一点?

为此,我正在使用
yasnippet
。 要键入此答案,如
C-o
,我有以下代码片段:

# -*- mode: snippet -*-
# name: kbd
# key: kbd
# --
<kbd>$0</kbd>
#-*-模式:代码段-*-
#名称:kbd
#关键词:kbd
# --
$0
所以我键入
kbd
C-o,然后用光标将其扩展为

正好在中间。对于
div
,可以有相同的行为

您可以在sgml缓冲区中评估此值,或将ii添加到sgml挂钩中:

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

无论何时插入“>”,函数
sgml close tag
都将为您运行

而不是在每次按键后调用钩子函数,只有在键入>后才调用它才有意义。这可以通过在
sgml模式
使用的键映射中重新绑定>字符来实现

此外,如果标记已关闭,则不应调用
sgml close标记。因此,以下代码添加了一个简单的regexp检查:

(取消我的sgml插入gt()
“插入“>”字符并调用
`我的sgml关闭标签(如有必要),将其保留在原来的位置。”
(互动)
(插入“>”)
(如有必要,保存偏移(我的sgml关闭标记))
(如有必要,取消sgml关闭标记()
“如果紧靠点之前的标记为
未后跟匹配结束标记的开始标记。“
(当(回头看时)
(let((标记(匹配字符串1)))
(除非(和(非(sgml-unclosed-tag-p tag))
(查看(concat“\\s-*”)
(sgml关闭标签(()()))
(加载后评估“sgml模式”
'(定义键sgml模式映射“>”“我的sgml插入gt))

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

该库位于此处:,可以通过Melpa/Marmalade(
package install TageEdit
)安装


如果您启用实验功能
(标记编辑添加实验功能)
,则它将自动为您关闭标记,并保持相应的结束标记文本与开始标记文本匹配。在使用平衡表达式时,
paredit
可以让您进行拼接、咕噜、呕吐和所有其他疯狂的操作……我认为这很棒

可以将钩子的操作限制为html模式吗?否则可以执行
define key
,范围限制为
sgml mode map
@vemv,钩子由上面的代码设置为本地缓冲区。您可以将它包含在
(添加hook'html模式hook(lambda()
中,这样您就可以为html文件激活它,并且只为它们激活它。
define key
选项也非常有效:
(define key sgml mode map“>”(lambda()(交互式)(自插入命令1)(sgml close标记))
很高兴知道
add hook
是本地缓冲区!但只有当第四个参数(可选)为非nil,或者hook变量设置为bufferlocal(请参见
C-hv add hook
)时,答案才是好的!在什么情况下,会对已关闭的标记按
?@vernv,例如,如果您不小心删除了已具有正确关闭标记的开始标记的'>'字符。如果重新插入“>”,则不希望再插入另一个结束标记。谢谢,但这对空元素不起作用,例如,
@skybert Fixed,但查看5年后的正则表达式,还有其他边缘情况不起作用。但这是一个起点。@Thomas谢谢。我最终得到了这样一个简单的钩子。正如您所看到的,我还没有弄清楚'if application'位,但它工作正常:`(defun tkj-nxml-close-if-application()(交互式);;TODO检查我们是否在一个开放元素中。(nxml平衡关闭开始标记块))(加载“nxml模式”后求值(定义键nxml模式映射“>”tkj nxml close,如果适用))“爱你的帕雷迪特,我一定在试着把它弄出来。谢谢你的提醒!