1

我试图为主要模式设置字体锁定。这是一些示例代码:

USING: foo bar bar ;

IN: fuelcolors

TUPLE: font < super-class
    name
    size
    bold?
    italic?
    { foreground initial: COLOR: black }
    { background initial: COLOR: white } ;

TUPLE: rgb red green blue ;

: foobar ( seq -- seq )
  hello there { 1 2 3 } ;

以下符号应该用一些面孔突出显示(没关系,我的问题是匹配部分):名称,大小,粗体?,斜体?,前景,背景,红色,绿色,蓝色。它们代表元组中插槽的名称。

我知道正则表达式不会这样做,因为匹配的区域不是连续的。斜体?和前景应该匹配,但不是这些符号之间的 { 字符。所以相反,我想我可以编写一个字体锁定匹配器函数,类似于 Dmitri 在这里提供的函数:Context-sensitive font-locking in emacs for a very similar question。

但是事实上,他的解决方案利用了要突出显示的项目的“序列”在括号内的事实,而这里不是这种情况。

字体锁定在此类情况下存在问题(正则表达式和字体锁定中的匹配数未知),但我仍然希望有一些“足够好”的解决方案,即使它需要破解字体锁定内部结构。

4

2 回答 2

1

匹配器功能似乎很适合这个。

我会使用两个函数,一个可以用来匹配TUPLE和设置成员搜索的限制,另一个是内部匹配器来查找每个元素。可以编写内部函数以了解{ name ... }构造。

诀窍是每个元素都会调用一次内部函数,因此永远不会出现匹配数量未知的情况。

规则看起来像:

'(my-match-a-tuple
  (1 'font-lock-keyword-name-face)    ;; Highlight the word TUPLE
  (my-match-tuple-member
   ;; Pre-match form (can be used move the point around and to set search limits)
   nil
   ;; Post-match form (can be used to move point around afterwords)
   nil
   (1 'font-lock-variable-face)))

您可以查看我的用于字体化 cmake 脚本的包,它大量使用了匹配器功能:https ://github.com/Lindydancer/cmake-font-lock

于 2013-08-09T20:49:35.157 回答
0

这是我最终得到的解决方案:

(,"\\(TUPLE\\):[ \n]+\\(\\(?:\\sw\\|\\s_\\)+\\)\\(?:[ \n]+<[ \n]+\\(\\(?:\\sw\\|\\s_\\)+\\)\\)?"
     (1 'factor-font-lock-parsing-word)
     (2 'factor-font-lock-type-name)
     (3 'factor-font-lock-type-name nil t)
     ("\\(\\(?:\\sw\\|\\s_\\)+\\)\\|\\(?:{[ \n]+\\(\\(?:\\sw\\|\\s_\\)+\\)[^}]+\\)"
      ((lambda (&rest foo)
         (save-excursion
           (re-search-forward " ;" nil t)
           (1- (point)))))
      nil
      (1 'factor-font-lock-symbol nil t)
      (2 'factor-font-lock-symbol nil t)))
于 2013-09-21T12:23:58.510 回答