我是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>
映射到%
,但这是一个非常脆弱的黑客。
无论如何,任何帮助将不胜感激! :)
答案 0 :(得分:6)
好吧,如果你知道%
将总是重新映射,那么使用
map <Tab> %
是安全的(前面没有n
是故意的:%
在:map
所涵盖的所有模式中定义。但您可以随时将<SID>
替换为<SNR>{N}_
,其中{N}
是:scriptnames
输出中的matchit脚本编号。在较新的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
在这种情况下
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``