使vim命令在初始窗口上工作,如NERDTree,MiniBufExplorer和CtrlP

时间:2014-04-16 16:41:36

标签: vim

我在推出vim时打开了NERDTree和MiniBufExplorer,所以我有三个窗口。每当我使用上述插件时,文件/缓冲区都会显示在正确的窗口中,这是最初的窗口。但是,每当我使用诸如:e ~/.vimrc之类的命令时,该命令都适用于包含光标的窗口。这意味着我必须始终记住将光标移动到用于编辑的窗口。我想知道是否有办法让命令在该窗口上工作,无论光标在哪里,或者文件缓冲区是否会自动出现在该窗口中?

当我按下:(或我可以使用的其他键)时,我正在寻找让光标移动到右侧窗口的方法,但是我找不到方法,因为没有识别窗口的方法(或者在那里?)。

2 个答案:

答案 0 :(得分:7)

文件,缓冲区和拆分哦我的!

您要求Vim更改每个文件和缓冲区命令的更改方式,以适应您的插件选择和工作流程。你在这里反对vim方式,它会阻碍你使用Vim的分裂。

首先要认识到Vim没有Project抽屉的概念,只有分裂/窗口。这意味着NerdTree和其他插件会不遗余力地模拟Project Drawer行为并最终失败。

让我们看看使用NerdTree和MiniBufExplorer作为始终打开的窗口的问题:

NerdTree:

  • 浪费的空间。您多久查看一次文件结构? 10%的时间?少?
  • 拆分 - 打开一些拆分,现在切换到最右侧,通过<c-w>b拆分。在此窗口中通过NerdTree打开文件。您是否使用<c-w>t转到最左上方的窗口?使用如此多的窗口命令来打开文件感觉非常细微差别
  • 当重新分组时,NerdTree不能很好地发挥作用。创建一些拆分,然后执行<c-w>J<c-w>H。看看它如何搞乱你的布局

MiniBufExplorer

  • 比例 - MiniBufExplorer只是不随缓冲区数量而扩展。我已经打开了一百多个缓冲区而没有问题。我无法想象这会导致MiniBufExplorer
  • 造成的空间浪费
  • 通过一直看到所有打开的缓冲区几乎没有什么可以获得的。您只需要在切换到不同的缓冲区时看到它们
  • 切换缓冲区 - 您可以通过映射:bnext:bprev命令轻松切换缓冲区
  • 关于切换缓冲区的更多信息 - 如果你想要切换缓冲区,那么转移到MiniBufExplorer窗口是一件非常繁琐而烦恼的事情
  • 重新排列窗口 - 与NerdTree相同
  • MiniBufExplorer类似于在vim中为每个文件使用Vim的标签,请参阅:Use buffer effectively

Vim Way

正如Vimcast帖子Oil and vinegar - split windows and the project drawer中所述,Vim更喜欢在需要时打开文件浏览器,然后在不需要时切换它。您也可以以这种方式使用NerdTree,只需忘记文件浏览器位。还有其他方法可以在vim中打开文件:

  • 使用<tab>:e
  • 等命令,通过:sp使用文件完成功能
  • 使用<c-d>代替<tab>获取完成列表
  • :e:sp命令采用全局。例如:e *.c:e foo/**/bar.c
  • :find并设置'path''suffix'选项
  • Ctags或cscope跳转到标签
  • gf将转到光标
  • 下的文件
  • 查看模糊查找器,例如CtrlPCommand-T
  • 通过Projectile创建项目特定的导航(Rails就是一个很好的例子)

有很多方法可以在Vim中切换缓冲区:

  • :b:sb获取缓冲区编号,但也包含将完成的名称和glob
  • 使用:ls查看缓冲区列表,然后使用:b直接切换
  • <c-6>将转到上一个缓冲区
  • 地图:bnext:bprev示例[b]bUnimpaired.vim映射
  • set hidden使切换缓冲区更容易。不要担心,如果您在退出之前有未写入的缓冲区,vim会通知您
  • 再次查看模糊查找器插件,如CtrlP和Command-T切换缓冲区

Vim很开心。确保尽可能有效地使用拆分。有许多拆分命令,请参阅:h opening-window。更好的是阅读整个:h window帮助文件,那里有很多宝藏。

答案 1 :(得分:0)

可以通过s:Opener._firstUsableWindow在NERDTree源代码中找到解决方案的核心,然后我对其进行了一些编辑以获得id并包括修改后的缓冲区:

" Returns the first window ID containing a file buffer
"
" Iterates through window numbers until the last (winnr('$')),
" Skipping special buffer types & preview windows
function! FirstFileWindowID()
    let i = 1
    while i <= winnr('$')
        let bnum = winbufnr(i)
        if bnum !=# -1 && getbufvar(bnum, '&buftype') ==# ''
                    \ && !getwinvar(i, '&previewwindow')
            " TODO I don't know what excluding &hidden does in the original,
            " but may be desirable for correctness
            return win_getid(i)
        endif
        let i += 1
    endwhile
    return -1
endfunction

然后可以将其与win_execute一起使用以定位最近的文件缓冲区,从而获得tab-like behavior with buffers

"tab movement (ctrl-n for next tab, ctrl-p for previous)
map <c-n> :call win_execute(FirstFileWindowID(), 'bnext')<CR>
map <c-p> :call win_execute(FirstFileWindowID(), 'bprev')<CR>

我使用tmux进行所有窗格管理,因此尽管我确定充分利用vim的选项卡/窗口/缓冲区范例对许多人来说是最佳的,但我个人并没有最大限度地使用它