全面的Vim教程:从入门到精通

2024/11/10 vim tutorial 共 7909 字,约 23 分钟

全面的Vim教程:从入门到精通

一、Vim的基本概念

1.1 Vim是什么

Vim是一个功能强大的文本编辑器,是Vi编辑器的增强版本。它以其高效的编辑方式、丰富的功能和高度可定制性而闻名。Vim的设计理念是让用户尽可能少地离开键盘主区域,通过组合键完成各种编辑任务,从而提高编辑效率。

1.2 Vim的三种基本模式

Vim有三种基本模式:

  1. 普通模式(Normal Mode):默认模式,用于导航和编辑操作
  2. 插入模式(Insert Mode):用于输入文本
  3. 命令模式(Command Mode):用于执行命令

1.3 模式切换

  • 从普通模式进入插入模式:i, a, o, I, A, O
  • 从任何模式返回普通模式:Esc
  • 从普通模式进入命令模式::

二、基本导航操作

2.1 光标移动

# 基本移动
h - 向左移动一个字符
l - 向右移动一个字符
j - 向下移动一行
k - 向上移动一行

# 单词级导航
b - 移动到上一个单词开头
w - 移动到下一个单词开头
e - 移动到当前单词末尾
ge - 移动到前一个单词末尾

# 行级导航
0 - 移动到行首
^ - 移动到行首第一个非空白字符
$ - 移动到行尾

# 文件级导航
gg - 移动到文件开头
G - 移动到文件末尾
:n - 移动到第n行

2.2 页面滚动

Ctrl+f - 向下滚动一页
Ctrl+b - 向上滚动一页
Ctrl+d - 向下滚动半页
Ctrl+u - 向上滚动半页
Ctrl+e - 向下滚动一行
Ctrl+y - 向上滚动一行

2.3 查找跳转

f<字符> - 查找光标后第一个指定字符
F<字符> - 查找光标前第一个指定字符
% - 括号匹配跳转
* - 查找当前光标所在单词
# - 向后查找当前光标所在单词

三、基本编辑操作

3.1 插入文本

i - 在光标前插入
I - 在行首插入
a - 在光标后插入
A - 在行尾插入
o - 在当前行下方插入新行
O - 在当前行上方插入新行

3.2 删除操作

x - 删除光标所在字符
3x - 删除当前光标开始向后三个字符
X - 删除光标前一个字符
X=dh
dl - 删除当前字符, dl=x
dh - 删除前一个字符
dd - 删除当前行
dj - 删除上一行
dk - 删除下一行
10d - 删除当前行开始的10行
D - 删除当前字符至行尾。D=d$
d$ - 删除当前字符之后的所有字符(本行)
dw - 删除从光标到单词末尾
d0 - 删除从光标到行首
dG - 删除从当前行到文件末尾
dgg - 删除从当前行到文件开头
kdgg - 删除当前行之前所有行(不包括当前行)
jdG(jd shift + g- 删除当前行之后所有行(不包括当前行)
J(shift + j) - 删除两行之间的空行,实际上是合并两行

3.3 修改操作

r - 替换光标所在字符
ra - 将当前字符替换为a,当前字符即光标所在字符
R - 进入替换模式,连续替换字符
c - 修改操作前缀,如cw修改单词
cc - 修改整行
C - 修改从光标到行尾

3.4 复制和粘贴

yy - 复制当前行
nyy - 复制当前后开始的n行,比如2yy复制当前行及其下一行
yw - 复制单词
y$ - 复制从光标到行尾
p - 在当前光标后粘贴,如果之前使用了yy命令来复制一行,那么就在当前行的下一行粘贴
P - 在光标前粘贴
shift+p - 在当前行前粘贴

3.5 剪切和移动

ndd - 剪切当前行之后的n行。利用p命令可以对剪切的内容进行粘贴
:1,10d -1-10行剪切。利用p命令可将剪切后的内容进行粘贴
:1,10 m 20 - 将第1-10行移动到第20行之后

3.6 撤销和重做

u - 撤销(Undo)
U - 撤销对整行的操作
Ctrl+r - 重做(Redo),即撤销的撤销

四、寄存器

4.1 基本寄存器

Vim有多种寄存器,用于存储复制或删除的内容:

  • 未命名寄存器("):默认存储最近的操作
  • 数字寄存器(0-9):存储最近的10次复制或删除操作
  • 命名寄存器(a-z):用户可以命名的寄存器
  • 黑洞寄存器(_):任何放入此寄存器的内容都会被丢弃

4.2 使用寄存器

"ayy - 复制当前行到寄存器a
"ap - 粘贴寄存器a的内容
"_dd - 删除当前行但不保存到任何寄存器

五、文本对象

5.1 基本文本对象

iw - 单词内部
i" - 双引号内部
i' - 单引号内部
i) - 括号内部
i] - 方括号内部
i} - 大括号内部
i> - 尖括号内部

