【问题标题】:Match line but respect word boundary in Textmate 2 Language Grammar匹配行但尊重 Textmate 2 语言语法中的单词边界
【发布时间】:2018-07-19 16:17:36
【问题描述】:

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

这会影响:

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

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

我了解 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
  }
}

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

【问题讨论】:

  • 它不应该匹配什么?
  • 这会像我想要的那样突出显示整行。但是,出于文本导航的目的,编辑器随后将整行视为一个“单词”,这对我来说是不可接受的。

标签: syntax-highlighting textmate textmate2


【解决方案1】:

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

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

如果你给他们一个常量和字符串范围,工作就会完成。如果您给他们不同的常量范围,您将需要为每个给他们不同的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.*';
    },
}

【讨论】:

  • 天哪。我不知道选择器的前缀有功能影响。我以为这只是一个命名系统。行突出显示和单词导航现在都可以使用。 fwiw,这个问题让我在 TextMate 1.5 上坚持了好几年。直到我的雇主出于安全原因让我升级。谢谢!
【解决方案2】:

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

【讨论】:

  • 是的,你是对的。但是,我想用语法荧光笔突出显示整行,所以我想我希望模式匹配整行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2013-01-17
  • 2014-11-21
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多