【问题标题】:vim netrw-qb conflicts with q recordingvim netrw-qb 与q录音冲突
【发布时间】:2017-12-30 22:46:03
【问题描述】:

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

你有什么建议来解决这个问题?

【问题讨论】:

    标签: vim netrw


    【解决方案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>
    

    如果你只是将nnoremap 这个qb 改成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 脚本上下文中执行,从而可以访问实际的&lt;SID&gt;

    更新

    解决方案 #2

    如果您输入:call netrw#&lt;C-D&gt;,您将看到有一个名为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>
    

    【讨论】:

    • 你可以试试:h netrw-qb
    • 是否可以在netrw 中禁用q 录制?我认为我们不会在netrw 中使用密钥记录。
    • 您可以阻止q 录制,将其设置为不执行任何操作:autocmd FileType netrw noremap &lt;buffer&gt;q &lt;Nop&gt;。但是我上面发布的最后一条命令有什么问题?
    • 你的意思是我只需要添加autocmd FileType netrw noremap &lt;buffer&gt;&lt;silent&gt;qb :call netrw#Call("NetrwBookHistHandler(2, b:netrw_curdir)")吗?如果我在 netrw 下按qb,则没有任何反应。我直接输入命令:call netrw#Call("NetrwBookHistHandler(2, b:netrw_curdir)"),报错:Unknown function: s:NetrwBookHisHandler(2, b:netrw_curdir)
    • 输入tabe . | :nnoremap qb 会得到什么输出?您是否尝试过映射q no &lt;Nop&gt; 或设置g:Netrw_UserMaps 选项,如答案中所述?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    相关资源
    最近更新 更多