如何配置matchit.vim以使用<tab>而不是%?

Chr*_*fer 2 vim

我是matchit.vim插件的忠实粉丝,但我更喜欢在匹配的分隔符和<tab>密钥之间跳转.但是,似乎matchit在按下%键时被硬编码激活.

我的第一个想法是,我只是将这一行放在我的.vimrc中,并将' %' 更改为' <tab>',从而将Match_wrapper调用绑定到tab键:

nnoremap <silent> %  :<C-U>call <SID>Match_wrapper('',1,'n') <CR>
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用; 我猜它与之有关<SID>(据我所知,这是一个脚本独有的ID?)或者事实上Match_wrapper是脚本本地的.(我对Vimscript很新)

到目前为止,我已经设法通过映射<tab>%'nmap',但它是一个相当脆弱的黑客.

无论如何,任何帮助将不胜感激!:)

ZyX*_*ZyX 6

好吧,如果你知道%永远重新映射,那么使用

map <Tab> %
Run Code Online (Sandbox Code Playgroud)

是安全的(n前面缺席是有意的:%在所涵盖的所有模式中定义:map).但是,你总是可以做的是,以取代<SID><SNR>{N}_地方{N}是matchit脚本中的产出数量:scriptnames.在较新的vim中你也可以使用maparg('%', 'n', 0, 1)它,它将输出一个字典,其中包含lhs和其他值sid.在这种情况下,代码可能如下所示:

for s:mode in ['n', 'v', 'o']
    let s:map=maparg('%', s:mode, 0, 1)
    execute s:mode.'noremap <Tab> '.substitute(s:map.lhs, '<SID>', '<SNR>'.s:map.sid.'_', 'g')
endfor
Run Code Online (Sandbox Code Playgroud)

在这种情况下

for s:mode in ['n', 'v', 'o']
    execute s:mode.'noremap <Tab> '.maparg('%', s:mode)
endfor
Run Code Online (Sandbox Code Playgroud)

也可以接受为"旧"(没有第四个参数)maparg的行为是扩展<SID>.