我使用插件“Buffet”,并且在光标下有“d
”到 delete 缓冲区的本地到缓冲区映射。
我还使用了plugun Surround,并且全局映射“ds
”表示“删除环绕”。
所以,当我在自助餐的窗口中按“d
”时,Vim会在执行映射“d
”之前等待一秒钟。我知道&timeoutlen
,但我不想改变它。因此,我想在Buffet的窗口中解决“d
”的键映射的歧义,以避免超时到d
一个缓冲区。
要解决此问题,我想在Buffet窗口中取消所有以“d
”开头的映射,但除了Buffet自己的映射之外。我怎么能这样做?
P.S。我读过关于maparg()
和mapcheck()
的内容,但不幸的是,它们似乎并不是我需要的。
答案 0 :(得分:4)
似乎我自己找到了解决方案:
au BufEnter buflisttempbuffer* nunmap ds
au BufLeave buflisttempbuffer* nmap ds <Plug>Dsurround
我希望有更普遍的方法(从“d
”开始删除真正的所有映射),但此时我没有找到它。
即使我发现如何获取所有这些映射,但遗憾的是我不能unmap <buffer> ds
,因为ds
是全局映射。我确定我应该能够禁用某些缓冲区的全局映射。 Vim很棒但不完美。
嗯,现在它适用于我。
答案 1 :(得分:2)
现在这个问题已被“改写”了,这个解决方案已经不再适用了,但是我会发布它,因为我花了几分钟时间。
这是一个抓取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)机器上的外观。
答案 2 :(得分:0)
最简单的方法是:
: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>
答案 3 :(得分:0)
这个问题相当陈旧,但如果您仍然感兴趣,可能需要尝试Bufstop。
此问题由插件处理,您可以按 d 键删除缓冲区,如果您安装了其他具有全局映射的插件,则不会出现任何超时。
答案 4 :(得分:0)
对我有用的一个便宜的伎俩就是让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
类似的技术可用于特定文件类型或其他此类“全局”设置。
答案 5 :(得分:-1)
自助餐是一个非常年轻的插件,我不认为它被Command-T或NERDTree这么多人使用,所以你可能得不到很多答案。它的作者对他在那里创建的众多主题非常敏感,你应该直接与他联系或在Buffet github上创建一个问题。