snippet-mode的高亮规则怎么写?

yasnippet自带的snippet-mode不是很好用, 自己改了一下, 遇到以下情况, 不知道该怎么写规则:

${1:aaa} test ${2:bbb$1} test $1

使用font-lock-keywords, 如果给 ${2:xxx}设置了一条规则, 再给$1设置了一条规则, 如果没有嵌套, 则ok. 但如果有嵌套, 当${2:xxx}中的xxx中出现了$1, 这种情况该怎么处理?

继续尝试发现新的问题, 输入了一半的时候也需要高亮, 比如, 用户逐渐输入一下内容:

  1. ${
  2. ${1
  3. ${1:
  4. ${1:xxx
  5. ${1:xxx}

以上每一步都需要高亮, 所以一条规则还不行, 还要处理匹配一部分的情况.

另外, 还有输入错误的情况, 比如${1xxx 错误的地方可以使用warnning face.

感觉好复杂, 有没有人研究过这个?

这是个很好的问题

但我觉得正则表达式已经不适合了

你可以建一个自己的lsp-server(印象中lsp是可以高亮的)

不要以为很难 要对自己有信心

和lsp没关系,不过parser是有必要的,也许yasnippet里可以把他的parser拆出来

语法使用正确的情况下是不会出现超过1个1这个slot的吧?

yasnippet里面的非常简单, 就是简单几个keywords, 所以功能简陋.

又看了一下文档, font-lock-keywords已经够用了, 只不过需要多添加一些匹配规则.

emacs的处理逻辑是, 对于一段文本, emacs会把所有的规则都跟这段文本从头到尾匹配一遍, 不是说一段文本被一条规则匹配了, 就跳过该文本而处理后面的文本, 会反复匹配. 所以后面规则的是可以(部分)覆盖前面的. 比如第一条规则匹配了${1:xxx$1}, 第二条规则匹配$1, 那么第一条规则匹配了之后, 第二条规则还会被应用于匹配同样的文本, 这样里面的$1就能被正确高亮了.

emacs这种逻辑正好解决了本帖提出的问题, 不过这种反复匹配会影响效率, 如果规则很多, 同一段文本会被匹配很多遍.

写错了, 应该是${2:xxx}的xxx中出现$1

被无视了 看来又沙漠里造海洋了

你的方法太高端, 没这精力考虑, 这种问题只想几十分钟搞定. 否则也可以忍受没有高亮, 毕竟不是刚需.