Vim - Pydoc插件不支持运营商映射

时间:2015-02-07 19:56:30

标签: vim

我有一个小型运算符映射,可用于Pydoc plugin。它的代码如下:

nnoremap <buffer> <localleader>d :set operatorfunc=<SID>PydocOperator<cr>g@
vnoremap <buffer> <localleader>d :<c-u>call <SID>PydocOperator(visualmode())<cr>

function! s:PydocOperator(type)
    let l:orig_register = @@

    if a:type ==# 'v'
        normal! `<v`>y
    elseif a:type ==# 'char'
        normal! `[v`]y
    else
        return
    endif

    execute 'Pydoc ' . shellescape(@@)
    let @@ = l:orig_register
endfunction

但是,vim会抛出错误:

E116: Invalid arguments for function <SNR>117_ShowPyDoc

如果我手动复制一些文本并运行此命令,则会发生同样的错误:

execute 'Pydoc ' . shellescape(@@)

这很奇怪,考虑到:Pydoc应该作为普通命令工作,以一个参数作为输入。我查看了定义:Pydoc命令的代码(该行代码为here)并发现将参数传递给引号中的:Pydoc命令可能会导致问题。所以我运行:Pydoc 'sys'以查看它是否会抛出与操作员映射相同的错误。因此,如果参数周围的引号存在问题,如何格式化execute命令以使其不会产生无效参数?

1 个答案:

答案 0 :(得分:0)

shellescape()命令不需要:Pydoc函数。 shellescape在返回的字符串中包含引号,这会导致:Pydoc自毁。但是,如果命令为:grep,则需要使用shellescape

相关帮助主题:

:help shellescape()
:help 'operatorfunc'
:help :map-operator