vim netrw-qb与q录音冲突

时间:2017-12-29 15:03:54

标签: vim netrw

netrw 下,按qb(查询书签)将列出书签等。但此键已被q录音抢占。注册b成为记录。

您的建议是什么?

1 个答案:

答案 0 :(得分:1)

<强> TL; DR

只需将以下内容放入.vimrc文件即可。

autocmd FileType netrw noremap <buffer>q <Nop>

我在help netrw中找不到任何命令,但您始终可以输入tabe . | :nnoremap qb并获取输出:

n  qb          *@:<C-U>call <SNR>75_NetrwBookHistHandler(2,b:netrw_curdir)<CR>

如果你只是nnoremapqb,那将是错误的,因为将来可能会更改脚本ID(75)。所以以下是错误的,不要这样做:

autocmd FileType netrw noremap <buffer><silent>qb :call <SNR>75_NetrwBookHistHandler(2,b:netrw_curdir)<CR>

由于netrw帮助文件说有一个选项g:Netrw_UserMaps,它允许我们绑定用户函数help netrw-usermaps

解决方案#1

function! NetrwBookHistHandler(isLocal)                                                                                                                                       
    return "call <SID>NetrwBookHistHandler(2, b:netrw_curdir)"
endfunction

let g:Netrw_UserMaps = [["qb", "NetrwBookHistHandler"]]

函数返回字符串(如果不为空)将在netrw脚本上下文中执行,这样可以访问实际的<SID>

<强>更新

解决方案#2

如果您输入:call netrw#<C-D>,您会看到有一个名为netrw#Call的功能。所以解决方案变得更容易一些:

autocmd FileType netrw noremap <buffer><silent>qb :call netrw#Call("NetrwBookHistHandler", 2, b:netrw_curdir)

更新2

不幸的是,netrw插件代码中存在错误。

" /usr/share/nvim/runtime/autoload/netrw.vim

fun! netrw#Call(funcname,...)                                                                                                                                                 
"  call Dfunc("netrw#Call(funcname<".a:funcname.">,".string(a:000).")")
  if a:0 > 0
   exe "call s:".a:funcname."(".string(a:000).")"
  else
   exe "call s:".a:funcname."()"
  endif
"  call Dret("netrw#Call")
endfun

当我们调用netrw#Call("NetrwBookHistHandler", 2, b:netrw_curdir)时,函数本身会调用NetrwBookHistHandler([2, b:netrw_curdir])NetrwBookHistHandler需要2个参数。使用第二个也是最简单的解决方案。

解决方案#2

autocmd FileType netrw noremap <buffer>q <Nop>