简明 vim 入门手册
目标人群:熟悉使用标准文本编辑器的用户;知道常用术语,比如游标;有入门级别的终端操作经验——会安装程序,会运行程序。
安装与启动
我假设你已懂得如何安装,或者说,我假设你接触这篇文章前,电脑中已经有了 vim 可以使用。
启动它,不要急着操作,往下阅读。
工作模式
- Normal 正常模式
- Visual 阅读模式
- Insert 编辑模式、Replace 替换模式
- Command-line 命令行模式
vim 在启动时处在 Normal 模式,这时会有一些功能键可用,也可以跳转到其他模式。
但我们先不讲完整细节,现在先知道有这么四种,足够了。
键位描述
-
x
表示按小写的 X,即X
键 -
X
表示按大写的 X,即SHIFT+X
键 -
<C-x>
表示CTRL+X
键 -
<C-X>
表示CTRL+SHIFT+X
键 -
<n>
表示数字
移动游标
你一定会发现 ←↓↑→
可以移动游标了,但在 Normal 模式下,你可以使用 hjkl
键(一一对应)实现同样的操作,这是给手指不想离开键盘的人准备的甜点。
编辑、保存、退出
在 Normal 模式下,按 i
键进入 Insert 模式,此时你可以编辑了,输入、删除都是惯常的方式。当你编辑结束,按 ESC
键返回 Normal 模式。
拓展一下,你有更多的方式来进入 Insert 模式:
i insert,在光标前插入
I 在行首插入
a append,在光标后插入,相当于右移一次光标
A 在行末插入
s substitute,删除光标所在的字符,再插入
S 删除光标所在行,再插入
o open,在当前行之下新建行,再插入
O 在当前行之上新建行,再插入
但不必要一开始就记住这么多,先记住 i 就够用了。罗列他们主要是告诉你两点:
- vim 大量使用快捷键,通过熟练使用快捷键提高效率
- 快捷键大都是有对应含义的,且大小写不同时效果不同
想保存吗?在 Normal 状态按 :
键,进入 Command-line 模式。尝试以下组合:
:w write,保存
:w [filename] 另存为
:q quit,退出
:wq 保存并退出
:w! 强行保存(如果文件标识为只读也尝试保存,具体能不能成功那就看权限了)
:q! 强行退出(不保存却退出)
在 Command-line 模式,你的命令需要按 <enter>
键执行。
最基本的操作你已经学会了,现在开始使用它吧,试着熟练。
好像我们忘了如何读取文件,那就说两个:
首先,你可以在启动 vim 的时候使用 vim <filename>
来打开某个文件,或者你可以使用 :r [filename]
命令来将文件内容追加到当前行之后。
复制、剪切、粘贴
现在请回到 Normal 模式(按 ESC
),在你欲处理的文本的前后任一端按 v
键进入 Visual 模式。
然后,移动游标,选中你要处理的文本。
y yank,提起。复制选定块到缓冲区,并回到 *Normal* 模式
d delete,删除。剪切选定块到缓冲区,并回到 *Normal* 模式
处理完后,你回到了 Normal 模式,现在可以粘贴了。
p put,放下。把缓冲区的内容粘贴到游标后
P 粘贴到游标前
撤销、重做、重复命令
u undo,撤销
U 撤销当前行最近的所有修改
<C-r> redo,重做
. repeat,重复最后一条命令
<n><command> 重复 <command> n次,n 是数字
查找
-
/pattern<enter>
查找 -
n
查找下一个(next)
打开、另存为、
-
:e <path/to/file>
打开 -
:saveas <path/to/file>
另存为 -
:x
仅在需要时保存,并退出 -
ZZ
保存并退出,不需要输入 <enter>,作用同:wq
你可以打开多个文件,并使用以下命令切换:
-
bn
切换到下一个文件,同:n
-
bp
切换到上一个文件
基本的快捷键 TODO
移动游标的进阶快捷键
行内移动
0 到本行行首
^ 到本行第一个非空字符的位置(非空字符包括:空格、制表符、回车、换行等)
$ 到本行行尾
g_ 到本行最后一个非空字符的位置
行间移动
gg 到第一行
<n>G 到第n行
在 *Command-line* 模式下使用 :<n> 也能实现相同效果
G 到最后一行,相当于 1G,或者 :1<enter>
词间移动
e/w/E/W小写时一个单词是由字母,数字和下划线组成的字符串(可视为词法记号),大写时一个单词是由空格隔开的字符串。
w W word,到下一个单词的开头
e E end,到单词的结尾
如果当前游标不在单词结尾,第一次先跳转到本单词的结尾。
* 匹配当前游标所在单词,移动到下一个
# 匹配当前游标所在单词,移动到上一个
括号匹配
将游标移动到括号 (){}[]
上,按 %
键在开闭括号间跳转。
游标的移动非常有用,因为很多命令支持以下组合:
<start-position><command><end-position>
yw 复制从当前位置到下一单词前的内容
ye 复制从当前位置到本单词尾的内容
y^ 复制从游标前到行首的内容
y$ 复制从游标后到行尾的内容
yG 复制当前行至文件尾的内容
y<n>G 复制当前行至第n行的内容
比如当前行是第四行,则复制第 2-4 行的内容。
y<n>/<pattern> 复制n个<pattern>之间的字符串。
以上组合剪切(d)同样支持
前驱为 <n>
时,为了避免语义问题,有时候并不表示重复。
<n>yG 仍然为复制当前行至第n行的内容
在 Normal 模式下:
-
J
join 合并当前行与下一行,以空格隔开
复制剪切的进阶快捷键
需在 Normal 模式下使用。
yy 复制整行
yny 复制n行,n为数字,也可以是 nyy
dd 剪切整行(dnd、ndd)
x 剪切游标后字符
X 剪切游标前字符
gu 变小写
gU 变大写
花样进入 Visual 模式
-
v
进入普通 Visual 模式,选中若干字符 -
V
进入 Visual Line 模式,选中若干行 -
Ctrl+v
进入 Visual Block 模式,选中一“块”区域
最后
更多的内容,写起来太累了,直接 :h xxx
去看吧。
:h s
:h :command
:h 'option'
:h function()
:h ctrl-x
:h i_ctrl-x
:h subject
:h foo<Tab>
:helpgrep foo
还可以在终端打开教程:
$ vimtutor