让 Nerdtree 在打开的文件上使用 Choosewin

Make Nerdtree Use Choosewin On Open File

我最喜欢 vim 的两个插件之一是 NERDTree and ChooseWin。现在我很喜欢把它们结合起来。事实上,我想以这种方式调整 NERDTree,当打开文件(o)时,它使用 ChooseWin 来询问用户a window 显示(新)缓冲区。默认行为是 NERDTree 总是使用最后一个活动的 window(除了它自己的)。

我已经浏览了 NERDTree 的文档(因为我想在这里创建一个挂钩是一个解决方案),但找不到任何东西。 API 部分起初听起来很有趣,但对我没有帮助。

所以我只想问问社区是否有人足够 hacky 来找到解决方案。

你可能想为此 fork nerdtree

完成后,您将更改 this function(nerdtree#ui_glue#invokeKeyMap)

你会检查 a:key == 'o',然后你需要弄清楚光标下的文件是什么,这样你就知道在调用 ChooseWin 后要做什么。我不认为这是一项非常简单的任务,根据我的经验,理解 nerdTree 的代码并非易事,但如果你愿意付出努力......

解法:

要在使用 NERDTree 打开文件时使用 choosewin 插件,必须调整函数 activateFileNode()。方法很简单:备份当前的window ID,调用choosewin函数select一个window,跳回 NERDTree 按存储的 ID,然后正常打开文件。因为 NERDTree 总是使用上次访问的 window,这个解决方案有效。
保存 window ID 并跳回是必要的,导致下面的 NERDTree 打开文件的过程使用了缓冲区本地的变量。

代码

autoload\nerdtree\ui_glue.vim:

function! s:activateFileNode(node)
    let l:nerdwindow = win_getid()
    call choosewin#start(range(1, winnr('$')))
    call win_gotoid(l:nerdwindow) 
    call a:node.activate({'reuse': 'all', 'where': 'p'})
endfunction


请注意,这仅在安装了 choosewin 后才有效。到目前为止,我还没有解决方案如何检查这个。可能会有更新。

这个解决方案也可以在我的 fork 上找到。一旦我修复了这个 "check if plugin exists",我将打开一个 PR。