yasnippet自带的snippet-mode不是很好用, 自己改了一下, 遇到以下情况, 不知道该怎么写规则:
${1:aaa} test ${2:bbb$1} test $1
使用font-lock-keywords, 如果给 ${2:xxx}
设置了一条规则, 再给$1
设置了一条规则, 如果没有嵌套, 则ok. 但如果有嵌套, 当${2:xxx}
中的xxx
中出现了$1
, 这种情况该怎么处理?
继续尝试发现新的问题, 输入了一半的时候也需要高亮, 比如, 用户逐渐输入一下内容:
${
${1
${1:
${1:xxx
${1:xxx}
以上每一步都需要高亮, 所以一条规则还不行, 还要处理匹配一部分的情况.
另外, 还有输入错误的情况, 比如${1xxx
错误的地方可以使用warnning face.
感觉好复杂, 有没有人研究过这个?
这是个很好的问题
但我觉得正则表达式已经不适合了
你可以建一个自己的lsp-server(印象中lsp是可以高亮的)
不要以为很难 要对自己有信心
cireu
3
和lsp没关系,不过parser是有必要的,也许yasnippet里可以把他的parser拆出来
语法使用正确的情况下是不会出现超过1个1
这个slot的吧?
yasnippet里面的非常简单, 就是简单几个keywords, 所以功能简陋.
又看了一下文档, font-lock-keywords已经够用了, 只不过需要多添加一些匹配规则.
emacs的处理逻辑是, 对于一段文本, emacs会把所有的规则都跟这段文本从头到尾匹配一遍, 不是说一段文本被一条规则匹配了, 就跳过该文本而处理后面的文本, 会反复匹配. 所以后面规则的是可以(部分)覆盖前面的. 比如第一条规则匹配了${1:xxx$1}
, 第二条规则匹配$1
, 那么第一条规则匹配了之后, 第二条规则还会被应用于匹配同样的文本, 这样里面的$1
就能被正确高亮了.
emacs这种逻辑正好解决了本帖提出的问题, 不过这种反复匹配会影响效率, 如果规则很多, 同一段文本会被匹配很多遍.
写错了, 应该是${2:xxx}
的xxx中出现$1
你的方法太高端, 没这精力考虑, 这种问题只想几十分钟搞定. 否则也可以忍受没有高亮, 毕竟不是刚需.