Vim 使用从入门到精通
Vim 从入门到精通:一份终极配置指南
欢迎来到 Vim 的世界!Vim 是一款高度可配置的文本编辑器,以其强大的功能和极高的效率而闻名。Vim 的精髓在于“个性化定制”,通过修改其配置文件 .vimrc
,你可以将它打造成完全符合自己习惯的编程利器。
这份基础重构版指南是迄今为止最完整的一版。我们补充了 Vim 最核心的模式概念和内置快捷键,并将其与所有高级配置技巧整合,形成了一套从零到精通的完整学习路径。
目录
- 基础入门:你的
vimrc
文件 - Vim 的核心:模式 (Modes) [核心补充]
- 高效操作的基石:Vim 内置快捷键 [核心补充]
- 移动 (Movement)
- 编辑 (Editing)
- 搜索 (Searching)
- 可视模式 (Visual Mode)
- 核心参数配置 (
:set
命令)- 如何查询一个设置的值?(解惑
:set ts?
) - 界面显示
- 编辑与格式化
- 搜索行为
- 文件与备份
- 窗口与缓冲区
- 命令行与补全
- 如何查询一个设置的值?(解惑
- 键盘快捷键映射 (Key Mapping) [小白详解]
- 深入理解 Vim 的剪贴板:寄存器 (Registers)
- 命令行模式:文件操作高级技巧
- Vim 中的正则表达式 (Regular Expressions)
- 插件管理 (Plugin Management)
- 高级技巧:自动命令 (Autocmd) [小白详解]
- 继续探索:推荐学习资源
一、基础入门:你的 vimrc
文件
Vim 的所有配置都存储在一个名为 vimrc
的纯文本文件中。当你启动 Vim 时,它会自动加载并执行这个文件里的命令。
- 位置:
- Linux / macOS:
~/.vimrc
- Windows:
$HOME/_vimrc
或$VIM/_vimrc
- Linux / macOS:
- 如何编辑: 直接用 Vim 打开它即可!
vim ~/.vimrc
- 注释: 在
vimrc
文件中,以双引号"
开头的行为注释行,不会被执行。
二、Vim 的核心:模式 (Modes)
要理解 Vim,首先必须理解模式。与其他编辑器不同,Vim 不会让你一打开就直接打字。它将文本编辑和命令执行分离开来,置于不同的模式下。
为什么要有模式? 这种设计让你在不使用鼠标的情况下,仅用键盘就能完成光标移动、复制、删除、替换等所有操作,极大地提升了效率。
以下是 Vim 最主要的几种模式:
模式名称 | 主要功能 | 如何进入 | 如何退出 |
---|---|---|---|
普通模式 (Normal Mode) | 命令中心。用于移动光标、删除文本、复制粘贴等。这是 Vim 的默认模式。 | 打开 Vim 即是;从任何其他模式按 <Esc> | - |
插入模式 (Insert Mode) | 输入文本。就像普通的文本编辑器一样,你按下的键会直接显示在屏幕上。 | 从普通模式按 i , a , o , I , A , O 等 | 按 <Esc> 返回普通模式 |
可视模式 (Visual Mode) | 选择文本。用于高亮选中文本块,以便对其进行复制、删除等操作。 | 从普通模式按 v (字符), V (行), <C-v> (块) | 按 <Esc> 返回普通模式 |
命令行模式 (Command-Line Mode) | 执行命令。用于输入以 : 开头的 “Ex” 命令,如保存、退出、替换。 | 从普通模式按 : | 按 <Esc> 或执行完命令自动返回 |
替换模式 (Replace Mode) | 替换文本。输入会覆盖光标下的已有文本,而不是插入。 | 从普通模式按 R | 按 <Esc> 返回普通模式 |
初学者的关键:时刻清楚自己处于哪种模式。如果不确定,多按几下 Esc
键,这总能让你安全地返回到普通模式。
三、高效操作的基石:Vim 内置快捷键
在掌握了模式之后,你就可以学习 Vim 强大的内置快捷键了。这些快捷键绝大多数都在普通模式下使用。
移动 (Movement)
按键 | 功能描述 |
---|---|
h , j , k , l | 左、下、上、右 (Vim 移动的基础,请练习使用它们代替方向键) |
w | 移动到下一个单词 (word) 的开头 |
b | 回退 (backward) 到上一个单词的开头 |
e | 移动到当前单词的结尾 (end) |
0 | 移动到当前行的绝对行首 (第 0 列) |
^ | 移动到当前行第一个非空白字符 |
$ | 移动到当前行的行尾 |
gg | 移动到文件的第一行 |
G | 移动到文件的最后一行 |
:{n} 或 {n}G | 移动到第 n 行 (例如, 10G 跳转到第 10 行) |
H , M , L | 移动到屏幕的顶部 (High)、中部 (Middle)、底部 (Low) |
Ctrl + d | 向下滚动半页 (Down) |
Ctrl + u | 向上滚动半页 (Up) |
Ctrl + f | 向下滚动一页 (Forward) |
Ctrl + b | 向上滚动一页 (Backward) |
% | 在配对的括号 () , [] , {} 之间跳转 |
编辑 (Editing)
Vim 的编辑操作遵循 [操作符][范围]
的语法,极具组合性。
按键 | 功能描述 | 组合示例 |
---|---|---|
i | 在光标前进入插入 (Insert) 模式 | |
a | 在光标后进入插入 (Append) 模式 | |
o | 在当前行下方新建一行并进入插入模式 | |
O | 在当前行上方新建一行并进入插入模式 | |
I | 在当前行第一个非空白字符处进入插入模式 | |
A | 在当前行行尾进入插入模式 | |
d | 删除 (Delete) 操作符 | dw (删除一个单词), d$ (删除到行尾), dgg (删除到文件头) |
dd | 删除当前整行 | |
c | 修改 (Change) 操作符 (删除后立即进入插入模式) | cw (修改一个单词), c$ (修改到行尾) |
cc | 修改当前整行 | |
y | 复制 (Yank) 操作符 | yw (复制一个单词), y$ (复制到行尾) |
yy | 复制当前整行 | |
p | 在光标后粘贴 (Put) | |
P | 在光标前粘贴 | |
x | 删除光标下的单个字符 | |
r{char} | 替换 (Replace) 光标下的单个字符为 {char} | ra (将当前字符替换为 ‘a’) |
u | 撤销 (Undo) 上一步操作 | |
Ctrl + r | 重做 (Redo) | |
. | 重复上一次的修改命令 (极其强大!) | |
>> | 将当前行增加缩进 | |
<< | 将当前行减少缩进 |
搜索 (Searching)
按键 | 功能描述 |
---|---|
/{pattern} | 向下搜索 {pattern} |
?{pattern} | 向上搜索 {pattern} |
n | 跳转到下一个 (next) 搜索结果 |
N | 跳转到上一个搜索结果 |
* | 向下搜索光标当前所在的单词 |
# | 向上搜索光标当前所在的单词 |
可视模式 (Visual Mode)
进入可视模式后,你可以移动光标来扩大选区,然后对选中的文本执行命令。
按键 | 功能描述 |
---|---|
v | 进入字符可视模式 |
V | 进入行可视模式 |
Ctrl + v | 进入块可视模式 (可以选择矩形文本块) |
在选中后… | |
d or x | 删除选中部分 |
y | 复制选中部分 |
c | 修改选中部分 |
> | 增加选中部分的缩进 |
< | 减少选中部分的缩进 |
四、核心参数配置 (:set
命令)
(…该章节所有内容与 V3.0 一致,此处完整保留…)
这是 vimrc
中最常见的部分,使用 :set
命令可以控制 Vim 的各种行为和外观。
如何查询一个设置的值?(解惑 :set ts?
)
在 Vim 的命令行模式下,在任何 set
选项后面加上一个问号 ?
,就可以查询该选项当前的值。
所以,:set ts? sw? et?
并不是一个单一的命令。它实际上是三个独立命令的简写,Vim 允许你将它们写在一行来执行:
:set ts?
(等同于:set tabstop?
):查询tabstop
的值。:set sw?
(等同于:set shiftwidth?
):查询shiftwidth
的值。:set et?
(等同于:set expandtab?
):查询expandtab
的值。
界面显示
设置项 | 默认值 | 功能描述 | 示例 |
---|---|---|---|
number (nu ) | nonumber | 显示行号。 | set number |
relativenumber (rnu ) | norelativenumber | 显示相对行号,便于快速跳转。 | set relativenumber |
cursorline (cul ) | nocursorline | 高亮显示当前光标所在的行。 | set cursorline |
wrap | wrap | 自动换行,长行会折叠到下一行显示。 | set nowrap |
linebreak (lbr ) | nolinebreak | 在单词边界处进行换行,避免单词被截断。 | set linebreak |
showmatch (sm ) | noshowmatch | 短暂高亮显示匹配的括号。 | set showmatch |
laststatus (ls ) | 1 | 控制状态栏的显示。0 :不显示, 1 :仅双窗口显示, 2 :总是显示。 | set laststatus=2 |
ruler (ru ) | noruler | 在状态栏右下角显示光标的行号和列号。 | set ruler |
showcmd (sc ) | noshowcmd (Vim), showcmd (Neovim) | 在状态栏右下角显示未完成的命令。 | set showcmd |
scrolloff (so ) | 0 | 光标上下保留的最小行数,保持上下文可见。 | set scrolloff=8 |
sidescrolloff | 0 | 光标左右保留的最小列数。 | set sidescrolloff=5 |
termguicolors | notermguicolors | 启用 24 位真彩色支持(需要终端支持)。 | set termguicolors |
syntax | 依赖系统 | 启用语法高亮。 | syntax on |
colorscheme (colors ) | 依赖系统 | 设置颜色主题。 | colorscheme desert |
编辑与格式化
设置项 | 默认值 | 功能描述 | 示例 |
---|---|---|---|
tabstop (ts ) | 8 | 一个 Tab 字符显示的宽度(空格数)。 | set tabstop=4 |
shiftwidth (sw ) | 8 | 自动缩进和 >> /<< 命令使用的宽度。 | set shiftwidth=4 |
expandtab (et ) | noexpandtab | 将 Tab 键转换为空格。 | set expandtab |
autoindent (ai ) | noautoindent | 新行自动继承上一行的缩进。 | set autoindent |
smartindent (si ) | nosmartindent | 开启更智能的 C 语言风格缩进。 | set smartindent |
cindent | nocindent | 开启更严格、可配置的 C 语言风格缩进。 | set cindent |
undofile | noundofile | 开启持久化撤销,关闭 Vim 后历史记录不丢失。 | set undofile |
undodir | 依赖系统 | 持久化撤销文件的存放目录。 | set undodir=~/.vim/undodir |
paste | nopaste | 进入粘贴模式,避免粘贴代码时格式错乱。 | set paste |
mouse | "" (空) | 启用鼠标支持。a :所有模式, n :普通模式, i :插入模式。 | set mouse=a |
clipboard | "" (空) | 与系统剪贴板集成。unnamed , unnamedplus 。 | set clipboard=unnamedplus |
搜索行为
设置项 | 默认值 | 功能描述 | 示例 |
---|---|---|---|
hlsearch (hls ) | nohlsearch | 高亮显示所有搜索匹配结果。 | set hlsearch |
incsearch (is ) | noincsearch | 在输入搜索词时,实时显示匹配结果。 | set incsearch |
ignorecase (ic ) | noignorecase | 搜索时忽略大小写。 | set ignorecase |
smartcase (scs ) | nosmartcase | 如果搜索词包含大写字母,则不忽略大小写。 | set smartcase |
文件与备份
设置项 | 默认值 | 功能描述 | 示例 |
---|---|---|---|
backup | nobackup | 保存文件时创建备份文件(通常带 ~ 后缀)。 | set nobackup |
writebackup | writebackup | 保存时先创建备份,成功写入后再删除备份(安全选项)。 | set nowritebackup |
swapfile | swapfile | 为编辑中的文件创建交换文件(用于恢复)。 | set noswapfile |
encoding | latin1 或 utf-8 | Vim 内部使用的字符编码。强烈建议 utf-8 。 | set encoding=utf-8 |
fileencoding (fenc ) | "" (空) | 当前文件写入磁盘时使用的编码。 | set fileencoding=utf-8 |
fileformats (ffs ) | unix,dos | Vim 识别的换行符格式。unix (\n ), dos (\r\n )。 | set fileformats=unix,dos,mac |
窗口与缓冲区
设置项 | 默认值 | 功能描述 | 示例 |
---|---|---|---|
splitright (spr ) | nosplitright | 创建垂直分屏时,新窗口出现在右侧。 | set splitright |
splitbelow (sb ) | splitbelow | 创建水平分屏时,新窗口出现在下方。 | set splitbelow |
hidden | nohidden | 允许在未保存缓冲区的情况下切换到其他缓冲区。 | set hidden |
switchbuf | "" | 控制切换缓冲区时的行为,例如在当前窗口打开。 | set switchbuf=useopen |
命令行与补全
设置项 | 默认值 | 功能描述 | 示例 |
---|---|---|---|
wildmenu | nowildmenu | 启用一个可视化的命令行补全菜单。 | set wildmenu |
wildmode | full | 定义命令行补全的行为。longest,list 是一个不错的选择。 | set wildmode=longest:full,full |
history | 50 (Vim), 10000 (Neovim) | 命令历史记录的条数。 | set history=1000 |
confirm | noconfirm | 当操作可能导致信息丢失时(如退出未保存文件),弹出对话框确认。 | set confirm |
五、键盘快捷键映射 (Key Mapping) [小白详解]
这是本篇指南的核心增强部分。我们将彻底讲清楚快捷键映射的每一个细节。
核心概念:为什么用 noremap
?
Vim 有两套映射命令:map
系列和 noremap
系列。
map
:递归映射。如果你把 A 映射到 B,又把 B 映射到 C,那么按下 A 会触发 C。这很容易导致意想不到的后果。noremap
:非递归映射。如果你把 A 映射到 B,即使 B 被映射到 C,按下 A 只会触发 B。
结论:永远使用 noremap
系列命令,除非你非常清楚地知道你需要递归映射。 这能避免 99% 的快捷键冲突问题。
nnoremap
: Normal 模式inoremap
: Insert 模式vnoremap
: Visual 模式cnoremap
: Command 模式
语法精讲:拆解一个快捷键命令
让我们用一个例子来彻底搞懂语法:nnoremap <leader>w :w<CR>
nnoremap
:我们刚才讲过,代表“在 Normal 普通模式下,创建一个非递归的映射”。<leader>w
:这是触发键。它由两部分组成:<leader>
: 前导键。这是一个特殊的、可自定义的“占位符”。你可以把它想象成一个快捷键的“启动按钮”。默认是反斜杠\
,但它不好按,所以几乎所有人都会修改它。最常见的设置是空格键:
设置后," 在你的 vimrc 文件顶部添加这句 let mapleader = " "
<leader>
就代表空格键了。w
:紧跟在前导键后面的普通按键。- 所以,
<leader>w
在上面的设置下,就代表先按一下空格键,再按一下 w 键。
:w<CR>
:这是要执行的操作。它也由两部分组成::w
: 这是 Vim 的命令行命令,意思是“保存文件”。<CR>
: 这是一个特殊的按键表示法,代表 Carriage Return,也就是键盘上的回车键 (Enter)。
- 总结:
nnoremap <leader>w :w<CR>
这整句话的意思是:“请帮我在普通模式下创建一个快捷键,当我依次按下空格和w后,Vim 要自动帮我输入:w
并敲下回车,从而实现保存文件的功能。”
关键表格:Vim 中的按键表示法
为了定义快捷键,你需要知道如何在 vimrc
中表示键盘上的那些特殊按键。
真实按键 (Keyboard Key) | Vim 表示法 (Vim Notation) | 示例 | 描述 |
---|---|---|---|
Control (Ctrl) | <C-...> | <C-s> | 按住 Ctrl 再按 s |
Alt (或 Option on Mac) | <A-...> 或 <M-...> | <A-j> | 按住 Alt 再按 j |
Shift | <S-...> | <S-Up> | 按住 Shift 再按上箭头 |
回车 (Enter / Return) | <CR> | :w<CR> | 用于执行命令 |
Esc | <Esc> | inoremap jj <Esc> | 从插入模式返回普通模式 |
空格 (Space) | <Space> | nnoremap <Space> :noh<CR> | <leader> 通常被设为空格 |
Tab | <Tab> | nnoremap <Tab> % | % 是跳转到匹配括号 |
上/下/左/右箭头 | <Up> , <Down> , <Left> , <Right> | nnoremap <C-k> <Up> | 不推荐用箭头,但可以映射 |
功能键 F1-F12 | <F1> , <F2> … | nnoremap <F5> :!python %<CR> | 执行当前 Python 脚本 |
Leader 键 | <leader> | <leader>w | 你自定义的前导键 |
常见误区:"+y
不是组合键!
初学者经常被 vnoremap <leader>y "+y
这样的命令搞糊涂。
<leader>y
:这是触发键(比如空格+y)。"+y
:这不是按键!"
是 Vim 中指定寄存器的命令。+
:代表系统剪贴板寄存器。y
:代表 yank (复制) 命令。
- 所以
"+y
的意思是:“执行复制操作,并将结果发送到系统剪贴板”。
这行命令的完整翻译是:“在可视模式下,当我选中一些文本后,按下空格+y,Vim 会将选中的文本复制到我的电脑系统剪贴板里,这样我就可以粘贴到浏览器等其他软件中了。”
同理,y$
的意思是:执行 y
(复制) 命令,作用范围是到 $
(行尾)。
保姆级教程:创建你的第一个快捷键
目标:我们想在普通模式下,按 Ctrl + s
快速保存文件。
-
Step 1: 确定需求 (Define the Goal)
- 我不想每次都输入
:w
然后回车来保存文件,太慢了。我想要一个像其他编辑器一样的Ctrl + s
保存快捷键。
- 我不想每次都输入
-
Step 2: 找到对应的 Vim 命令 (Find the Vim Command)
- 保存文件的命令是
:w
。为了让它执行,后面需要跟一个回车<CR>
。所以,我们需要执行的操作是:w<CR>
。
- 保存文件的命令是
-
Step 3: 选择触发按键 (Choose the Trigger Keys)
- 我们选择了
Ctrl + s
。根据上面的表格,它在 Vim 中的表示法是<C-s>
。
- 我们选择了
-
Step 4: 选择正确的映射命令 (Select the Right Mapping Command)
- 我们希望这个快捷键在普通模式 (Normal Mode) 下生效,并且为了安全,使用非递归版本。所以命令是
nnoremap
。
- 我们希望这个快捷键在普通模式 (Normal Mode) 下生效,并且为了安全,使用非递归版本。所以命令是
-
Step 5: 组合成最终命令 (Assemble the Final Command)
- 将各部分组合起来:
nnoremap <C-s> :w<CR>
- 将各部分组合起来:
-
Step 6: 添加到
vimrc
并使其生效 (Add tovimrc
and Apply)- 用 Vim 打开你的配置文件:
vim ~/.vimrc
- 在文件的任意位置(推荐是快捷键映射区域)添加这一行:
" My custom shortcuts nnoremap <C-s> :w<CR>
- 保存并退出 (
:wq
)。 - 关键一步:让配置生效。你有两个选择:
- A) 重启 Vim:关闭所有 Vim 窗口再重新打开。
- B) 重新加载配置 (推荐):在 Vim 中执行命令
:so %
(so 是 source 的缩写, % 代表当前文件)。
- 用 Vim 打开你的配置文件:
-
Step 7: 测试 (Test)
- 打开任意一个文件:
vim test.txt
- 进入插入模式(按
i
),随便输入一些文字。 - 返回普通模式(按
Esc
)。 - 现在,按下
Ctrl + s
。 - 如果你在左下角看到类似
"test.txt" written
的消息,恭喜你,快捷键配置成功!
- 打开任意一个文件:
六、深入理解 Vim 的剪贴板:寄存器 (Registers)
什么是寄存器?
你可以把寄存器想象成 Vim 内置的、拥有多个不同“隔间”的剪贴板。你平时在 Windows/Mac 里用的 Ctrl+C
/ Cmd+C
只是一个单一的剪贴板,新的内容会覆盖旧的。而 Vim 提供了大量寄存器,让你能同时保存和取用多份不同的文本。
- 如何使用:在执行复制(
y
)、删除(d
)、粘贴(p
)等操作之前,先输入"
(双引号) 和一个寄存器的名字。
表格一:Vim 的常用寄存器
寄存器名称 | 符号 | 功能描述 | 示例 |
---|---|---|---|
无名寄存器 | " | 默认寄存器。y , d , p 如果不指定,就用它。 | yy (复制当前行到无名寄存器) |
系统剪贴板 | + | 最常用! 与操作系统的剪贴板互通。 | "+yy (复制当前行到系统剪贴板) |
主选择区 (X11) | * | 在 Linux/Unix 系统中,通常指鼠标中键粘贴的内容。 | "*p (粘贴来自鼠标中键选择的内容) |
编号寄存器 | 0 to 9 | 自动保存你最近的复制和删除历史。 | "0p (粘贴上次复制的内容) |
0 保存最近一次复制 (y ) 的内容。 | "1p (粘贴上次删除的内容) | ||
1-9 保存最近 9 次删除 (d ) 的内容,"1 是最新的。 | |||
具名寄存器 | a to z | 用户自定义寄存器,可以随意使用。 | "ayy (复制当前行到 ‘a’ 寄存器) |
A to Z | 追加内容到对应的小写具名寄存器。 | "Adw (删除一个单词并追加到 ‘a’ 寄存器) | |
黑洞寄存器 | _ | 任何送到这里的内容都会被丢弃,不影响任何其他寄存器。 | "_dd (删除当前行,但不保存到任何地方) |
只读寄存器 | . | 上次插入的文本。 | |
% | 当前文件名。 | ||
# | 轮换文件名。 | ||
: | 上次执行的 Ex 命令。 |
表格二:使用寄存器的命令
命令格式 | 操作 | 详细说明 |
---|---|---|
"{register}y{motion} | 复制到… | "+yiw :复制 (y ) 当前光标下的单词 (iw ) 到系统剪贴板 (+ )。 |
"{register}d{motion} | 删除到… | "_d$ :删除 (d ) 从光标到行尾 ($ ) 的内容,并丢弃 (_ )。 |
"{register}p | 从…粘贴 | "ap :在光标后粘贴 (p ) 来自 ‘a’ 寄存器 (a ) 的内容。 |
"{register}P | 从…粘贴(之前) | "aP :在光标前粘贴 (P ) 来自 ‘a’ 寄存器 (a ) 的内容。 |
let @{register} = "..." | 设置寄存器内容 | let @a = "hello" :直接将字符串 “hello” 存入 ‘a’ 寄存器。 |
:reg {registers} | 查看寄存器内容 | :reg a0+ :显示 ‘a’, ‘0’, 和 ‘+’ 寄存器里当前的内容。 |
实战总结:
- 想复制到系统剪贴板,方便粘贴到其他程序?用
"+y
。 - 想从其他程序粘贴到 Vim?用
"+p
。 - 想安全地删除一些内容,又不想覆盖你刚复制的东西?用
"_d
。 - 想交换两段文字?先把第一段
d
(它会进入"
寄存器),再选中第二段p
(会用第一段替换),此时第二段文字被存入了"
寄存器,到第一段原来的位置p
即可。
七、命令行模式:文件操作高级技巧
命令 | 功能描述 | 示例 |
---|---|---|
:e <path> | 编辑一个新文件。 | :e index.html |
:sp <path> | 水平分割窗口打开文件。 | :sp styles.css |
:vs <path> | 垂直分割窗口打开文件。 | :vs script.js |
:%s/old/new/g | 在整个文件中查找并替换。% 表示所有行。 | :%s/foo/bar/g |
:/pattern | 搜索指定的模式。 | :/function |
:ls | 列出所有打开的缓冲区(buffer)。 | :ls |
:b <number/name> | 切换到指定的缓冲区。 | :b 2 或 :b index |
:help <topic> | 打开 Vim 的内置帮助文档。 | :help :w |
:! <command> | 执行外部 shell 命令。 | :!ls -la |
:saveas {filename} | 另存为并切换。 | :saveas new_feature.js |
:'<,'>w {filename} | (可视模式下) 将选中部分写入到 {filename} 。 | :'<,'>w selected_code.py |
:%w >> {filename} | 将所有行追加到 {filename} 的末尾。 | :%w >> log.txt |
:e! | 重新加载当前文件,放弃所有未保存的修改。 | :e! |
:r {filename} | 读取 {filename} 的内容,并插入到光标下方。 | :r header.html |
:r! {command} | 执行 shell 命令,并将其输出插入到光标下方。 | :r! date |
:w | 将当前缓冲区的内容写入到关联的文件。 | :w |
:w! | 强制写入 (例如,当文件是只读时)。需要权限。 | :w! |
:q | 退出当前窗口。如果文件有未保存修改则会失败。 | :q |
:q! | 强制退出,丢弃所有未保存的修改。 | :q! |
:wq 或 :x | 保存并退出。:x 更智能,仅在有修改时才写入。 | :wq |
:w {filename} | 另存为。将缓冲区内容写入到 {filename} ,但 Vim 仍关联原文件。 | :w backup.txt |
:saveas {filename} | 另存为并切换。将文件存为 {filename} ,并让当前缓冲区关联这个新文件。 | :saveas new_feature.js |
:%w {filename} | 将所有行写入到 {filename} (会覆盖)。 | :%w all_content.txt |
:10,20w {filename} | 仅将第 10 到 20 行写入到 {filename} 。 | :10,20w snippet.txt |
:'<,'>w {filename} | (在可视模式下选择后) 将选中部分写入到 {filename} 。 | :'<,'>w selected_code.py |
:%w >> {filename} | 将所有行追加到 {filename} 的末尾。 | :%w >> log.txt |
:e {filename} | 编辑一个新文件。 | :e index.html |
:e! | 重新加载当前文件,放弃所有未保存的修改。 | :e! |
:r {filename} | 读取 {filename} 的内容,并插入到光标下方。 | :r header.html |
:r! {command} | 执行 shell 命令 {command} ,并将其输出插入到光标下方。 | :r! date (插入当前日期) |
这些是在普通模式下按 :
后输入的命令,用于文件操作、编辑、窗口管理等。
八、Vim 中的正则表达式 (Regular Expressions)
正则表达式是 Vim 搜索和替换功能的基石。
- 搜索: 在普通模式下按
/
然后输入正则表达式。 - 替换: 使用
:s
命令,格式为:[range]s/pattern/replacement/[flags]
。
Vim 正则元字符
元字符 | 描述 | 示例(在搜索中) |
---|---|---|
. | 匹配任意单个字符。 | /h.t 匹配 “hat”, “hot” 等。 |
* | 匹配前一个原子零次或多次。 | /ab*c 匹配 “ac”, “abc”, “abbc”。 |
\+ | 匹配前一个原子一次或多次 (需要转义)。 | /ab\+c 匹配 “abc”, “abbc”。 |
\? | 匹配前一个原子零次或一次 (需要转义)。 | /ab\?c 匹配 “ac”, “abc”。 |
^ | 匹配行首。 | /^start |
$ | 匹配行尾。 | /end$ |
[] | 匹配方括号内的任意一个字符。 | /[abc] 匹配 “a” 或 “b” 或 “c”。 |
\d | 匹配数字 [0-9] 。 | /\d\+ 匹配一个或多个数字。 |
\w | 匹配单词字符 [a-zA-Z0-9_] 。 | /\w\+ 匹配一个单词。 |
\s | 匹配空白字符(空格,Tab)。 | /\s\+ 匹配一个或多个空白。 |
\(\) | 捕获分组 (需要转义)。 | /\(foo\)\(bar\) |
| | 或操作符 (需要转义)。 | /foo|bar |
“Very Magic” 模式: 为了避免频繁地转义 +
, ?
, |
, ()
等字符,你可以在模式前加上 \v
,这会让语法更接近标准的 ERE (Extended Regular Expression)。
九、插件管理 (Plugin Management)
现代 Vim 用户几乎都会使用插件管理器,vim-plug
是一个非常流行且易于使用的选择。
- 安装
vim-plug
(详见 vim-plug 官网)。 - 配置
vimrc
:call plug#begin('~/.vim/plugged') " 在此列出你的插件 Plug 'preservim/nerdtree' Plug 'junegunn/fzf.vim' call plug#end()
- 安装插件: 保存
vimrc
后,在 Vim 中运行命令:PlugInstall
。
十、高级技巧:自动命令 (Autocmd) [小白详解]
autocmd
能在特定事件 (Event) 发生时,自动执行指定的命令 (Command)。这让 Vim 变得非常“智能”。
保姆级教程:实现文件类型专属配置
目标:我们希望 Vim 能自动识别文件类型,并应用不同的缩进规则。
-
当编辑 Python 文件 (
.py
) 时,我们希望一个 Tab 等于 4 个空格。 -
当编辑 JavaScript 文件 (
.js
) 时,我们希望一个 Tab 等于 2 个空格。 -
Step 1: 确定需求 (Define the Goal)
- 为不同编程语言设置不同的、符合社区规范的缩进风格。
-
Step 2: 找到对应的 Vim 命令 (Find the Vim Commands)
- 我们需要设置三个参数:
tabstop
(ts): Tab 字符显示宽度。shiftwidth
(sw): 自动缩进宽度。expandtab
(et): 将 Tab 转换为空格。
- 为了不影响其他文件,我们使用
setlocal
而不是set
,setlocal
只对当前文件生效。 - Python 配置命令:
setlocal tabstop=4 shiftwidth=4 expandtab
- JavaScript 配置命令:
setlocal tabstop=2 shiftwidth=2 expandtab
- 我们需要设置三个参数:
-
Step 3: 确定触发事件 (Determine the Trigger Event)
- 我们希望在 Vim 识别出文件类型之后执行这些命令。这个事件叫做
FileType
。
- 我们希望在 Vim 识别出文件类型之后执行这些命令。这个事件叫做
-
Step 4: 组合成
autocmd
命令 (Assemble theautocmd
Command)autocmd FileType <文件类型> <要执行的命令>
- Python 的自动命令:
autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab
- JavaScript 的自动命令:
autocmd FileType javascript setlocal tabstop=2 shiftwidth=2 expandtab
-
Step 5: 使用
augroup
规范化管理 (Organize withaugroup
)- 如果你不把
autocmd
包裹在augroup
里,每次你重新加载vimrc
(:so %
),它都会重复添加一次自动命令,导致一个事件触发多次。augroup
可以解决这个问题。 - 语法结构:
augroup MyAutoCmds " 创建一个组,名字随意autocmd! " 关键!清除这个组里所有旧的命令" 在这里放入你所有的 autocmd 命令autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtabautocmd FileType javascript setlocal tabstop=2 shiftwidth=2 expandtab augroup END " 结束组定义
- 如果你不把
-
Step 6: 添加到
vimrc
并测试 (Add tovimrc
and Test)- 打开
~/.vimrc
。 - 将上面完整的
augroup
代码块粘贴进去。 - 保存并重新加载配置 (
:so %
)。 - 测试 Python:
- 在 Vim 中打开一个 Python 文件:
:e test.py
- 查看缩进设置,输入命令
:set ts? sw? et?
- Vim 应该会显示
tabstop=4
,shiftwidth=4
,expandtab
。
- 在 Vim 中打开一个 Python 文件:
- 测试 JavaScript:
- 在同一个 Vim 实例中,打开一个 JS 文件:
:e test.js
- 再次查看缩进设置:
:set ts? sw? et?
- Vim 现在应该显示
tabstop=2
,shiftwidth=2
,expandtab
。
- 在同一个 Vim 实例中,打开一个 JS 文件:
- 如果结果符合预期,说明你的自动命令配置成功了!Vim 现在会为你自动切换缩进风格。
- 打开
十一、继续探索:推荐学习资源
-
vimtutor
- 内置交互式教程- 如何使用:在终端里输入
vimtutor
命令。 - 为什么推荐:学习 Vim 的第一站,通过实际操作教学。
- 如何使用:在终端里输入
-
:help
- Vim 的内置圣经- 如何使用:在 Vim 中输入
:help <你想查询的命令>
。 - 为什么推荐:最准确、最全面的官方文档。
- 如何使用:在 Vim 中输入
-
Vim Cheat Sheet (速查表)
- 网址:https://vim.rtorr.com/
- 为什么推荐:设计精美、可交互的速查网站。
-
Vim Fandom (formerly Vim Wiki)
- 网址:https://vim.fandom.com/wiki/Vim_Tips_Wiki
- 为什么推荐:巨大的 Vim 技巧知识库。
-
Awesome Neovim/Vim (GitHub)
- 网址:https://github.com/rockerBOO/awesome-neovim
- 为什么推荐:精心整理的插件、颜色主题和资源列表。
-
r/vim (Reddit 社区)
- 网址:https://www.reddit.com/r/vim/
- 为什么推荐:活跃的英文 Vim 社区,适合提问与交流。
结语
Vim 的学习曲线可能很陡峭,但它带来的回报是巨大的。这份增强版指南希望能为你扫清学习道路上最大的几个障碍,让你真正体会到定制 Vim 的乐趣和强大。
最好的学习方法就是不断地实践、探索和调整。从基础开始,逐步添加,慢慢地,你就会打造出一个专属于你的、无可替代的编辑器。祝你编码愉快!