# 基础操作
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
标签和窗口 →