【发布时间】:2019-05-21 13:36:11
【问题描述】:
我正在为 Clojure 或另一个 Lisp 编写语法高亮规则,其中 (fn ...) 主要用于函数调用。我坚持突出显示函数调用的第一个单词,即函数引用。下面是我所在位置的演示:
如您所见,函数调用中的第一个单词((str a b c d) 中的str)被突出显示。但是,文字列表中的第一个元素('(1 2 3) 中的1)也被突出显示,这是无意的。需要强调的是,两个文字列表都突出显示了它们的第一个元素,这是错误的。
以下是执行此突出显示的语法规则:
syn match lispFunc "'\{0}\((\)\@<=\<.\{-1,}\>?\{0,1}"
我是这样理解这条规则的:
-
'\{0}:字符'必须匹配0次; -
\((\)\@<=:字符(必须匹配,但不能被捕获; -
\<.\{-1,}\>:匹配一个单词(\<和\>代表单词的开头和结尾); -
?\{0,1}:如果单词末尾有?字符,则认为它是单词的一部分:例如图片中list?中突出显示的?。
我已经尝试了很多,但我似乎无法让前两个子规则一起工作。
【问题讨论】:
-
这可能注定要失败:
(destructuring-bind (a b) c ...)会做什么? -
或
(let (a b c) ...) -
@tfb 非常感谢您的输入,但我专注于为函数调用保留
()的 Lisps。从这个意义上说,Clojure 的表现非常好,Racket 的表现要差一些,但我更喜欢这会产生的噪音,而不是基于字典的函数突出显示的噪音。 -
试试
syn match lispFunc "\(\('\)\@<!(\)\@<=\<.\{-1,}\>?\{0,1}" -
> 我专注于为函数调用保留 () 的 Lisps不是经典的 MacCarthy Lisp、ANSI Lisp,也不是 MacLisp 或 InterLisp 之类的任何祖先,也不是 Scheme,也不是 Emacs Lisp、EuLisp、ISLisp ...
标签: regex vim clojure lisp syntax-highlighting