我在推出vim时打开了NERDTree和MiniBufExplorer,所以我有三个窗口。每当我使用上述插件时,文件/缓冲区都会显示在正确的窗口中,这是最初的窗口。但是,每当我使用诸如:e ~/.vimrc
之类的命令时,该命令都适用于包含光标的窗口。这意味着我必须始终记住将光标移动到用于编辑的窗口。我想知道是否有办法让命令在该窗口上工作,无论光标在哪里,或者文件缓冲区是否会自动出现在该窗口中?
当我按下:
(或我可以使用的其他键)时,我正在寻找让光标移动到右侧窗口的方法,但是我找不到方法,因为没有识别窗口的方法(或者在那里?)。
答案 0 :(得分:7)
您要求Vim更改每个文件和缓冲区命令的更改方式,以适应您的插件选择和工作流程。你在这里反对vim方式,它会阻碍你使用Vim的分裂。
首先要认识到Vim没有Project抽屉的概念,只有分裂/窗口。这意味着NerdTree和其他插件会不遗余力地模拟Project Drawer行为并最终失败。
让我们看看使用NerdTree和MiniBufExplorer作为始终打开的窗口的问题:
<c-w>b
拆分。在此窗口中通过NerdTree打开文件。您是否使用<c-w>t
转到最左上方的窗口?使用如此多的窗口命令来打开文件感觉非常细微差别<c-w>J
或<c-w>H
。看看它如何搞乱你的布局:bnext
和:bprev
命令轻松切换缓冲区正如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'
选项gf
将转到光标有很多方法可以在Vim中切换缓冲区:
:b
和:sb
获取缓冲区编号,但也包含将完成的名称和glob :ls
查看缓冲区列表,然后使用:b
直接切换<c-6>
将转到上一个缓冲区:bnext
和:bprev
示例[b
和]b
是Unimpaired.vim映射set hidden
使切换缓冲区更容易。不要担心,如果您在退出之前有未写入的缓冲区,vim会通知您 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的选项卡/窗口/缓冲区范例对许多人来说是最佳的,但我个人并没有最大限度地使用它