我使用插件"Buffet",并且有本地到缓冲区的映射"d
"到删除光标下的缓冲区。
我还使用plugunSurround,并且有全局映射"ds
",意思是"删除环绕"。
因此,当我在Buffet的窗口中按下"d
"时,Vim会等待一秒钟,然后再执行映射"d
"。我知道&timeoutlen
,但我不想改变它。所以我想解决Buffet窗口中"d
"的键映射的歧义,以避免d
删除缓冲区的超时。
为了解决这个问题,我想在Buffet窗口中取消映射所有以"d
"开头的映射,但Buffet自己的映射除外。我该怎么做?
附言:我读过关于maparg()
和mapcheck()
的文章,但不幸的是,它们似乎不是我需要的。
似乎我自己找到了解决方案:
au BufEnter buflisttempbuffer* nunmap ds
au BufLeave buflisttempbuffer* nmap ds <Plug>Dsurround
我希望有更通用的方法(删除从"d
"开始的所有映射),但现在我没能找到
即使我找到了如何获得所有这些映射,不幸的是,我也无法执行unmap <buffer> ds
,因为ds
是一个全局映射。不过,我确信I应该能够禁用某些缓冲区的全局映射。Vim很棒,但并不完美。
好吧,它现在对我有效。
既然这个问题已经"重新表述"了,这个解决方案不再相关,但我还是会发布它,因为我花了几分钟的时间。
这里有一个函数,它获取map <letter>
的输出并提取各个映射。然后它揭开了他们所有人的面纱。
function! Unmap(leader)
redir => maps
sil exe "map " . a:leader
redir END
let maps_list = split(strtrans(maps),'^@')
if len(maps_list) > 1
for this in maps_list
let mapn = matchstr(this,"^\w\s*\zsd\w*\>")
exe "unmap " . mapn
endfor
endif
endfunction
示例用法:call Unmap("d")
。这将删除所有以d
开头的映射,只保留Vim的默认值。
免责声明:这还没有经过严格的测试。特别是,我不知道^@
字符的可移植性有多强,但这就是它在我的(Win32)机器上的样子。
最简单的方法是:
:e /WHERE/YOU/HAD/INSTALLED/buffet.vim
:%s:map <buffer> <silent> d:"&:
:wq
$ vim # Restart Vim to take effect...
一般来说,你不能基于模式unmap
。
如果你想使用另一个密钥(例如<leader>
,只需更改插件中的这一行:
map <buffer> <silent> d :call <sid>deletebuffer(0)<cr>
这个问题很老,但如果你仍然感兴趣,你可能想试试Bufstop。
这个问题由插件处理,你可以按d键删除缓冲区,如果你安装了其他具有全局映射的插件,你不会得到任何超时。
一个对我有用的廉价技巧是使timeoutlen
变短,它几乎是瞬间的。只要你自己不使用多个密钥映射,这将一次性覆盖所有插件。
但是,我们不希望该设置保持不变,所以每次离开缓冲区时都会将其删除。
添加这个,使其在您的自定义缓冲区内运行:
augroup no_map_chords
autocmd!
autocmd BufEnter <buffer> let g:bak_timeoutlen = &timeoutlen | set timeoutlen=1
autocmd BufLeave <buffer> let &timeoutlen = g:bak_timeoutlen | unlet g:bak_timeoutlen
augroup END
类似的技术可以用于特定的文件类型或其他类似的"全局"设置。
Buffet是一个非常年轻的插件,我认为它没有Command-t或NERDTree那么多人使用,所以你可能不会收到很多答案。它的作者对他在那里创建的许多线程做出了非常积极的回应——你应该直接联系他,或者在Buffet的github上创建一个问题。