# 基础操作
Vim (opens new window) 是一个拥有代码补完、编译及错误跳转等方便编程的功能的文本编辑器,在程序员中被广泛使用。
也有一些 GUI 版的 Vim,如 MacVim、gVim 等。
# 插入文本
在终端输入 vim
进入编辑界面,默认会处于一般模式(Normal)。
如果你要在其中输入文字,你需要先进入 Insert 模式。进入方式包括:
i # 在游标处
I # 在当前行首
a # 在游标的后一个文字处
A # 在当前行尾
o # 在下面新开一行
O # 在上面新开一行
如果你想回到 Normal 模式,只需要按下 Esc
键即可,另外 Ctrl + [
也具备同样的效果。
如果需要保存修改,需要进入 Normal 模式,然后使用 :w
进行保存。
如果你想保存后直接退出,可以在 Normal 模式下使用 :wq
进行保存。
如果你没有做任何修改,想要退出的话,可以在 Normal 模式下使用 :q
退出。
如果你想放弃当前编辑的内容,可以在 Normal 模式下使用 :q!
强制退出。
或者,你只是想暂时退出编辑界面,那么可以使用 Ctrl + z
快捷键,让 Vim 运行在后台,当你想再次唤起的时候,只需要运行 fg
命令。
# 移动游标
在 Vim 中通过 h
(左)、j
(下)、k
(上)、l
(右) 键来移动游标。
更快的,还可以使用 w
一次移动一个单词。不过,有个小问题是它会停留在逗号、分号等地方。如果你想直接跳过这些,保持跳到下个单词前则可以使用 W
。
对应的,如果你想往前跳转一个单词的话可以使用 b
和 B
。
更快的,如果你想快速到达行首可以按下 0
或者 ^
,跳到行尾则可以按下 $
。
更快的,你还可以使用 }
来向下一次跳一个段落,反向的则可以使用 {
。
最快的,可以使用 gg
跳到页面顶部,使用 G
跳到页面底部。
# 在文件中搜索
按下 /
键输入需要搜索的关键字后,再 Enter
确认输入则可以进行搜索。
然后按下 n
可以跳到下一个匹配项,反向的则可以按下 N
。
你也可以使用 ?
代替 /
,然后按下 n
可以跳到上一个匹配项,反向的则可以按下 N
。
如果想要直接搜索游标所在的单词,则可以直接输入 *
。跳转规则同 /
。
输入 #
和输入 *
的效果很类似,只是跳转规则同 ?
。
另外,按下 f
后再按下一个字,游标会跳转到后面和这个字的第一个匹配处,往前搜索则是使用 F
。
# 选取、复制、粘贴
使用 yy
可以复制当前行,复制多行则可以在前面加上量词。比如复制两行:2yy
。
使用 y$
可以复制游标到行尾,相反的,y^
或 y0
可以复制到行首。
更多的,使用 yG
可以复制到文档底部,ygg
复制到文档顶部。
通常,我们会使用 p
进行粘贴,结果会粘贴到游标所在的后一个字节处,P
则是向前粘贴。整行的大段复制会直接粘贴在下一行,P
则是在上一行。
其实,复制的内容都被放到了暂存器(register)中。共 48 个,其中 26(即字母表) 个供自由使用。
比如,把复制的内容放到 a
暂存器中,即可使用 "ay
,粘贴的时候使用 "ap
。
整个编辑过程中,可以使用 u
进行撤销,使用 Ctrl + r
反撤销。
# 编辑文字
使用 x
可以往后按个删除,X
则相反。
在 Virtual 模式下选中后,按 x
也可以直接删除。
如果你想删除一行的话,可以直接使用 dd
。和复制的量词类似,你也可以使用 2dd
, dgg
, dG
等。
与 x
类似的还有 c
,它在删除后直接进入输入模式(不支持量词)。X
可以删除游标以后的内容,并进入输入模式。
另外,使用 r
还可以直接进行替换游标所在的内容。
如果你想对行进项缩进处理的话,可以使用 <<
或 >>
。当你选中内容时,只需要按单个的大小符号即可。
对于选中的内容按下 =
可以对内容进行智能的格式化操作。
# 编辑多个文件
在 Vim 下,可以通过 :e <filename>
打开新的文件。
如果 :tabe <filename>
则会新建一个 tab
来打开该文件。
在多个标签模式下,可以使用 gt
移动到下一个标签页面,gT
则是反向的切换。
除了标签之外,使用 :new
可以打开一个水平分割新的窗格,然后使用 Ctrl + w + hjkl
可以沿指定方向切换,而使用 Ctrl + w + w
则是在几个窗格之间循环切换。
当然,也可以使用 vnew
来新开一个垂直分割的新窗格。
其实,在终端打开文档时就可以以多窗格的方式打开多个文件,比如以水平分割窗格打开 a.txt
和 b.txt
:vim -o a.txt b.txt
。换做 O
则是垂直分割。
如果,把 o
换做 p
的话,则是以标签的方式打开。比如以标签的形式打开所有的 .txt
文件内:vim -p *.txt
。
如果在打开多个文件时没有指定 o
或 p
这样的参数时,打开后只能看到第一个文件。想要看到所有的文件可以使用 :ls
。
你可以使用 :b<n>
来打开指定的 buffer
。切换一次后再次显示所有的 buffer,会发现之前的 buffer 前面对了一个 # 号,你可以使用 Ctrl + ^
进行循环切换。
如果期间你知道文件名的话,也可以使用 :b<filename>
来打开指定其中的 buffer。
更快的还可以使用 :bn
(下一个) :bp
(上一个) :bf
(第一个) :bl
(最后一个):bd
(关闭当前 buffer)。
# 选取方式
使用 V
可以进入 Visual Onlie 模式,此时你可以通过 jk
来进行(多)整行的选取。
使用 Ctrl + v
可以进行 Visual Block 模式,你可以使用 hjkl
来进行指定区域的选择,或者常用的多行编辑。
如果我们想要选取游标所在的单词,可以使用 vw
进行选取。遗憾的是,通常它会往后多选一个。这和 va<symbol>
很相似,好在你还可以选择 vi<symbol>
来进行选取。
不仅是选取,你还可以使用 d
或 c
来进行组合,比如删除游标所在的单词:diw
,或则更多你需要的组合:di<symbol>
。
在操作 HTML 时,还可以使用 vit
,它会选在游标所在最近的一组 HTML 标签内容内容。
如果使用的是 vat
,结果中还会包含两边的标签。
# Text Object
动词:
- v 选取
- y 复制
- d 剪切
- c 删除
名词:
- w(word):单词
- s(sentence):句子
- p(paragraph):段落
- t(tag):标签
- 单双引号、大中小括号等
范围:
- i(inner)
- a(around)
量词:数字等
# 其它技巧
- 按下
0
或者^
会回到行首,前者是真正的回到首部。如果行首是空格,后者会停在空格后面。 - 如果想要快速的翻到下一页,可以使用
Ctrl + f
。反之,则是使用Ctrl + b
。 - 如果想要把一部分进行折叠的话,可以选中后使用
zf
,展开则是zd
。借助 Text Object 不一定要先选取,比如zfip
会折叠当前所在段落。 - 使用
~
可以进行大小写互换。 - 使用
.
可以重复的做上一个动作。 - 如果想要合并两行可以使用
J
,它会把下一行提到当前行的后面。也可以选中多行进行一次性的合并。 - 在 Insert 模式下,可以使用
Ctrl + w
向前删除一个单词,使用Ctrl + u
则可以清除游标前的所有内容。这在终端同样可用。 - 使用
:! <command>
可以指定终端的命令,确认结果后会自动回到 Vim。使用:r !<command>
还可以把命令输出的结果自动粘贴到游标处。 - 在终端输入
vimtutor zh_tw
可以进入自带的引导文档。 - 使用
:h <key_word>
可以查看相关的帮助文档。
# Tips
- 使用
:w
进行保存时,你还可以在后面添加空格加文件名来创建新的文件。 - 当一行特别长时,可能会被编辑器换行显示,当你上下移动时可能会感到奇怪,因为它不会在由于显示“产生的行”上面停留,看起来就像是一下移动了多行。为此,你需要使用一个前缀
g
,比如gj
来进行移动。 - 按下
zt
可以将画面向上提升,zz
则是提升到中间,反向的则是zb
。 - 使用
:reg
可以检索目前暂存器中的所有内容。 - 关闭或保存时,在后面加上
a
则表示对多个标签/窗格页面的操作。比如关闭当前所有:qa
。 - 在 Mac 下,可以将
Capslock
键改为Ctrl
键
# 命令
- 高亮搜索关键字:
set hlsearch
- 系统复制粘贴和 Vim 共享:
set clipboard unnamed
- 设置缩进的大小:
set shiftwidth=2
- 打开行号:
set number
标签和窗口 →