在Emacs NXML模式下修复属性完成

我用XML格式的源文件编写了这个网站上的大多数页面,并使用emacst编辑这些源。我对nXML模式如何与散文样式XML配合使用感到非常满意,使其比其他环境更可用。但是最近的变化(Emacs26.1,iirc)在环境中加入一些沙砾。

使用XML在Emacs中工作的一个好处是,我可以为XML格式定义aschema。我这样做是用RELAX NG COMPACT语法这是一种非常明智和可读的模式编写方式。(比XML模式或DTD好得多)使用该模式,Emacs让我完成了XML标记和属性。NXML模式以自己的方式完成了这项工作,但在最近的emacs(26.1)中,这种机制被转移到了更常见的emacs方式,这种方式与现有的许多emacs完成工具一起工作得更好。

可悲的是,然而,这在NXML模式完成时破坏了一个漂亮的特性。如果IComplete属性,NXML模式将自动添加=在献礼名称之后,使我很容易立即输入值。因为改变了,事实上,我必须把这两个角色输入我自己(恐怖……恐怖……)

但是,当然,Emacs最大的优点是当像这样的东西出现时,我可以用几个Emacs函数很容易地解决这个问题。所以我添加了下面的emacs初始化。

(defun mf nxml tag start()“返回<before point的位置”(save outlocation(search backward“<”nil t))(defun mf-nxml-at-attribute-name-p()“以属性名称表示的truthy if”(save outlocation(re search backward rng in attribute regex(mf nxml tag start)t))(defun mf-nxml-at-attribute-value-p()“以属性值表示的truthy if”(保存偏移量(在属性值regex(mf nxml tag start)t中向后搜索rng))(defun mf nxml completion at point()“在nxml模式下完成点”(interactive)(cond((mf-nxml-at-attribute-name-p)(在点完成)(插入“=\”)(mf-nxml-at-attribute-value-p)(在点完成)(插入“\”)(t(com(在点上完成)))

我只希望我使用的其他工具内部可重编程性这使得这种事情在一个真正的编辑器中很正常。

188bet足球充值马丁·福勒:2019年2月20日