代码之家  ›  专栏  ›  技术社区  ›  SimplGy

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

  •  2
  • SimplGy  · 技术社区  · 7 年前

    我有一个在textmate中使用的自定义语法highligher。它在textmate 1中工作得很好,但在textmate 2中,它将整行视为一个单词。

    这种影响:

    • 双击选择单词(选择整行)
    • alt+箭头将光标移动到单词上(跳过整行)

    textmate 1曾经在一般的首选项中有一个“单词边界”选项,我认为这就是为什么它起作用的原因。

    我知道第二个短信 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
      }
    }
    

    有没有一种方法可以修改匹配器,以便编辑器尊重这些匹配模式中的单词边界?

    2 回复  |  直到 7 年前
        1
  •  2
  •   SimplGy    7 年前

    正如您在博客文章中所指出的,为了便于选择,我们现在将某些语法匹配的区域视为“单词”。突出显示的区域都是常量,因此它被视为一个非常长的单词。

    您需要给每个部分一个不同的范围来纠正这一点,它们都可以是常量,甚至必须是唯一的。另一种选择是给它们不同的作用域,也许将todo部分作为字符串匹配?

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

    你也可以给整行A meta 包装范围,这是我们通常对类似这样的代码区域所做的,如果您想让行范围保持为执行操作等的唯一范围。

    如:

    {  patterns = (
        {   name = 'meta.preprocessor';
            match = '^\s*\o\s.*';
        },
        {   name = 'entity.name.class';
            match = '^\s*\.\s.*';
        },
        {   name = 'meta.class.ruby';
            match = '^\s*x\s.*';
        },
    }
    
        2
  •  0
  •   berkin    7 年前

    .*太贪婪了,所以regex尽可能匹配到行尾,.*?是我所能看到的你正在寻找的;如果你想要上面的图案匹配的话' o '从行' o哎呀! '.