Vim相比于IDE一个高效的地方就是可以快速移动和切换窗口,完全不必借助于鼠标。
开启多窗口非常简单:
- 在NerdTree中使用s键或i键在当前的窗口中以横/竖分屏的方式打开目标文件
- 在NerdTree中使用t/T在新的tab打开目标文件(区别在于是否focus到新的tab)
- 在buffer中使用:split命令对当前buffer分屏
- 使用:tabnew打开一个新的tab
在多个分屏中移动也很简单:
- <CTRL+W>hjkl,光标在不同的分屏中移动
- <CTRL+W>HJKL,将光标所在的分屏移动到最左/下/上/右
- gt到下一个tab
- gT到上一个tab
但是有时候有这样的需求:我在一个分屏的窗口编辑文件,想要将当前的这个分屏全屏化,也就是说,将目前的一个分屏作为一个新的tab。也很简单:<CTRL+W>T 将当前buffer作为一个新的tab打开。
又有时候有这样的需求:在一个tab中编辑文件,但是想要参考上一个tab中已经打开的一个窗口的内容,这时候想要将当前的tab变成上一个tab的一个分屏。其实这是很常用的需求,但是这比较难办了,搜了一圈没有发现这样的Vim内置功能。但是找到了一个同样作用的VimScript。
于是可以在.vimrc中加入这些代码,其实就是两个函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
function! MoveToPrevTab() "there is only one window if tabpagenr('$') == 1 && winnr('$') == 1 return endif "preparing new window let l:tab_nr = tabpagenr('$') let l:cur_buf = bufnr('%') if tabpagenr() != 1 close! if l:tab_nr == tabpagenr('$') tabprev endif sp else close! exe "0tabnew" endif "opening current buffer in new window exe "b".l:cur_buf endfunc function! MoveToNextTab() "there is only one window if tabpagenr('$') == 1 && winnr('$') == 1 return endif "preparing new window let l:tab_nr = tabpagenr('$') let l:cur_buf = bufnr('%') if tabpagenr() < tab_nr close! if l:tab_nr == tabpagenr('$') tabnext endif sp else close! tabnew endif "opening current buffer in new window exe "b".l:cur_buf endfunc |
这两个函数可以做到,将tab变成上一个tab的一个分屏,或者将tab变成下一个tab的一个分屏。模仿之前有关tab的快捷键,我加了下面这两个映射:
1 2 |
nnoremap mt :call MoveToNextTab()<cr> nnoremap mT :call MoveToPrevTab()<cr> |
这样使用mt可以快速移动tab了,亲测有效。至此好像在vim中没有什么移动是做不到了,可以穿梭自如了。