匹配行但尊重 Textmate 2 语言语法中的单词边界
Match line but respect word boundary in Textmate 2 Language Grammar
我有一个在 TextMate 中使用的自定义语法高亮器。它在 TextMate 1 中运行良好,但在 Textmate 2 中,它将整行视为一个单词。
这会影响:
- 双击 select 字(select 整行)
- alt+箭头将光标移动到一个词上(跳过整行)
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.*';
},
}
我有一个在 TextMate 中使用的自定义语法高亮器。它在 TextMate 1 中运行良好,但在 Textmate 2 中,它将整行视为一个单词。
这会影响:
- 双击 select 字(select 整行)
- alt+箭头将光标移动到一个词上(跳过整行)
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.*';
},
}