Vim:解决特定缓冲区中键映射的歧义,以避免超时

时间:2012-02-02 10:20:39

标签: vim map

我使用插件“Buffet”,并且在光标下有“d”到 delete 缓冲区的本地到缓冲区映射。

我还使用了plugun Surround,并且全局映射“ds”表示“删除环绕”。

所以,当我在自助餐的窗口中按“d”时,Vim会在执行映射“d”之前等待一秒钟。我知道&timeoutlen,但我不想改变它。因此,我想在Buffet的窗口中解决“d”的键映射的歧义,以避免超时到d一个缓冲区。

要解决此问题,我想在Buffet窗口中取消所有以“d”开头的映射,但除了Buffet自己的映射之外。我怎么能这样做?

P.S。我读过关于maparg()mapcheck()的内容,但不幸的是,它们似乎并不是我需要的。

6 个答案:

答案 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上创建一个问题。