5月27日 14:00

Vim 怎么分割窗口和管理标签页?

从单窗口到多窗口:为什么你需要分割

用 Vim 写代码,最痛苦的事之一就是频繁切换文件。改完配置切回源码,看完测试切回实现,来回几次就晕了。其实 Vim 早就提供了窗口分割和标签页功能,只是很多人习惯了单窗口操作,根本没碰过这些特性。

理解 Vim 的窗口模型有一个关键前提:窗口不是文件。Vim 里真正存文件内容的是 buffer(缓冲区),窗口只是"查看 buffer 的视口"。同一个 buffer 可以被多个窗口同时显示,一个标签页里可以放多个窗口,每个窗口显示不同的 buffer。这跟浏览器标签页的概念不一样——Vim 的 tab 是"窗口布局的容器",不是"文件的容器"。

窗口分割:左右对照,上下对比

水平分割

输入 :split 或简写 :sp,当前窗口会从中间水平切开,上下各显示一份当前文件。光标停在新窗口里,可以直接编辑。如果想分割后打开另一个文件,加文件名即可:

vim
:sp config.yaml

快捷键 Ctrl+w s 效果相同,不用敲命令行。

垂直分割

需要左右并排时用 :vsplit:vsp,窗口会纵向一分为二。同样支持带文件名参数:

vim
:vsp main.go

快捷键是 Ctrl+w v

新建空窗口

:new 创建一个水平分割的空窗口,:vnew 创建垂直分割的空窗口。适合临时记笔记或粘贴内容。

窗口切换:快速跳转不迷路

分割出一堆窗口后,你得能在它们之间来回跳。

快捷键作用
Ctrl+w h跳到左边窗口
Ctrl+w j跳到下边窗口
Ctrl+w k跳到上边窗口
Ctrl+w l跳到右边窗口
Ctrl+w w循环切换窗口
Ctrl+w p跳到上一个访问的窗口

方向键也可以用:Ctrl+w 加方向键。但 h/j/k/l 更符合 Vim 习惯,手不用离开主键区。

窗口大小调整:拖不动就命令来

鼠标拖动调整大小在某些终端里能用,但命令行方式更精确。

逐步调整:

  • Ctrl+w + 增加高度
  • Ctrl+w - 减少高度
  • Ctrl+w > 增加宽度
  • Ctrl+w < 减少宽度

加数字前缀可以一次调多行,比如 5 Ctrl+w + 把当前窗口增高 5 行。

快速调整:

  • Ctrl+w = 所有窗口等宽等高
  • Ctrl+w _ 当前窗口最大化高度
  • Ctrl+w | 当前窗口最大化宽度

Ctrl+w _Ctrl+w | 也可以加数字前缀指定精确行数或列数,比如 20 Ctrl+w _ 把窗口高度设为 20 行。

关闭与保留窗口

  • :close:clo:关闭当前窗口(如果这是最后一个窗口则不会关闭)
  • Ctrl+w c:同上
  • :only:on:只保留当前窗口,关闭其他所有窗口
  • Ctrl+w o:同上

注意 :close:q 的区别:如果窗口里有未保存的修改,:close 会拒绝关闭,而 :q! 会直接丢弃。用 :close 更安全。

窗口移动:重新排列布局

有时候分割出来的位置不对,想换个方向。

  • Ctrl+w H:把当前窗口移到最左边(变成全高垂直分割)
  • Ctrl+w J:把当前窗口移到最下边(变成全宽水平分割)
  • Ctrl+w K:把当前窗口移到最上边
  • Ctrl+w L:把当前窗口移到最右边
  • Ctrl+w T:把当前窗口移到一个新标签页

Ctrl+w r 可以旋转窗口位置,Ctrl+w R 反向旋转。这些大写命令是改变窗口布局的利器。

标签页:另一种组织方式

标签页适合管理不同的"工作区"。比如一个标签页放前端代码的分割布局,另一个放后端代码的分割布局,互相不干扰。

创建标签页

vim
:tabedit path/to/file " 在新标签页打开文件 :tabnew " 打开一个空白标签页 :tab split " 把当前窗口内容放到新标签页

从命令行启动时也可以直接用标签页模式:

bash
vim -p file1.rs file2.rs file3.rs

切换标签页

  • gt:下一个标签页
  • gT:上一个标签页
  • Ngt:跳到第 N 个标签页(比如 2gt 跳到第二个)
  • :tabn:下一个(next)
  • :tabp:上一个(previous)
  • :tabfirst:tabr:跳到第一个
  • :tablast:跳到最后一个

gtgT 是最常用的,两个字母就能切换,效率很高。

关闭标签页

  • :tabclose:tabc:关闭当前标签页
  • :tabonly:tabo:关闭其他所有标签页

关闭标签页会同时关掉里面的所有窗口,但如果 buffer 有未保存的修改,Vim 会提示你。

标签页排序

  • :tabm 0:移到第一个位置
  • :tabm:移到最后一个位置
  • :tabm 2:移到第三个位置(索引从 0 开始)

查看当前所有标签页用 :tabs,会列出每个标签页里的窗口和 buffer 信息。

Buffer:窗口和标签页的底层

聊窗口和标签页不能不提 buffer,因为它们本质上都是 buffer 的不同展示方式。

  • :ls:列出所有 buffer
  • :b filename:按文件名切换 buffer(支持模糊匹配)
  • :bn:下一个 buffer
  • :bp:上一个 buffer
  • Ctrl+^:在上一个 buffer 和当前 buffer 之间快速切换

很多老 Vim 用户其实不怎么用标签页,他们更习惯用 buffer 切换。:b 加文件名的一部分就能跳过去,配合 :ls 查看列表,比标签页更轻量。

推荐配置

把这些加到 .vimrc 里,窗口操作会顺手很多:

vim
" 等号分割用 leader 键触发 nnoremap <leader>w= <C-w>= nnoremap <leader>wo <C-w>o nnoremap <leader>wc <C-w>c " 标签页切换用 Alt+h/l nnoremap <M-l> gt nnoremap <M-h> gT " 垂直分割快捷键 nnoremap <leader>wv <C-w>v nnoremap <leader>ws <C-w>s

这些不是必须的,但能减少按键次数。如果你用 Neovim 或加了插件,很多窗口管理操作已经有更高级的方案(比如 telescope 的 buffer 列表、bufferline 的标签页美化),底层逻辑还是这一套。

实战场景

对比修改: 写完 API 接口,想对照路由定义检查参数,:vsp routes.go 垂直分割,左边看接口,右边看路由。

重构追踪: 改了一个函数签名,要同时改调用方和测试,水平分割三窗口:srccallertest,改一处扫一眼其他两处。

多项目并行: 一个标签页放当前功能的代码分割布局,另一个标签页放需要参考的第三方库源码,gt 一键切换上下文,比来回切换文件高效得多。

Vim 的窗口和标签页功能不花哨,但足够实用。花几分钟记住分割、切换、调整大小这几个核心操作,编辑效率会有明显提升。不需要一步到位配置成 IDE 那样的多面板布局,先从 :sp:vsp 开始用就行。

标签:Vim