匹配行但尊重 Textmate 2 语言语法中的单词边界

Match line but respect word boundary in Textmate 2 Language Grammar

我有一个在 TextMate 中使用的自定义语法高亮器。它在 TextMate 1 中运行良好,但在 Textmate 2 中,它将整行视为一个单词。

这会影响:

Textmate 1 曾经在一般首选项中有一个 "word boundary" 选项,我认为这就是它起作用的原因。

我了解 Textmate 2 refactored 词边界处理,但我不明白如何使我的语法包在新范例中工作。

我的语言语法很简单,它有这样的条目:

{  patterns = (
  {
    name = 'constant.language.toStart.todo';
    match = '^\s*o\s.*';
      // ^     Starting at the beginning of the line,
      // \s*   Preceded by any number of spaces
      // o\s   Match any "o "
      // .*    Then match all chars after it
  }
}

我有没有办法修改匹配器,以便编辑器尊重这些匹配模式内的单词边界?

.* 是贪婪的,所以正则表达式尽可能多地匹配到行尾,.*?就我所见,这就是你要找的东西;如果您希望上面的模式与行“o oopps”中的“o”相匹配。

正如您指向博客 post 的那样,我们现在将某些语法匹配区域视为 'word' 以供选择。您突出显示的区域都是一个常量,因此它被视为一个非常长的单词。

你需要给每个部分一个不同的范围来纠正这个问题,它们甚至可以是常量,但必须是唯一的。另一种选择是给它们不同的范围,也许将待办事项部分匹配为字符串?

如果你给他们一个常量和字符串范围,工作就会完成。如果给它们不同的常量作用域,则需要为每个给它们不同的 characterClass 值创建一个首选项。 (值不重要,只需要是唯一的。)

您还可以为整行提供一个 meta 包装器范围,如果您希望将该行的范围限定为单一的内容以执行操作等,我们通常会像这样处理代码区域。

例如:

{  patterns = (
    {   name = 'meta.preprocessor';
        match = '^\s*\o\s.*';
    },
    {   name = 'entity.name.class';
        match = '^\s*\.\s.*';
    },
    {   name = 'meta.class.ruby';
        match = '^\s*x\s.*';
    },
}