andymass/vim-matchup

GitHub: andymass/vim-matchup

Vim-matchup是一个Vim/Neovim插件,通过增强%键功能,解决了代码导航和结构高亮显示的问题。

Stars: 1909 | Forks: 88

and in this corner...

vim match-up :fist_right::fist_left:

match-up 是一个插件,它允许您高亮、导航和操作匹配的文本集合。它将 vim 的 `%` 键从单个字符扩展到了语言相关的单词。 ## 截图 ## 目录 - [概述](#overview) - [安装](#installation) - [功能](#features) - [选项](#options) - [常见问题解答](#faq) - [互操作性](#interoperability) - [致谢](#acknowledgments) - [开发](#development) ## 概述 match-up 可以作为经典插件 [matchit.vim] 的直接替代品。 match-up 旨在增强 matchit 的所有功能,修复其许多缺陷和错误,并添加一些全新的功能。它还取代了标准插件 [matchparen],允许将 matchit 的所有单词与 `matchpairs` (`(){}[]`) 一起高亮显示。 请参阅[详细功能文档](#detailed-feature-documentation)了解更多信息。该插件: - 将 vim 的 `%` 动作扩展为语言相关的单词。以下 vim 文件类型插件目前为 match-up 提供特殊支持: 其他文件类型可以通过安装额外的文件类型插件(不随 match-up 提供)来支持。 注意:match-up 使用与 matchit 相同的 `b:match_words`。 - 添加了动作 `g%`、`[%`、`]%` 和 `z%`。 - 将这些动作组合成便捷的文本对象 `i%` 和 `a%`。 - 高亮光标下 `%` 可以操作的符号和单词,并高亮匹配的符号和单词。现在您可以轻松地知道 `%` 将跳转到何处。 ## 安装 如果您使用 [vim-plug](https://github.com/junegunn/vim-plug),则将以下行添加到您的 vimrc 的插件部分: ``` Plug 'andymass/vim-matchup' ``` 然后使用 `:PlugInstall`。 或者,如果您使用 [packer](https://github.com/wbthomason/packer.nvim),将其添加到您的 init.vim ``` return require('packer').startup(function(use) use { 'andymass/vim-matchup', setup = function() -- may set any options here vim.g.matchup_matchparen_offscreen = { method = "popup" } end } end) ``` 然后运行 `:PackerSync` 或类似命令。 如果您使用 [lazy.nvim](https://github.com/folke/lazy.nvim),将以下内容添加到您的插件规范中 ``` { 'andymass/vim-matchup', init = function() -- modify your configuration vars here vim.g.matchup_treesitter_stopline = 500 -- or call the setup function provided as a helper. It defines the -- configuration vars for you require('match-up').setup({ treesitter = { stopline = 500 } }) end, -- or use the `opts` mechanism built into `lazy.nvim`. It calls -- `require('match-up').setup` under the hood ---@type matchup.Config opts = { treesitter = { stopline = 500, } } } ``` 请参阅 [Tree-sitter 集成](https://github.com/andymass/vim-matchup#tree-sitter-integration)了解 Neovim 中 tree-sitter 集成的工作原理。 注意:我不建议使用 `event = 'VimEnter'` 或 `event = 'CursorMoved'` 等替代加载策略,因为 match-up 在启动时已经加载了最少量的代码。它可能有效,但如果遇到问题,请移除 event 键作为第一个调试步骤。 您可以使用任何其他插件管理器,例如 [vundle](https://github.com/gmarik/vundle)、[dein](https://github.com/Shougo/dein.vim)、[neobundle](https://github.com/Shougo/neobundle.vim) 或 [pathogen](https://github.com/tpope/vim-pathogen)。 match-up 应该会自动禁用 matchit 和 matchparen,但如果仍有问题,请尝试在 vimrc 顶部附近添加以下内容: ``` let g:loaded_matchit = 1 ``` 有关与其他插件一起工作的更多信息,请参阅[互操作性](#interoperability)。 ### Tree-sitter 集成 _注意:目前此功能仅在 Neovim 中可用。仅支持最新的 Neovim 稳定版。_ match-up 支持由 tree-sitter 提供的语言语法。支持的语言列表可在[此处](https://github.com/andymass/vim-matchup/tree/master/after/queries)找到。 如果您正在使用 Neovim,此功能会自动启用。并且不需要其他插件即可工作。 tree-sitter 相关的配置选项共享前缀 `g:matchup_treesitter`。您可以在 `:h g:matchup_treesitter_enabled` 中查看它们。 截图: ## 功能 | | 功能 | **match-up** | matchit | matchparen | | ------- | -------------------------------- | ------------ | ---------- | ---------- | | ([a.1]) | 在匹配单词间跳转 | :thumbsup: | :thumbsup: | :x: | | ([a.2]) | 跳转到开始和结束单词 | :thumbsup: | :thumbsup: | :x: | | ([a.3]) | 跳入内部 (`z%`) | :thumbsup: | :x: | :x: | | ([b.1]) | 完整的文本对象集 | :thumbsup: | :question: | :x: | | ([b.2]) | 删除周围的匹配单词 | :thumbsup: | :x: | :x: | | ([c.1]) | 高亮 `()`、`[]` 和 `{}` | :thumbsup: | :x: | :thumbsup: | | ([c.2]) | 高亮*所有*匹配单词 | :thumbsup: | :x: | :x: | | ([c.3]) | 在屏幕外显示匹配项 | :thumbsup: | :x: | :x: | | ([c.4]) | 显示当前所在位置(面包屑导航) | :thumbsup: | :x: | :x: | | ([d.1]) | (Neovim) tree-sitter 集成 | :thumbsup: | :x: | :x: | 图例::thumbsup: 支持。 :question: 实现不佳、已损坏或不确定。 :x: 不可能。 ### 详细功能文档 我们所说的开、闭、中间是什么意思?这取决于特定的文件类型,并通过变量 `b:match_words` 进行配置。以下是几个示例: #### vim-script ``` if l:x == 1 call one() elseif l:x == 2 call two() else call three() endif ``` 对于 vim-script 语言,match-up 理解单词 `if`、`else`、`elseif`、`endif` 以及它们构成的顺序结构。"开" 单词是 `if`,"闭" 单词是 `endif`,"中间" 单词是 `else` 和 `elseif`。`if`/`endif` 对称为 "开到闭" 块,而 `if`/`else`、`else`/`elseif` 和 `elseif`/`endif` 称为 "任意" 块。 #### C、C++ ``` #if 0 #else #endif void some_func() { if (true) { one(); } else if (false && false) { two(); } else { three(); } } ``` 由于在 C 和 C++ 中,代码块使用花括号 (`{` 和 `}`) 分隔,match-up 会将 `{` 识别为开单词,`}` 识别为闭单词。它将忽略 `if` 和 `else if`,因为它们在 vim 默认的 C 文件类型插件中未定义。 (注意:在 Neovim 中,这是可选的,通过 [Tree-sitter](#tree-sitter-integration) 支持) 另一方面,match-up 会识别 `#if`、`#else`、`#endif` 预处理器指令。 #### (a.1) 在匹配单词间跳转 - `%` 向前跳转到下一个匹配单词。如果位于闭单词,则循环回到对应的开单词。 - `{count}%` 向前跳转 `{count}` 次。需要 `{count} <= g:matchup_motion_override_Npercent`。对于更大的 `{count}`,`{count}%` 将转到文件中的第 `{count}` 百分比位置。 - `g%` 向后跳转到第 `[count]` 个前一个匹配单词。如果位于开单词,则循环回到对应的闭单词。 #### (a.2) 跳转到开单词和闭单词 - `[%` 跳转到第 `[count]` 个前一个外部开单词。允许导航到包围光标的代码块开头。这类似于 vim 内置的 `[(` 和 `[{`,是一个[独占]动作。 - `]%` 跳转到第 `[count]` 个下一个包围闭单词。这是一个[独占]动作。 #### (a.3) 跳入内部 - `z%` 跳入第 `[count]` 个最近的内部包含块。当与操作符一起使用时,这是一个[独占]动作,但它会消耗空白字符。例如,其中 `█` 是光标位置, ``` █ call somefunction(param1, param2) ``` `dz%` 产生 ``` param1, param2) ``` 但在 ``` █ call somefunction( param1, param2) ``` `dz%` 也会产生 ``` param1, param2) ``` #### (b.1) 完整的文本对象集 - `i%` 任意块的内部 - `1i%` 开到闭块的内部 - `{count}i%` 如果计数大于 1,则为第 `{count}` 个包围开到闭块的内部 - `a%` 任意块。 - `1a%` 开到闭块。包含中间单词但不包含开单词和闭单词。 - `{count}a%` 如果 `{count}` 大于 1,则为第 `{count}` 个包围开到闭块。 请参阅[此处](#line-wise-operatortext-object-combinations)了解一些示例和重要的特殊情况。 #### (c.1) 高亮 `()`、`[]` 和 `{}` match-up 模拟 vim 的 matchparen 来高亮 `matchpairs` 设置中包含的符号。 #### (c.2) 高亮*所有*匹配项 要在启动时禁用匹配高亮,请在 vimrc 中使用 `let g:matchup_matchparen_enabled = 0` 请参阅[此处](#module-matchparen)了解更多信息和相关选项。 您可以使用 `:DoMatchParen` 实时启用高亮。 同样,您可以随时使用 `:NoMatchParen` 禁用高亮。 启动后,最好使用 `:NoMatchParen` 和 `:DoMatchParen` 来全局切换高亮,而不是设置全局变量,因为这些命令确保不会留下陈旧的匹配项。 #### (c.3) 在屏幕外显示匹配项 如果原本要高亮的开或闭单词位于当前窗口之外的行上,匹配项将显示在状态行或弹出窗口中。 如果开和闭匹配项都在屏幕外,则优先显示闭匹配项。 有关更多详情,请参阅选项 `g:matchup_matchparen_offscreen`。 对于弹出窗口样式(在最近的 vim 和 Neovim 版本中支持): ``` let g:matchup_matchparen_offscreen = {'method': 'popup'} ``` 对于状态行样式(默认): ``` let g:matchup_matchparen_offscreen = {'method': 'status'} ``` #### (c.4) 我在哪里? 如果您迷失了,可以使用以下方式询问 match-up 您在哪里: ``` :MatchupWhereAmI? ``` 这会通过查找连续的匹配单词(就像重复执行 `[%`),以面包屑风格回显您在代码中的位置。 将其绑定到某个键(默认未绑定)会很有用: ``` nnoremap :MatchupWhereAmI? ``` 如果您真的迷失了,可以更努力地询问以获得更详细的打印输出。 ``` :MatchupWhereAmI?? ``` ### 包含和独占动作 在 vim 中,跟在操作符(例如用于删除的 `d` 和用于更改的 `c`)后面的字符动作是[包含]或[独占]的。这意味着它们要么包含结束位置,要么不包含。这里,"结束位置" 指的是动作扫过的区域中最接近缓冲区末尾的行和列。match-up 的设计使得 `d]%` 在括号内的行为与 `d])` 完全相同,只是推广到了单词。换言之,_向前_ 独占动作将不包含闭单词。在此示例中,其中 `█` 是光标位置, ``` if █x | continue | endif ``` 按下 `d]%` 将产生(光标在 `e` 上) ``` if endif ``` 要包含闭单词,请使用 `dv]%` 或 `v]%d`。这与 vim 的 `d])` 和 `d]}` 兼容。 操作符作用于_向后_独占动作时,将排除操作符调用前光标所在的位置。例如,在 ``` if █x | continue | endif ``` 按下 `d[%` 将产生 ``` █x | continue | endif ``` 这与 vim 的 `d[(` 和 `d[{` 兼容。 与 `]%` 不同,`%` 是一个[包含]动作。作为 `d`(删除)操作符的特殊情况,如果 `d%` 留下空行,它们也将被删除。实际上,它将按行操作。例如,按下 `d%` 将什么也不会留下。 ``` █( ) ``` 要在这种情况下按字符操作,请使用 `dv%` 或 `v%d`。这与 vim 内置的 `matchpairs` 上的 `d%` 兼容。 ### 按行操作符/文本对象组合 通常,文本对象 `i%` 和 `a%` 按字符工作。但是,有一些特殊情况。对于某些操作符与 `i%` 结合的情况,在特定条件下,match-up 实际上会按行操作。例如,在 ``` if condition █call one() call two() endif ``` 按下 `di%` 将产生 ``` if condition endif ``` 尽管对象 `i%` 建议删除 ` condition`。其意图是在某些情况下使操作符更有用。以下规则适用: 1. 操作符必须列在 `g:matchup_text_obj_linewise_operators` 中。 默认是 `d` 和 `y`(例如 `di%` 和 `ya%`)。 2. 外部块必须跨越多行。 3. 开分隔符和闭分隔符必须超过一个字符长。特别是,涉及 `(`...`)` 块的 `di%` 不会受这些特殊规则约束。 要防止特定操作的此行为,请使用 `vi%d`。请注意,涉及缩进的特殊情况仍然适用(与 |i)| 等相同)。 要完全禁用此行为,请从以下变量中移除该操作符, ``` let g:matchup_text_obj_linewise_operators = [ 'y' ] ``` 注意:与 vim 内置的 `i)`、`ab` 等不同,`i%` 不会使现有的可视模式变为按字符模式。 第二种特殊情况涉及 `da%`。在此示例中, ``` if condition █call one() call two() endif ``` 按下 `da%` 将删除所有四行并留下空白。这与 vim 的 `da(`、`dab` 等兼容。 ## 选项 要完全禁用该插件, ``` let g:matchup_enabled = 0 ``` 默认值:1 要禁用特定模块, ``` let g:matchup_matchparen_enabled = 0 let g:matchup_motion_enabled = 0 let g:matchup_text_obj_enabled = 0 ``` 默认值:1 要启用删除周围 (`ds%`) 和更改周围 (`cs%`) 映射, ``` let g:matchup_surround_enabled = 1 ``` 默认值:0 要启用实验性的[transmute](https://github.com/andymass/vim-matchup/blob/5a1978e46a0e721b5c5d113379c685ff7ec339e7/doc/matchup.txt#L311)模块, ``` let g:matchup_transmute_enabled = 1 ``` 默认值:0 要配置使用动作和文本对象时在任一方向上搜索的行数。不适用于匹配高亮(请参阅 `g:matchup_matchparen_stopline`)。 ``` let g:matchup_delim_stopline = 1500 ``` 默认值:1500 要禁用字符串和注释内的匹配, ``` let g:matchup_delim_noskips = 1 " recognize symbols within comments let g:matchup_delim_noskips = 2 " don't recognize anything in comments ``` 默认值:0(在字符串和注释内启用匹配) ### 变量 match-up 理解来自 matchit 的以下变量。 - `b:match_words` - `b:match_skip` - `b:match_ignorecase` 这些在相应的 ftplugin 文件中设置。它们可能并非适用于每种文件类型。要支持新的文件类型,请创建一个文件 `after/ftplugin/{filetype}.vim`,在其中适当设置它们。 ### matchparen 模块 要在启动时禁用匹配高亮,请在 vimrc 中使用 `let g:matchup_matchparen_enabled = 0`。 注意:vim 内置的 |pi_paren| 插件也会被禁用。 变量 `g:loaded_matchparen` 对 match-up 无效。 #### 自定义高亮颜色 match-up 默认使用 `MatchParen` 高亮组,可以进行配置。例如, ``` :hi MatchParen ctermbg=blue guibg=lightblue cterm=italic gui=italic ``` 您可能希望将其放在 `ColorScheme` `autocmd` 中,以便在颜色方案更改后保留它: ``` augroup matchup_matchparen_highlight autocmd! autocmd ColorScheme * hi MatchParen guifg=red augroup END ``` 您也可以使用 `MatchWord` 高亮组以不同于括号的方式高亮单词。如果您觉得 `MatchWord` 样式对大块内容分散注意力,可以这样做。 ``` :hi MatchWord ctermfg=red guifg=blue cterm=underline gui=underline ``` 还有 `MatchParenCur` 和 `MatchWordCur`,允许您单独为光标下的匹配项配置高亮。 ``` :hi MatchParenCur cterm=underline gui=underline :hi MatchWordCur cterm=underline gui=underline ``` matchparen 模块可以在每个缓冲区上禁用(没有对应的命令)。默认情况下,如果禁用特定缓冲区的高亮,该缓冲区仍将使用标准插件 matchparen。 ``` let b:matchup_matchparen_enabled = 0 ``` 默认值:1 如果此模块在特定缓冲区上被禁用,match-up 仍将回退到 vim 标准插件 matchparen,后者将高亮 `matchpairs`,如 `()`、`[]` 和 `{}`。要禁用此行为, ``` let b:matchup_matchparen_fallback = 0 ``` 默认值:1 这些选项的一个常见用法是为特定文件类型自动禁用 matchparen; ``` augroup matchup_matchparen_disable_ft autocmd! autocmd FileType tex let [b:matchup_matchparen_fallback, \ b:matchup_matchparen_enabled] = [0, 0] augroup END ``` 是否高亮已知单词,即使没有匹配项: ``` let g:matchup_matchparen_singleton = 1 ``` 默认值:0 控制屏幕外匹配行为的字典。 ``` let g:matchup_matchparen_offscreen = { ... } ``` 默认值:`{'method': 'status'}` 如果为空,则禁用此功能。否则,它应包含以下可选键: - `method`: 设置用于显示屏幕外匹配项的方法。 可能的值为: `'status'`(默认):为屏幕外匹配项替换_状态行_。如果匹配项在屏幕外,该匹配项所在的行将以语法高亮显示在状态行中,并带有行号(如果启用了行号)。如果匹配项在屏幕边框上方,将显示额外的 Δ 符号,以指示匹配行实际上在光标行之上。 `'popup'`: 在弹出窗口(vim)或浮动窗口(Neovim)中显示屏幕外匹配项。 `'status_manual'`: 计算将在状态行或弹出窗口中显示的字符串,但不显示它。函数 `MatchupStatusOffscreen()` 可用于获取文本。 - `scrolloff`: 启用时,当光标位于屏幕边缘时,屏幕外匹配项将不会显示在状态行中(遵守 'scrolloff' 的值)。这旨在防止使用 j 和 k 滚动时的闪烁。 默认值:0。 高亮匹配项时在任一方向上搜索的行数。请保守设置此值,因为高值可能会导致性能问题。 ``` let g:matchup_matchparen_stopline = 400 " for match highlighting only ``` 默认值:400 #### 高亮超时 调整 matchparen 高亮的超时时间(毫秒): ``` let g:matchup_matchparen_timeout = 300 let g:matchup_matchparen_insert_timeout = 60 ``` 默认值:300, 60 #### 延迟高亮 延迟高亮通过短暂延迟高亮并观察光标是否继续移动来改善光标移动性能(例如使用 `hjkl` 时); ``` let g:matchup_matchparen_deferred = 1 ``` 默认值:0(禁用) 注意:此功能仅当您的 vim 版本具有 `timers` 和函数 `timer_pause` 时才可用,版本 7.4.2180 及之后。 调整延迟高亮的延迟时间(毫秒): ``` let g:matchup_matchparen_deferred_show_delay = 50 let g:matchup_matchparen_deferred_hide_delay = 700 ``` 默认值:50, 700 注意:这些延迟无法动态更改,应在插件加载之前配置(例如在您的 vimrc 中)。 #### 高亮周围分隔符 要高亮周围的分隔符直到光标移动,请使用如下映射 ``` nmap (matchup-hi-surround) ``` 此功能没有默认映射。 您也可以在光标移动时始终高亮周围的分隔符。 ``` let g:matchup_matchparen_deferred = 1 let g:matchup_matchparen_hi_surround_always = 1 ``` 默认值:0(关闭) 这可以在每个缓冲区上设置: ``` autocmd FileType tex let b:matchup_matchparen_hi_surround_always = 1 ``` 注意:此功能_需要_支持并启用[延迟高亮](#deferred-highlighting)。 ### motion 模块 在 vim 中,`{count}%` 转到文件的第 `{count}` 百分比位置。match-up 对于小的 `{count}` 覆盖了此动作(默认情况下,任何小于 7 的值)。要允许 `{count}%` 的 `{count}` 小于 12, ``` g:matchup_motion_override_Npercent = 11 ``` 要禁用此功能并恢复 vim 默认的 `{count}%`, ``` g:matchup_motion_override_Npercent = 0 ``` 要始终启用此功能,请使用任何大于 99 的值, ``` g:matchup_motion_override_Npercent = 100 ``` 默认值:6 如果启用,向下移动(`%`/`]%`)时,光标将落在中间和闭单词的末尾。向上移动(`g%`、`[%`)时,光标将落在开头。要禁用, ``` let g:matchup_motion_cursor_end = 0 ``` 默认值:1 ### text_obj 模块 修改可能按[行](#line-wise-operatortext-object-combinations)操作的操作符集合 ``` let g:matchup_text_obj_linewise_operators = ['d', 'y'] ``` 默认值:`['d', 'y']` ## 常见问题解答 - match-up 不工作 此插件至少需要 vim 7.4。它应该可以在 vim 7.4.898 中工作,但至少 vim 7.4.1689 更好。如果可能,我建议使用最新版本的 vim。 如果您遇到问题,请告诉我您的 vim 版本和错误消息。 尝试更新 vim 并查看问题是否仍然存在。 - 为什么在语言 Y 中的构造 X 跳转不工作? 您可以使用 `autocmd FileType myft let b:match_words = 'something:else'` 为文件类型配置自定义匹配表达式。 有关如何自定义匹配的更多信息,请参阅 [wiki](https://github.com/andymass/vim-matchup/wiki/The-match-up-wiki)。 如需帮助,请提交一个新问题,并尽可能具体。 - 构造 X 的高亮不正确 match-up 使用 matchit 的文件类型特定数据,这些数据可能无法提供足够的信息来创建正确的高亮。要解决此问题,您可能需要在配置中修改 `b:match_words`。 如需更多帮助,请提交一个新问题,并尽可能具体。 - 我遇到了性能问题 match-up 旨在尽可能快,但高亮匹配单词可能占用资源,在性能较弱的机器上可能会很慢。您可以尝试以下方法来提高性能: 1. 更新到最新版本的 vim。新版本更快,测试更广泛,并且得到 match-up 更好的支持。 2. 尝试[延迟高亮](#deferred-highlighting),它会延迟高亮直到光标静止,以提高光标移动性能。 3. 降低[高亮超时](#highlighting-timeouts)。请注意,如果高亮花费的时间超过超时时间,则在光标移动之前将不会再次尝试高亮。 如果您遇到任何其他性能问题,请提交一个新问题并报告 `:MatchupShowTimes` 的输出。 - 为什么状态行上有一个奇怪的条目? 这是一个功能,可帮助您看到 vim 屏幕之外的匹配项,类似于某些 IDE。如果您希望禁用它,请使用 `let g:matchup_matchparen_offscreen = {}` - 当行相距太远时匹配不起作用。 出于性能原因,搜索行数是有限制的。您可以使用以下选项增加限制: `let g:matchup_delim_stopline = 1500 " 通常` `let g:matchup_matchparen_stopline = 400 " 仅用于匹配高亮` - 映射 `1i%` 和 `1a%` 很难按下。 您可以使用以下映射 `I%` 和 `A%` 以方便操作: `function! s:matchup_convenience_maps()` ` xnoremap (std-I) I` ` xnoremap (std-A) A` ` xmap I mode()==''?'(std-I)':(v:count?'':'1').'i'` ` xmap A mode()==''?'(std-A)':(v:count?'':'1').'a'` ` for l:v in ['', 'v', 'V', '']` ` execute 'omap ' l:v.'I%' "(v:count?'':'1').'".l:v."i%'"` ` execute 'omap ' l:v.'A%' "(v:count?'':'1').'".l:v."a%'"` ` endfor` `endfunction` `call s:matchup_convenience_maps()` 注意:这与插件 targets.vim 不兼容。 - 我该如何贡献? 请阅读[贡献指南](CONTRIBUTING.md)和[问题模板](.github/ISSUE_TEMPLATE/bug_report.md)。在提交问题和拉取请求时,请尽可能精确和详细。 ## 互操作性 ### vimtex,用于 LaTeX 文档 默认情况下,当检测到 [vimtex] 时,match-up 会自动为 tex 文件禁用。要为 tex 文件启用 match-up,请使用 ``` let g:matchup_override_vimtex = 1 ``` match-up 的匹配引擎比 vimtex 更先进,支持中间分隔符,如 `\middle|` 和 `\else`。两个插件识别的分隔符确切集合可能不同。例如,映射 `da%` 和 `dad` 并不总是匹配,特别是如果您自定义了 vimtex 的分隔符。 ### 环绕操作 match-up 为 [vim-surround] 风格的 `ds%` 和 `cs%` 操作提供内置支持(`let g:matchup_surround_enabled = 1`)。 如果安装了 vim-surround,您可以使用 vim-surround 的替换,如 `cs%)`。`%` 不能用作替换。 一个替代插件是 [vim-sandwich],它允许更复杂的环绕替换规则,但目前不受支持。 ### 自动关闭插件 match-up 不提供自动完成或自动插入匹配项。 请参阅以下插件之一以实现此功能: - [vim-endwise](https://github.com/tpope/vim-endwise) - [auto-pairs](https://github.com/jiangmiao/auto-pairs) - [delimitMate](https://github.com/Raimondi/delimitMate) - [splitjoin.vim](https://github.com/AndrewRadev/splitjoin.vim) - [Pear Tree](https://github.com/tmsvg/pear-tree) ### Matchit match-up 试图在所有情况下与 matchit.vim 协同工作,但如果您遇到问题,请阅读以下内容: - 对于 vim,不应加载 matchit.vim。如果它被加载,则应在 match-up 之后加载(在这种情况下,matchit.vim 将被禁用)。 请注意,某些插件,例如 [vim-sensible](https://github.com/tpope/vim-sensible),会加载 matchit.vim,因此这些插件也应在 match-up 之后初始化。 - 对于 Neovim,默认会加载 matchit.vim。这不会导致任何问题,但您可以通过在 `init.vim` 中设置 `let g:loaded_matchit = 1` 来略微提高启动时间。 ### Matchparen 模拟 如果 matchparen 尚未加载,match-up 会加载它。通常,match-up 会禁用 matchparen 的高亮,并模拟它来高亮 'matchpairs' 选项中包含的符号(默认为 `()`、`[]` 和 `{}`)。如果使用 `b:matchup_matchparen_enabled` 禁用特定缓冲区的 match-up,match-up 将使用 matchparen 而不是自己的高亮。有关更多信息,请参阅 `b:matchup_matchparen_fallback`。 ## 致谢 ### 起源 match-up 最初基于 [@lervag](https://github.com/lervag) 的 [vimtex]。该插件的概念和风格及其开发深受 vimtex 的影响。:beers: ### 其他灵感来源 - [matchit](http://ftp.vim.org/pub/vim/runtime/macros/matchit.txt) - [matchparen](http://ftp.vim.org/pub/vim/runtime/doc/pi_paren.txt) - [MatchTag](https://github.com/gregsexton/MatchTag) - [MatchTagAlways](https://github.com/Valloric/MatchTagAlways) - [vim-textobj-anyblock](https://github.com/rhysd/vim-textobj-anyblock) ## 开发 ### 报告问题 鼓励提交详细的问题报告。请先阅读[问题模板](.github/ISSUE_TEMPLATE/bug_report.md)。在提交问题时,请尽可能精确和详细。 也欢迎功能请求。 ### 贡献 请在贡献前阅读[贡献指南](CONTRIBUTING.md)。 欢迎贡献!
标签:matchit替代, matchparen替代, Neovim插件, SOC Prime, tree-sitter, Vim插件, 代码导航, 代码编辑, 代码跳转, 代码高亮, 匹配文本, 威胁情报, 开发工具, 开发者工具, 文本对象, 文本编辑, 符号高亮, 编程语言支持, 编程辅助, 编辑器插件, 语法解析, 语法高亮