多文件与窗口管理

为了这次练习,我们需要先准备两个文件。请退出 Vim,在终端里执行:

echo -e "apple\nbanana\ncherry\ndate\nelderberry" > fruits.txt
echo -e "red\nyellow\npink\nbrown\npurple" > colors.txt

缓冲区

你打开一个文件,Vim 就在内存里为它创建一个“缓冲区”(buffer)。你可以同时打开好几个缓冲区,只在需要时切换显示。

跟着做:

vim fruits.txt

你现在打开了 fruits.txt,这是缓冲区列表里的第一个。

在 Vim 里,用下面命令打开第二个文件:

:e colors.txt

(意思是 edit 一个新文件)。现在你看到的是 colors.txt,但 fruits.txt 的缓冲区还在后台。

查看缓冲区列表:输入::ls(或 :buffers:files,都是同一个命令)

你会看到类似:

1 #    "fruits.txt"                   line 1
2 %a   "colors.txt"                   line 1
  • % 表示当前正在显示的文件

  • a 表示激活的缓冲区

  • # 表示上一个访问的缓冲区

切换缓冲区

Ctrl + ^。这个操作会在“当前文件”和“上一个文件”之间来回跳。按一次跳回 fruits.txt,再按一次跳回 colors.txt。这是最快的两个文件互切方式。

按编号或名字切换:

  • :b 1 切换到编号为 1 的缓冲区

  • :b fruits 甚至能支持模糊匹配,只要打出部分名字,按 Tab 自动补全

窗口分割

colors.txt 界面里,输入

:spilt fruits.txt

