vim netrw-qb 与 q 记录冲突

vim netrw-qb conflicts with q recording

netrw下,按qb(查询书签)会列出书签等。但是这个键被q记录抢占了。注册b就变成录音了。

你对处理这个问题有什么建议?

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>

如果你只是 nnoremap 把它改成 qb 你就错了,因为脚本 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>