2012-02-07 93 views
2

我是matchit.vim插件的粉丝,但我更愿意在匹配分隔符和<tab>之间跳转。但是,按下%键时,matchit被硬编码激活。如何配置matchit.vim以使用<tab>而不是%?

我首先想到的是,我会简单地把这个线在我的.vimrc,并改变“%”到“<tab>”,从而结合Match_wrapper调用tab键:

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

然而,这似乎并不奏效;我猜这跟<SID>有关(据我了解,这个脚本是唯一的ID),或者Match_wrapper是脚本本地的。 (我很新的Vimscript)

到目前为止,我已经成功通过映射<tab>%与“nmap的”,但它是一个非常脆弱的黑客。

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

+1

为什么你不想使用'noremap '? 'nnoremap %'适合我。 'nmap %' – Kevin 2012-02-07 22:07:52

+0

对不起,也许我有点不清楚 - 我想使用'nnoremap',但由于'nnoremap'的想法不会干扰其他脚本,它将不会影响重新映射的插件%key,这就是matchit所做的。 – Christoffer 2012-02-09 09:16:36

+0

我不清楚的是为什么你认为他们不工作。我确实有匹配和测试,两者都按照您所希望的方式工作 - 在matchit中指定的对之间切换tab,%不会默认。我相信noremap只适用于出现在输入中的模式,在这种情况下是tab。 – Kevin 2012-02-09 13:55:46

回答

6

好吧,如果你知道%总是被重新映射,然后使用

map <Tab> % 

是安全的(前面无n是故意的:%在由:map涵盖所有模式定义) 。但是,您始终可以执行的操作是将<SID>替换为<SNR>{N}_,其中{N}:scriptnames输出中匹配脚本的编号。在较新的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>

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`` 
0

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

nnoremap <silent> <Tab> :normal %<CR> 
xnoremap <silent> <Tab> :normal %<CR>m`gv`` 
相关问题