简写(:sp fruits.txt

屏幕被水平分割成上下两半,上面是 colors.txt,下面是 fruits.txt

  • Ctrl + w 然后按 j —— 跳到下面的窗口

  • Ctrl + w 然后按 k —— 跳到上面的窗口

  • 规律是:Ctrl+w 开启窗口命令模式,然后再按方向键(我们就用hjkl

垂直分割

输入::vsplit(或 :vsp),把当前窗口左右再分成两半。如果你还没打开新文件,分割出来的两个窗口会显示同一个缓冲区,可以在其中一个用 :e 换文件。

Ctrl + w 再按 =,所有窗口立刻均分屏幕空间。

关闭当前窗口

:q 正常关闭(或者 Ctrl + w 再按 q

标签页

创建标签页

  • 输入 :tabnew,会打开一个空白的新标签页,里面只有一个窗口

  • 在新标签页里,用 :e fruits.txt 打开文件

切换标签页

  • gt —— 跳到下一个标签页

  • gT —— 跳到上一个标签页

  • 数字+gt —— 跳到指定的标签页(比如 1gt 跳到第一个标签页)

关闭标签页

  • :tabclose:tabc

文件浏览

打开当前目录的文件浏览器

:Explore

(简写 :Ex)。你会看到一个文件列表,用 j k 上下移动,回车打开文件或者进入目录,如果想看上层目录,光标移到 ../ 上回车即可。

窗口间复制粘贴

场景:把 fruits.txt 里的内容,逐行复制到 colors.txt 的每一行前面。

  1. :sp fruits.txt 水平分割,上下各一个文件。

  2. 在上面窗口(colors.txt)定位到第一行。

  3. Ctrl + w 再按 j 跳到下面窗口。

  4. 光标放在 apple 上,按 yy 复制整行。

  5. Ctrl + w 再按 k 跳回上面窗口。

  6. P(大写)将 apple 粘贴到当前行之前。

  7. 然后按 j 下移一行,再按 Ctrl+w j 跳下去复制 banana,如此循环。

命令总结

类别

命令

说明

打开文件

:e 文件名

在缓冲区打开文件

缓冲区列表

:ls

列出所有缓冲区

切换缓冲区

Ctrl+^

在最近两个缓冲区间切换

切换缓冲区

:b 编号/名字

按编号或名字切换

水平分割

:sp 文件名

上下分屏

垂直分割

:vsp 文件名

左右分屏

窗口间跳转

Ctrl+w j/k/h/l

按方向跳窗口

均分窗口

Ctrl+w =

窗口等大

关闭窗口

Ctrl+w q

关闭当前窗口

新建标签页

:tabnew

创建空白标签页

切换标签

gt / gT

下一个/上一个标签

文件浏览

:Ex

打开内置文件浏览器

高效定制

编辑 .vimrc 文件

Vim 的配置都写在一个叫 .vimrc 的文件里,它就在你的用户主目录下。

在终端里输入:

vim ~/.vimrc

如果文件已经存在(有些系统会预装一个示例),你可以先备份一下:

cp ~/.vimrc ~/.vimrc.backup

现在用 Vim 打开它,我们一起写几行。

基础设置

~/.vimrc 里输入以下内容

" 基础设置
set number              " 显示行号
set relativenumber      " 显示相对行号(配合跳转很好用)
set autoindent          " 自动缩进
set smartindent         " 更智能的缩进(比如换行自动对齐)
set tabstop=4           " Tab 键宽度为 4 个空格
set shiftwidth=4        " 自动缩进时使用 4 个空格
set expandtab           " 把输入的 Tab 自动转成空格(写代码常用)
set cursorline          " 高亮当前行
set hlsearch            " 搜索时高亮所有匹配项
set incsearch           " 输入搜索词时即时匹配
set ignorecase          " 搜索时默认忽略大小写
set smartcase           " 但如果搜索词包含大写字母,就区分大小写
set showcmd             " 在屏幕右下角显示正在输入的命令
set showmode            " 在屏幕左下角显示当前模式(-- INSERT -- 等)
set ruler               " 显示光标所在行号和列号
set laststatus=2        " 始终显示状态栏
set wildmenu            " 命令行补全时显示增强菜单
set mouse=a             " 启用鼠标支持(选文本、调窗口大小等,适合新人过渡)

保存并退出(:wq)。重新打开 Vim,你就可以看到设置生效了。你可以试试新的变化。或者在不退出的情况下,在任意打开的文件里执行:

:source ~/.vimrc

创建快捷键映射

Vim 允许你把常用的组合键映射成更方便的快捷键。我们会改的都是普通模式下的映射。在 ~/.vimrc 里继续添加:

" 快捷键映射
" <Leader> 键默认是反斜杠 \,可以自定义为空格
let mapleader = "\<Space>"

" 用 <Leader> + w 快速保存
nnoremap <Leader>w :w<CR>

" 用 <Leader> + q 快速退出
nnoremap <Leader>q :q<CR>

" 用 <Leader> + x 保存并退出
nnoremap <Leader>x :wq<CR>

" 用 Ctrl + j/k 在窗口间快速切换(代替 Ctrl+w j/k)
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-h> <C-w>h
nnoremap <C-l> <C-w>l

" 用 H/L 快速跳到行首/行尾(省去按 Shift)
nnoremap H ^
nnoremap L $

" 用 J/K 一次移动 5 行(实现“快速滚动”)
nnoremap J 5j
nnoremap K 5k

" 用 <Leader> + / 清除搜索高亮
nnoremap <Leader>/ :noh<CR>

注意:nnoremap 表示只在普通模式下生效,且不会递归映射。这是安全且推荐的做法。

重新加载配置(:source ~/.vimrc)

安装插件管理器

Vim 社区有无数插件,能让编辑器支持语言补全、文件树、模糊搜索等等。我们需要一个插件管理器来管理它们。这里推荐 vim-plug,因为它简单、快、支持异步安装。

安装 vim-plug:

在终端里运行这一条命令(它会把 plug.vim 下载到正确位置):

curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

配置 ~/.vimrc 以使用插件

打开 ~/.vimrc,在文件里合适的位置加入插件定义块:

" 插件管理
call plug#begin('~/.vim/plugged')

" 一个超好用的注释插件:gc 注释/取消注释
Plug 'tpope/vim-commentary'

" 状态栏美化(可选,新手友好)
Plug 'vim-airline/vim-airline'

" 文件树浏览器(可选,类似 IDE 侧边栏)
Plug 'preservim/nerdtree'

call plug#end()

保存文件并重新加载(:source ~/.vimrc 或重启 Vim),然后执行:

:PlugInstall

你会看到 vim-plug 自动下载并安装这几个插件。等它们装好后,我们立刻体验一个:vim-commentary

体验第一个插件 —— vim-commentary

这个插件提供了一个非常符合 Vim 哲学的功能:用 gc 动作来注释或取消注释代码/文本。

创建一个 test.py,随意写一些代码,在普通模式下:

  • gcc —— 注释/取消注释当前行

  • gc 然后按 j —— 注释当前行及下一行(gc + 动作)

  • 选中一段文字(用 V 进入可视行模式,然后 j 选几行),再按 gc —— 注释选中的多行

它支持大量文件类型(貌似.txt文件不支持,好像文本文件本身就不能注释),自动判断用 //# 还是 " 等注释符。

命令总结

操作

命令/设置

说明

编辑配置文件

vim ~/.vimrc

所有配置的入口

重新加载配置

:source ~/.vimrc

不用重启 Vim

显示行号

set number

绝对行号

相对行号

set relativenumber

方便看到跳几行

Tab 转空格

set expandtab

写 Python/YAML 必开

高亮当前行

set cursorline

定位更直观

搜索忽略大小写

set ignorecase

配合 smartcase 使用

设置 <Leader>

let mapleader = "\<Space>"

把 Leader 改成空格键很流行

定义快捷映射

nnoremap 键 动作

只在普通模式生效

安装 vim-plug

见上方 curl 命令

一次性安装

声明插件

Plug '作者/插件名'

写在 plug#begin/end 块内

安装插件

:PlugInstall

安装块内所有插件

注释插件使用

gc + 动作/文本对象

vim-commentary 插件

总结

Vim 的基本使用差不多就是以上这些,如果还需要深入学习,可以自行上网搜索。比如说可视化模式宏操作等。