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



我使用插件"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上创建一个问题。

相关内容

  • 没有找到相关文章

最新更新