Vim 入门及简单使用,包括简单介绍 Vim 模式,移动,和编辑命令。

模式切换 Change between modes

如果你不知道 Vim 的各种模式,可以参考 Vim 模式

Insert -> Normal : ESC/Ctrl-[
Insert -> Command : (Insert -> Normal) -> :

Normal -> Command : :
Normal -> Insert : iIsScCoO
Command -> Normal : Enter

插入模式

i       进入 insert mode,在光标为之前进入插入模式
I       行首非空字符前插入 , I 等同于 `^i`
s       删除光标下字符,并进入 insert mode, 等同于 `cl`
S       删除光标所在一行,并进入 insert mode 行首 , 等同于 `^C`
a       光标之后进入 insert mode
A       光标移动到行尾并进入 insert mode , 等同于 `$a`
o       在光标下一行插入一行,并进入 insert mode , 等同于 `A<CR>`
O       在光标上一行插入新行,并进入 insert mode , O 等同于 `ko`
C       删除光标及光标后到行尾的内容,并进入 insert mode , C 其实等同于 `c$`
cc      删除行,并进入插入模式
gi      进入上一次推出插入模式时位置
ESC     退出插入模式
Ctrl-[  退出插入模式

下面这些命令的一大特征是都会进入插入模式

替换模式

按如下两个按键进入替换模式:

r replace the letter under cursor
R replace under cursor till you press <Esc>

简单移动

简单的移动

    k
    ^
h <   > l
    v
    j

上面显示的 hjkl 都是光标移动上下左右一格,下面的键能够让光标移动句子或者段落

)       向后文移动一个句子,句号分割
(       向前文移动一个句子
}       向后文移动到一个段落,空行分割
{       向前文移动一个段落
<Enter> 移动到下一行首个非空字符
+       同回车
-       移动到上一行首个非空字符

高效移动

在 Vim 中,Word 有两种含义,开始我也没搞明白,过了很久才渐渐明白。广义的 WORD 可以是任何两个空格之间的内容,比如 this is a word ,就是四个大写的 WORD 。侠义的 word ,英文单词、标点符号和非字母字符都被当成一个字。如$、%、^、&、*、(、)、-、+、{、}、[、]、~、|、\、<、>、/等,均被当成是一个字。

举例说明,比如 sub-directory 就是两个 word 但是是一个 WORD 。关于 word 的参考可以见 word ,一般情况下记住大写的 WORD 是空格分割的词就行。

Vim 中使用大写命令一般将字作为广义,小写命令就是作为侠义对待。命令都是成对出现,w 和 W,b 和 B,e 和 E:

w 词向后移动
W WORD is splited by space
b 词向前移动
B WORD 向前移动
e 移下一个单词词末
ge 前一个单词词末
E 如果光标起始位置处于字内(即非字尾处),则该命令将把光标移到本字字尾;如果光标起始位置处于字尾,则该命令将把光标移动到下一个字的字尾。
0 光标移动到行首
^ 光标移动到行首**非空白字符**
$ 光标移动到行尾非空白字符

以下命令可以用来翻页

Ctrl-f  下一页
Ctrl-b  上一页
Ctrl-d  下半页
Ctrl-u  上半页
H       Move to first letter on top of screen
M 		Move to first letter on middle of screen
L 		Move to first letter on bottom of screen

行内移动 move inline

fx  向后查找本行中的字符 x, 比如想要移动到下一个双引号时,可以使用 `f"` 来实现行内快速移动
2fx 向后跳转到 第二个 x 字符,2 可以替换为任意数字
Fx   向前面查找 x
tx  跳转到下一个为 x 的字符前一位
Tx  跳转到上一个为 x 的字符的后一位
;   跳转到下一个 f/t 搜索结果
,   跳转到上一个 f/t 搜索结果
g_  光标移动到行尾,包括空白字符

指定移动

nG      跳转到第 n 行
:n      跳转到第 n 行
10%     跳转到文件 10% 行
10|     跳转到当前行 10 列

复制粘贴 Copy/Paste

p   光标之后粘贴 (p)aste
P   paste before the cursor
yy  复制当前行
y   Yank 复制。Example: yw (yank word) 光标停留到词第一个字母上 yw 复制单词
y0  copy the data from cursor to begining of the line
y$  copy the data from cursor to end of the line

删除 delete

x   删除光标下单个字符,将其放到粘贴板,剪切
X   向前删除一个字符,相当于 Backspace
dd  删除光标所在一行,并把该行复制
dw  删除光标所在词 (d)elete (w)ord
d0  删除光标到该行最前
d^  删除光标到行首非空白字符
d$  删除光标到该行最后
D   相当于 d$
J   删除光标所在行的换行符
Ctrl-w      删除光标前一个单词

剪切 x ,删除 dd ,dw 用的情况还挺多的。

在插入模式下删除

在 Vim 插入模式下可以使用下面的命令来删除字符、单词或者行

Ctrl-h    向前删除一个字符
Ctrl-w 	  先前删除一个单词
Ctrl-u    删除至行首
Ctrl-k    删除至行尾

这 bash 的快捷键一致

撤销 / 重做 redo

u   撤销上一次编辑 undo
Ctrl-r redo

搜索与替换 search replace

/pattern  - 正向搜索,从光标处开始向文件末搜索
?pattern  - 反向搜索,从光标处开始向文件首搜索
n  - 下一个,往下执行搜索命令
N  - 上一个
*  - Word under cursor - forward (bounded)
g* - Word under cursor - forward (unbounded) 不包含单词边界 `\<\>`
#  - Word under cursor - backward (bounded)
g# - Word under cursor - backward (unbounded)
:s/p1/p2/g - 将当前行中所有 p1 均用 p2 替代
:n1, n2s/p1/p2/g - 将第 n1 至 n2 行中所有 p1 均用 p2 替代
:g/p1/s//p2/g - 将文件中所有 p1 均用 p2 替换

Load/Save/Quit/Change File

:e <path/to/file> open file
:w save
:saveas <path/to/file> save to <path/to/file>
:x, ZZ or :wq save and quit (:x only save if necessary)
:q! quit without saving. :qa! to quit even if there are modified hidden buffers
:q! 放弃修改之后可用 :e! 恢复修改 :e! 为放弃为保存的修改

Other

gg     移动光标到文件开头
G      移动光标到文件末尾
Ctrl-O 跳转到上一个位置
Ctrl-T 标签退栈

参考