a{ - 包括大括号在内的整个块
a" - 包括双引号在内的整个字符串

5.2 文本对象的使用

diw - 删除单词内部
ci" - 修改双引号内部的内容
va{ - 选择包括大括号在内的整个块

六、宏

6.1 录制和回放宏

q<寄存器> - 开始录制宏
q - 结束录制
@<寄存器> - 回放宏
@@ - 重复上次回放的宏

6.2 宏的高级使用

  • 在录制宏时使用相对行号
  • 使用视觉模式选择多行后执行宏
  • 宏的嵌套和组合

七、多窗口和缓冲区

7.1 多窗口操作

:split - 水平分割窗口
:vsplit - 垂直分割窗口
Ctrl+ww - 移动到下一个窗口
Ctrl+wj - 移动到下方的窗口
Ctrl+wk - 移动到上方的窗口
Ctrl+w + - 增加窗口高度
Ctrl+w - - 减少窗口高度
Ctrl+w > - 增加窗口宽度
Ctrl+w < - 减少窗口宽度
:close - 关闭窗口,最后一个窗口不能使用此命令
:only - 关闭所有窗口,只保留当前窗口

# 窗口大小调整和布局控制
Ctrl+w,\+ - 最大化当前窗口高度
Ctrl+w,- - 最小化当前窗口高度
Ctrl+w,\= - 均衡化所有窗口大小
Ctrl+w,| - 最大化当前窗口宽度
Ctrl+w,_ - 最大化当前窗口,其他窗口最小化
Ctrl+w,\> - 向右增大当前窗口宽度
Ctrl+w,\< - 向左减小当前窗口宽度

# 窗口轮转和位置调整
Ctrl+w,r - 轮转所有窗口
Ctrl+w,R - 反向轮转所有窗口
Ctrl+w,H - 最大化当前窗口,其他窗口最小化,并将当前窗口移动到左边
Ctrl+w,L - 最大化当前窗口,其他窗口最小化,并将当前窗口移动到右边
Ctrl+w,J - 最大化当前窗口,其他窗口最小化,并将当前窗口移动到下边
Ctrl+w,K - 最大化当前窗口,其他窗口最小化,并将当前窗口移动到上边

# 窗口分割和切换常用操作
Ctrl+w,s - 水平分割,上下分屏(与:split相同)
Ctrl+w,v - 垂直分割,左右分屏(与:vsplit相同)
ctrl+w,q - 取消相邻窗口
ctrl+w,o - 取消全部窗口,只保留当前窗口(与:only相同)
:wqall - 保存所有窗口并退出
Ctrl+w,Arrow - 在窗口间按方向键切换

7.1.1 文件分割实践

在实际使用中,文件分割可以帮助我们同时查看和编辑文件的不同部分:

  1. 打开文件后,在普通模式下:
    • Ctrl+w然后按s - 水平分割当前窗口
    • Ctrl+w然后按v - 在光标所在位置垂直分割当前窗口
  2. 多窗口工作流示例
    • 光标转移到右侧窗口(使用Ctrl+w, →
    • 在右侧窗口中再次按Ctrl+w然后按v进行进一步分割
    • 使用Ctrl+w,s在当前窗口下方创建水平分割

这种分割方式特别适合需要同时查看文件不同部分或比较相关内容的场景。

7.2 缓冲区管理

:ls - 列出所有缓冲区
:b <数字> - 切换到指定缓冲区
:b <文件名> - 切换到指定文件的缓冲区
:bnext - 下一个缓冲区
:bn - 切换到下一个文件
:bprev - 上一个缓冲区
:bp - 切换到上一个文件
:bd - 删除当前缓冲区
:args - 查看当前打开的文件列表,当前正在编辑的文件会用[]括起来

八、文件操作

8.1 基本文件操作

vim - 直接启动vim
vim filename - 打开vim并创建名为filename的文件
vim file1 file2 file3 ... - 同时打开多个文件
:open file - 在vim窗口中打开一个新文件
:split file - 在新窗口中打开文件
:e ftp://192.168.10.76/abc.txt - 打开远程文件,比如ftp或者share folder
:e \qadrive est.txt - 打开网络共享文件
:w - 保存文件
:wq - 保存并退出
ZZ - 保存并退出
:q! - 强制退出并忽略所有更改
:e! - 放弃所有修改,并打开原来文件

九、高级搜索和替换

9.1 搜索操作

/ - 向前搜索
/text - 查找text,按n健查找下一个,按N健查找前一个
? - 向后搜索
?text - 查找text,反向查找,按n健查找下一个,按N健查找前一个
n - 下一个匹配项
N - 上一个匹配项

9.2 搜索选项

:set ignorecase - 搜索时忽略大小写
:set noignorecase - 不忽略大小写的查找
:set smartcase - 当搜索字符串包含大写字母时区分大小写
:set hlsearch - 高亮显示搜索结果,所有结果都高亮显示
:set nohlsearch - 关闭高亮搜索显示
:nohlsearch - 关闭当前的高亮显示,如果再次搜索或者按下n或N键,则会再次高亮
:set incsearch - 逐步搜索模式,对当前键入的字符进行搜索而不必等待键入完成
:set wrapscan - 重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启

9.3 替换操作

:s/old/new/ - 用old替换new,替换当前行的第一个匹配
:s/old/new/g - 用old替换new,替换当前行的所有匹配
:%s/old/new/ - 用old替换new,替换所有行的第一个匹配
:%s/old/new/g - 用old替换new,替换整个文件的所有匹配
:%s/old/new/gc - 全局替换,每次替换前确认
:10,20 s/^/    /g - 在第10行知第20行每行前面加四个空格,用于缩进

十、Vim范围操作

10.1 文件范围操作命令

Vim中的范围操作允许您对文本的特定部分执行命令。常见的范围包括:

  • % - 整个文件
  • . - 当前行
  • $ - 最后一行
  • n - 第n行
  • '<,'> - 视觉模式选择的范围

10.2 全局命令(:g)详解

全局命令(global command)是Vim中一个非常强大的工具,它允许您在匹配特定模式的所有行上执行指定命令。基本语法为::[range]g/pattern/[cmd]

10.2.1 常用全局命令示例

# 在每行末尾添加分号(适用于C/C++/JavaScript等语言)
:g/$/normal A;

# 在每行开头添加#号(添加注释)
:g/^/normal I#

# 删除所有包含特定模式的行
:g/pattern/d

# 删除所有空行
:g/^$/d

# 删除所有只包含空白字符的行
:g/^\s*$/d

# 在所有包含特定模式的行后插入新行和内容
:g/pattern/normal o新内容

# 在所有包含特定模式的行前插入新行和内容
:g/pattern/normal O新内容

# 在所有非空行末尾添加分号
:g/^\s*\S/normal A;

# 为所有非注释行添加注释(假设注释符号为//:g/^\s*\S/normal I// 

# 移除所有以#开头的行的注释符号
:g/^\s*#/s/#//

# 将所有以function开头的行的第一个字符转换为大写
:g/^function/s/^f/F/

# 在所有以TODO开头的行添加高亮标记
:g/^TODO/normal A 🔴

10.2.2 全局命令的高级用法

  • 使用范围限制1,10g/pattern/d - 仅在1-10行范围内删除包含pattern的行
  • 反向匹配v/pattern/d - 删除所有不包含pattern的行
  • 执行多个命令g/pattern/exe "normal dd" | exe "normal p" - 对匹配行执行多个命令
  • 使用寄存器g/pattern/y A - 将所有匹配行复制到寄存器A中

10.2.3 全局命令与普通模式命令结合

全局命令可以与几乎所有普通模式命令结合使用,这使得它成为批量编辑的强大工具:

# 为所有行缩进4个空格
:g/^/normal >>

# 为所有以def开头的行减少缩进
:g/^def/normal <<

# 在所有行首添加行号前缀
:g/^/execute ".s/^/".line('.').": /"

# 为所有JSON键值对添加引号
:g/:\s*\([^\"]\)/s/:\s*/: "/ | s/$/"/

10.3 行范围表示法

行范围表示法是Vim中一个强大的特性,用于指定要操作的文本范围。最基本的格式是start,end,其中startend是行号或其他行引用。

10.3.1 逗号与分号分隔符的区别

在Vim的行范围表示法中,逗号(,)和分号(;)作为分隔符有重要区别:

  • 逗号分隔符(,): 两个行号都基于原始光标位置
    • 示例::5,-2d 表示删除从第5行到光标位置上方2行的所有行
    • 这里的5是绝对行号,而-2是相对于当前光标位置的偏移量
  • 分号分隔符(;): 第二个行号基于第一个行号
    • 示例::5;-2d 表示删除从第5行向上移动2行开始,到第5行结束的所有行(即第3-5行)
    • 这里的5是绝对行号,而-2是相对于第一个行号(5)的偏移量
  • 特殊情况: 当使用加号(+)时,两种分隔符行为一致
    • 例如::5,+2d:5;+2d 效果相同,都表示删除从第5行到第7行(5+2)的所有行

10.3.2 常用范围操作示例

:%d - 删除整个文件内容
:1,10d - 删除第110:1,10 co 20 -1-10行插入到第20行之后
:1,$ co $ - 将整个文件复制一份并添加到文件尾部
:.+1,$d - 删除从当前行下一行到文件末尾
:5,+5d - 删除从第5行开始的6行(包括第5行)
:1,/pattern/d - 删除从第1行到包含pattern的行

10.4 范围操作的高级用法

  • 结合命令的范围操作
  • 使用模式匹配定义范围
  • 视觉模式下的范围操作
  • 与全局命令(:g)结合使用的复杂编辑操作

十一、Vim命令模式高级操作

11.1 命令历史查看

Vim会保存您执行过的命令历史,方便重复执行或修改后执行。

11.1.1 使用:history命令

:history - 显示所有命令历史
:history 10 - 显示最近10条命令
:history / - 显示搜索历史
:history s - 显示替换命令历史

11.1.2 浏览命令历史

  • 在命令模式下,使用上箭头(↑)下箭头(↓)键浏览历史命令
  • 使用Ctrl+pCtrl+n也可以上下浏览命令历史
  • 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令

11.1.3 部分匹配搜索

  • 在命令模式下,输入部分命令,然后按Ctrl+pCtrl+n可以搜索历史中包含该部分的命令
  • 例如,输入:s/然后按Ctrl+p会显示历史中所有替换命令

11.1.4 自定义命令历史设置

:set history=1000 - 设置保存1000条命令历史

11.1.5 命令历史的存储位置

Vim的命令历史默认保存在~/.viminfo文件中(Windows系统为~/_viminfo),这样每次启动Vim时都可以访问之前的历史记录。

11.2 命令行编辑快捷键

在命令模式下,Vim提供了多种快捷键来编辑命令行:

11.2.1 光标移动

  • Ctrl+b - 移动到命令行开头
  • Ctrl+e - 移动到命令行末尾
  • Ctrl+f右箭头 - 向前移动一个字符
  • Ctrl+b左箭头 - 向后移动一个字符
  • Alt+f - 向前移动一个单词
  • Alt+b - 向后移动一个单词

11.2.2 编辑操作

  • Ctrl+h - 删除光标前的字符
  • Ctrl+d - 删除光标后的字符
  • Ctrl+w - 删除光标前的单词
  • Ctrl+u - 删除从光标到命令行开头的所有内容
  • Ctrl+k - 删除从光标到命令行末尾的所有内容
  • Ctrl+y - 粘贴最近删除的内容
  • Ctrl+l - 根据当前行的内容自动完成命令

11.2.3 命令行配置选项

:set wildmenu - 启用命令行补全菜单
:set wildmode=list:longest - 设置补全模式

11.2.4 实用技巧

  • 使用!执行外部命令,如:!ls -la
  • 使用Ctrl+r然后输入寄存器名称可以在命令行中插入寄存器内容
  • 使用Ctrl+r然后输入%可以插入当前文件名
  • :!ls - 列出当前目录下文件
  • :!perl -c script.pl - 检查perl脚本语法,可以不用退出vim
  • :!perl script.pl - 执行perl脚本,可以不用退出vim
  • :suspend 或 Ctrl-Z - 挂起vim,回到shell,按fg可以返回vim

十二、语法高亮和显示设置

12.1 语法高亮设置

:syntax - 列出已经定义的语法项
:syntax clear - 清除已定义的语法规则
:syntax case match - 大小写敏感,int和Int将视为不同的语法元素
:syntax case ignore - 大小写无关,int和Int将视为相同的语法元素,并使用同样的配色方案

12.2 显示设置

:set list - 显示非打印字符,如tab,空格,行尾等
:set nowrap - 关闭自动换行
:set scrollbind - 同步滚动多个窗口
:set cursorline - 高亮显示当前行
:set ruler? - 查看是否设置了ruler,在.vimrc中,使用set命令设制的选项都可以通过这个命令查看
:set lcs=tab:>- - 设置tab的显示方式
:scriptnames - 查看vim脚本文件的位置,比如.vimrc文件,语法文件及plugin等

十三、注释操作

13.1 为代码添加注释

3,5 s/^/#/g - 注释第3-5行(适用于Python等以#为注释符号的语言)
3,5 s/^#//g - 解除3-5行的注释
1,$ s/^/#/g - 注释整个文档
:%s/^/#/g - 注释整个文档,此法更快

十四、视觉模式操作

14.1 进入视觉模式

  • v - 进入逐字视觉模式
  • V - 进入逐行视觉模式
  • Ctrl+v - 进入块视觉模式

14.2 视觉模式下的操作

v+移动命令 - 选择文本
y - 复制选中的文本
d - 剪切选中的文本
c - 修改选中的文本

十五、插件及实用技巧

15.1 推荐的Vim插件

  • NERDTree:文件浏览器
  • Vim-airline:增强状态栏
  • EasyMotion:快速导航
  • CtrlP:文件搜索
  • vim-gitgutter:Git集成

15.2 实用编辑技巧

  • 使用.重复上次编辑操作
  • 使用ddp交换当前行和其下一行
  • 使用xp交换当前字符和其后一个字符
  • 使用g;g,在编辑位置间跳转
  • 使用^移动到本行第一个非空白字符上
  • 使用<HOME>移动到本行第一个字符。同0健
  • 使用f命令查找字符,如fx将找到光标后第一个为x的字符,3fd将找到第三个为d的字符
  • 使用F同f,反向查找
  • 使用:set number:set nu显示行号
  • 使用:set nonumber:set nonu隐藏行号

十六、帮助系统

16.1 使用帮助命令

:help 或 F1 - 显示整个帮助
:help xxx - 显示xxx的帮助,比如:help i, :help CTRL-[(即Ctrl+[的帮助)
:help 'number' - Vim选项的帮助用单引号括起
:help <Esc> - 特殊键的帮助用<>扩起
:help -t - Vim启动参数的帮助用-
:help i_<Esc> - 插入模式下Esc的帮助,某个模式下的帮助用模式_主题的模式

16.2 帮助文件导航

  • 帮助文件中位于 之间的内容是超链接,可以用Ctrl+]进入链接
  • 使用Ctrl+o(或Ctrl+t)返回

十七、特殊字符和转义

17.1 搜索中的特殊字符

在Vim的搜索和替换中,以下字符需要转义:.*[]^%/?~$

例如,要搜索包含.的字符串,需要使用\.

十八、学习资源

18.1 内置教程

  • 在Unix系统上:$ vimtutor
  • 在Windows系统上::help tutor

十九、总结

本教程全面介绍了Vim的基本概念、导航操作、编辑操作、寄存器、文本对象、宏、多窗口和缓冲区、文件操作、高级搜索和替换、范围操作、命令模式高级操作、语法高亮、注释操作、视觉模式以及实用技巧。通过系统学习和不断练习,您将能够充分发挥Vim的强大功能,显著提高文本编辑效率。

记住,Vim的学习曲线虽然陡峭,但掌握它后的回报是巨大的。持续练习和探索,你将发现一个精心配置的Vim可以成为你编程和文本编辑的得力助手。

文档信息

Search

    Table of Contents