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

时间:2012-02-07 21:40:14

标签: vim

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

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

nnoremap <silent> %  :<C-U>call <SID>Match_wrapper('',1,'n') <CR>

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

到目前为止,我已设法通过'{nmap'将<tab>映射到%,但这是一个非常脆弱的黑客。

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

3 个答案:

答案 0 :(得分:6)

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

map <Tab> %

是安全的(前面没有n是故意的:%:map所涵盖的所有模式中定义。但您可以随时将<SID>替换为<SNR>{N}_,其中{N}:scriptnames输出中的matchit脚本编号。在较新的vim中,您还可以使用maparg('%', 'n', 0, 1),它会输出一个字典,其中包含lhssid。在这种情况下,代码可能如下所示:

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

在这种情况下

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

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

答案 1 :(得分:0)

这就是我的所作所为:

" <C-I> and <TAB> are the same thing.
" So, I changed <C-I> to <C-O><C-I> and <C-O> to <C-O><C-O> to match.
" I didn't want to lose the <C-I> jump functionality.
noremap <C-O><C-O> <C-O>
noremap <C-O><C-I> <C-I>

" This is what the plugin sets on %. I just set it on <TAB>
onoremap <TAB> :<C-U>call <SNR>41_Match_wrapper('',1,'o')<CR>
nnoremap <TAB> :<C-U>call <SNR>41_Match_wrapper('',1,'n')<CR>
vnoremap <TAB> :<C-U>call <SNR>41_Match_wrapper('',1,'v')<CR>m'gv``

答案 2 :(得分:0)

或者,以防万一,您也可以使用这些映射(使用Vim 8.0测试):

nnoremap <silent> <Tab> :normal %<CR>
xnoremap <silent> <Tab> :normal %<CR>m`gv``