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中加入这些代码,其实就是两个函数:

Vim

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的快捷键,我加了下面这两个映射:

Vim

1

2

nnoremap mt :call MoveToNextTab()<cr>

nnoremap mT :call MoveToPrevTab()<cr>

这样使用mt可以快速移动tab了,亲测有效。至此好像在vim中没有什么移动是做不到了,可以穿梭自如了。

参考资料:

  1. Move current window between tabs