Vim - 处理多个事物
Vim - 处理多个文件、缓冲区、窗口和标签页
Section titled “Vim - 处理多个文件、缓冲区、窗口和标签页”Vim 擅长同时管理多个上下文。本章将探讨如何高效地使用多个文件(file)、缓冲区(buffer,文件的内存副本)、窗口(window,Vim 屏幕的分割)和标签页(tab,窗口的集合)。
- 编辑多个文件
- 管理多个缓冲区
- 使用多个标签页
- 使用多个窗口(分割)
编辑多个文件
Section titled “编辑多个文件”启动 Vim 时可以打开多个文件,也可以在会话期间打开其他文件。
从命令行打开多个文件(通常每个文件都会在其自己的缓冲区中打开):
$ vim file1.txt file2.js file3.md在 Vim 内部,在当前窗口中打开另一个文件(替换该窗口中的当前缓冲区):
| 命令 | 说明 |
|---|---|
| :edit <文件名> | 将 <文件名> 加载到当前窗口。简写::e <文件名>。 |
| :edit | 在 :e 后按 Tab 键,查看当前目录下的文件补全。 |
| :find <文件名> | 在 Vim 的 path 中搜索 <文件名> 并打开。对项目文件很有用。参见 :help 'path'。 |
如果当前文件有未保存的更改,除非你保存(:w)或强制执行命令(例如,:e! <文件名>),否则 Vim 将阻止你切换。
管理多个缓冲区
Section titled “管理多个缓冲区”缓冲区(buffer)是正在编辑的文件的内存副本。你打开的每个文件都会加载到缓冲区中。你可以打开许多缓冲区,但通常在任何时候只有一个或少数几个缓冲区在窗口中可见。
| 命令 | 说明 |
|---|---|
| :ls 或 :buffers | 列出所有打开的缓冲区及其编号和状态。 |
| :buffer <N_或_名称> | 切换到编号为 N 的缓冲区或具有部分名称的缓冲区。简写::b <N_或_名称>。 |
| :bnext 或 :bn | 转到列表中的下一个缓冲区。 |
| :bprevious 或 :bp | 转到列表中的上一个缓冲区。 |
| :bfirst 或 :bf | 转到列表中的第一个缓冲区。 |
| :blast 或 :bl | 转到列表中的最后一个缓冲区。 |
| :badd <文件名> | 将 <文件名> 添加到缓冲区列表,但不将其在窗口中打开。 |
| :bdelete <N_或_名称> 或 :bd <N_或_名称> | 卸载编号为 N 的缓冲区或按名称卸载。如果该缓冲区有更改,将收到警告。使用 :bd! 强制执行。 |
示例:如果 :ls 显示缓冲区 3 是 notes.txt:
:b 3 或 :b notes 将当前窗口切换到显示 notes.txt。
:ls 的输出可能如下所示:
1 %a "file1.txt" line 1 2 # "file2.js" line 0 3 "file3.md" line 0% 表示当前缓冲区,# 表示备用缓冲区(alternate buffer)。
使用多个标签页
Section titled “使用多个标签页”Vim 中的标签页(tab 或 tab page)是一个或多个窗口的集合。它们允许你管理不同的工作区或一组相关文件。
| 命令 | 说明 |
|---|---|
| :tabnew <文件名> | 在新标签页中打开 <文件名>。如果没有文件名,则打开一个空缓冲区。简写::tabe <文件名>。 |
| :tabclose 或 :tabc | 关闭当前标签页。如果这是最后一个标签页,Vim 可能会退出(取决于设置)。 |
:tabnext 或 :tabn 或 gt | 转到下一个标签页。 |
:tabprevious 或 :tabp 或 gT | 转到上一个标签页。 |
| :tabfirst 或 :tabfir | 转到第一个标签页。 |
| :tablast 或 :tabl | 转到最后一个标签页。 |
Ngt | 转到编号为 N 的标签页(例如,3gt 转到第三个标签页)。 |
| :tabs | 列出所有标签页及其包含的窗口。 |
从视觉上看,如果你使用的是 GUI 版本或支持的终端,或者安装了像 Airline 这样的插件,标签页通常会显示在 Vim 窗口的顶部。
使用多个窗口(分割)
Section titled “使用多个窗口(分割)”窗口(通常称为分割,split)允许你通过分割 Vim 屏幕来同时查看和编辑多个缓冲区,或同一缓冲区的不同部分。
| 命令 | 说明 |
|---|---|
| :split <文件名> 或 :sp <文件名> | 水平分割当前窗口并在新窗口中打开 <文件名>。如果没有文件名,则复制当前缓冲区。 |
| :vsplit <文件名> 或 :vs <文件名> | 垂直分割当前窗口并在新窗口中打开 <文件名>。如果没有文件名,则复制当前缓冲区。 |
| :new <文件名> | 创建一个新的水平分割,打开 <文件名>(或一个空缓冲区)。 |
| :vnew <文件名> | 创建一个新的垂直分割,打开 <文件名>(或一个空缓冲区)。 |
Ctrl-w s 或 Ctrl-w Ctrl-s | 普通模式(Normal mode):水平分割当前窗口(类似于 :split)。 |
Ctrl-w v 或 Ctrl-w Ctrl-v | 普通模式(Normal mode):垂直分割当前窗口(类似于 :vsplit)。 |
Ctrl-w q 或 :quit 或 :q | 关闭当前窗口。简写::clo 或 Ctrl-w c。 |
Ctrl-w o 或 :only | 使当前窗口成为屏幕上唯一的窗口,关闭标签页中的所有其他窗口。 |
Ctrl-w <h,j,k,l> 或 Ctrl-w <箭头键> | 将光标移动到指定方向(左、下、上、右)的窗口。 |
Ctrl-w w 或 Ctrl-w Ctrl-w | 循环切换打开的窗口。 |
示例:如果你正在编辑 main.c:
:sp utils.h - 将水平分割屏幕,在一个窗口中显示 main.c,在另一个窗口中显示 utils.h。
调整窗口大小:Ctrl-w +(增加高度),Ctrl-w -(减小高度),Ctrl-w >(增加宽度),Ctrl-w <(减小宽度),Ctrl-w =(平均大小)。