制作括号之类的符号不考虑 vim 中特定语法区域的匹配

Making a bracket like symbol no consider a match in specific syntax region in vim

假设这段文字: {This text "contains two '}'" } 在许多文件类型中,如果我在第一个 { 上按 %,它将跳转到行尾,忽略第一个 }。 如何使 vim 的匹配机制忽略特定语法区域中的 >

我的确切问题发生在 jsx 文件中,考虑一下:

<SomeComponent
    //  >>> >  >>
    x='>>>> > >> >'
    onClick={() => {}}
/>

``` 如果我在第一行的第一个字符中按 %,它将跳转到第四行中的 >,而不是跳到最后一行的第二个字符。一些插件为我处理 jsx 的语法,它们为 {() => {}} 定义了一个特殊区域我想禁用该区域中的匹配查找,就像它在注释和字符串中禁用一样。

免责声明

我不是要匹配 </>。我只想 < 匹配正确的 > 而不是 js 块中的那个 (=>).

所以我无法准确回答您的问题,但我可以为您提供一些有关“%”运动如何工作的信息。

它会查看 'matchpairs' 的列表(:help matchpairs 以获得更多信息),该列表本质上只是一个包含字符对的列表,这些字符对已由您当前可用的任何活动语法文件定义文件连同插件(如 matchit.vim)。

查看帮助文档,这些对被限制为仅允许单个字符 -> 字符映射,因此您实际上不能扩展它以允许 < 不幸地匹配 />。 (:set mps+=<:/> 爆炸了:( )

一个可能的解决方案(尽管不是很好)可能是安装 matchit.vim 插件,然后始终使用完整的标签名称关闭标签。 IE。 <foobar> some stuff </foobar>。 matchit.vim 添加标签 <> 内的内容并将其添加到 % 对列表。我不完全确定他使用什么魔法来获得字符串对,但也许查看他的来源可能会揭示让 < 匹配 />.

的解决方案

祝你好运!

阅读https://github.com/isaacs/.vim/blob/master/macros/matchit.txt#L64 to make vim ignore a specific area of text while searching for matches you should activate matchit. By default it ignores comments and strings. If you want to add more syntax regions to ignored list you should set b:match_skip variable documented here: https://github.com/isaacs/.vim/blob/master/macros/matchit.txt#L218。 在我的例子中,使用 vim-javascriptvim-jsx 我必须将它设置为:s:comment\|string\|jsArrowFunction(它的默认值是 's:comment\|string'。我为 vim-jsx 创建了这个 pull request开箱即用:https://github.com/sassanh/vim-jsx/pull/1