【问题标题】:Syntax highlighting rule to highlight the function reference in a Lisp function call在 Lisp 函数调用中突出显示函数引用的语法高亮规则
【发布时间】: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次;
  • \((\)\@&lt;=:字符(必须匹配,但不能被捕获;
  • \&lt;.\{-1,}\&gt;:匹配一个单词(\&lt;\&gt;代表单词的开头和结尾);
  • ?\{0,1}:如果单词末尾有 ? 字符,则认为它是单词的一部分:例如图片中list? 中突出显示的?

我已经尝试了很多,但我似乎无法让前两个子规则一起工作。

【问题讨论】:

  • 这可能注定要失败:(destructuring-bind (a b) c ...) 会做什么?
  • (let (a b c) ...)
  • @tfb 非常感谢您的输入,但我专注于为函数调用保留 () 的 Lisps。从这个意义上说,Clojure 的表现非常好,Racket 的表现要差一些,但我更喜欢这会产生的噪音,而不是基于字典的函数突出显示的噪音。
  • 试试syn match lispFunc "\(\('\)\@&lt;!(\)\@&lt;=\&lt;.\{-1,}\&gt;?\{0,1}"
  • > 我专注于为函数调用保留 () 的 Lisps不是经典的 MacCarthy Lisp、ANSI Lisp,也不是 MacLisp 或 InterLisp 之类的任何祖先,也不是 Scheme,也不是 Emacs Lisp、EuLisp、ISLisp ...

标签: regex vim clojure lisp syntax-highlighting


【解决方案1】:

你可以使用

syn match lispFunc "\(\('\)\@<!(\)\@<=\<.\{-1,}\>?\{0,1}"

这里,\(\('\)\@&lt;!(\)\@&lt;= 是一个正向后视,仅当 ( 前面没有 ' 时才匹配它。这个条件是用\('\)\@&lt;! negativelookbehind 在肯定的lookbehind 中设置的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2010-10-26
    相关资源
    最近更新 更多