如何使用viewdoc插件在Vim中使用pman和自定义帮助文件?

Mic*_*rtl 6 vim vim-plugin

编辑PHP文件时,我想使用两个来源的帮助文件:

  • vim /etc/vim/bundle/yii-api-vim/doc/这里帮助文件.
  • PHP手册页 pman

如果帮助文件没有提供帮助,应该尝试pman.

viewdoc插件的帮助声称

您可以为同一文件类型提供多个文档源,并选择应该在运行中使用哪个文档源.

但它没有解释,如何做到这一点.接近的唯一功能是特定文件类型的处理程序,如ViewDoc_{filetype}(topic, filetype, synid, have_context).但我不知道如何实现这样的功能.

向我提出的问题是:

  • 如果*.txt我的特定目录中存在文件,如何检查该函数内部?
  • viewdoc如果存在这样的帮助文件,我应该返回什么?
  • 我应该返回什么来viewdoc打开pman普通PHP函数的页面?

查看这样一个函数的示例会很有帮助.

Jam*_*ess 3

我不是 vim 脚本专家,所以这可能不是一个理想的解决方案,但这对我有用。

首先在viewdoc_pman.vim文件中创建一个自定义 viewdoc 处理程序(如果您使用推荐的 Pathogen 安装,则可以在~/.vim/bundle/viewdoc/plugin/目录中找到)。

function ViewDoc_pman_custom(topic, filetype, synid, ctx)
  let l:tagpath = '/etc/vim/bundle/yii-api-vim/doc/tags'
  let l:shell = printf('grep %s %s', shellescape(a:topic,1), l:tagpath)
  let l:output = system(l:shell)

  if !v:shell_error
    return g:ViewDoc_help(a:topic, a:filetype, a:synid, a:ctx)
  else
    let l:ViewDoc_pman_old = function('ViewDoc_pman')
    return l:ViewDoc_pman_old(a:topic, a:filetype, a:synid, a:ctx)
  endif
endfunction
Run Code Online (Sandbox Code Playgroud)

该函数使用grepyii-api-vim标签文件中查找指定的主题字符串。如果它在那里找到它,它只会将命令转发到默认的ViewDoc_help处理程序(假设您已经安装了yii-api-vim文档,以便它可以与标准帮助一起正常工作)。

如果grep没有找到任何内容,那么它会回退到调用ViewDoc_pman函数中的旧 php 处理程序。请注意,我们不能直接调用g:ViewDoc_pman,因为这是我们要覆盖的变量。我们需要使用旧函数的句柄function('ViewDoc_pman')并调用它。

最后,您需要找到这两行:

let g:ViewDoc_pman = function('ViewDoc_pman')
let g:ViewDoc_php  = function('ViewDoc_pman')
Run Code Online (Sandbox Code Playgroud)

并将它们替换为这两个:

let g:ViewDoc_pman = function('ViewDoc_pman_custom')
let g:ViewDoc_php  = function('ViewDoc_pman_custom')
Run Code Online (Sandbox Code Playgroud)

这会强制所有 php 文档查询转发到我们新的自定义处理程序,而不是旧的ViewDoc_pman函数。

如果您不想编辑viewdoc_pman.vim文件,可以将 viewdoc 处理程序放在.vimrc文件中。然后要设置g:ViewDoc_pmang:ViewDoc_php变量,您需要添加以下行:

autocmd VimEnter * let g:ViewDoc_pman = function('ViewDoc_pman_custom')
autocmd VimEnter * let g:ViewDoc_php = function('ViewDoc_pman_custom')
Run Code Online (Sandbox Code Playgroud)

强制autocmd VimEnter在加载所有插件后进行分配,否则这些变量将被插件覆盖,并且您的自定义处理程序将永远不会被调用。