1
VIM == "编辑器之神"

退出

Command Alias
:q 未修改退出
:q! 强制不保存退出
:x 保存并退出

切换 tab

Command Alias
gt 下个 tab
gT 上个 tab

查找

Command Alias
n 正序查找
/ 后面加内容
f{char} 查找第一个 [char]
; 重复最后一个 f, F, t, T 指令

移动

单词移动

Command Alias
W w 移动到下一个单词开头
E e 移动到下一个单词结尾
B b 倒退到上一个单词开头
* 跳到下个词
# 跳到上个词

整行移动

Command Alias
0 移动到行首
$ 移动到行末
+ 移动到下一行开头
- 移动到上一行开头

根据行号来移动

Command Alias
Ctrl+g 显示当前行信息
nG 转至第n行
G 转至文本末尾
gg 移至文本开头

屏幕

Command Alias
H 屏幕上方
M 屏幕中间
L 屏幕底部

复合命令

Command Alias
C 相当于 c$,从光标所在位置删除到末尾
s 相当于 cl,删除光标所在位置字符并进入插入模式
S 相当于 cc
A 在一行的结尾处追加
I 在一行的开头处插入
o 在光标所在位置的下一行打开新行插入
O 在光标所在位置的上一行打开新行插入

tips1:10I*先输入10,然后输入i,接着输入*号,最后按

    这样就可以在一行开头输入十个*
    2012122112240283
    
tips2:同样,5o###先输入5,然后输入o,接着输入###,最后按

    这样就可以在下列5行中每一行开头插入###
    2012122112273084

插入

字符位置插入

Command Alias
i 在光标之前插入
a 在光标之后追加

删除

字符删除

Command Alias
x 删除光标所在处字符
X 删除光标所在前字符

单词删除

Command Alias
dw 删除到下一个单词开头
de 删除到本单词末尾
dE 删除到本单词末尾包括标点在内
db 删除到前一个单词
dB 删除到前一个单词包括标点在内
dt) 删除到)之前所有内容
df) 删除光标包括)所有内容
dT) 删除光标到光标前)所有内容
dF) 删除光标到光标前包括)所有内容

行删除

Command Alias
dd 删除一整行
3dd 删除三整行
D d$ 删除光标位置到本行结尾
d0 删除光标位置到本行开头

标点内删除

Command Alias
ci( 更改配对标点符号中的文本内容
di[ 删除配对标点符号中的文本内容
yi{ 复制配对标点符号中的文本内容
vi< 选择配对标点符号中的文本内容

带标点删除

Command Alias
ca( 更改配对标点符号中的文本内容和标点
da[ 删除配对标点符号中的文本内容和标点
ya{ 复制配对标点符号中的文本内容和标点
va< 选择配对标点符号中的文本内容和标点

复制

行复制

Command Alias
y^ 复制至行首
y$ 复制至行尾
yy 复制整行
yH 从当前行复制到屏幕顶端
yL 从当前行复制到屏幕低端

单词和字符复制

Command Alias
ynl 向右复制n个字符
ynh 向左复制n个字符
ynw 向前复制n个单词
ynb 向后复制n个单词
yiw 复制一个单词
diw 剪切一个单词

修改

字符替换

Command Alias
r 单个字符替换
R 连续替换
~ 更改大小写

单词修改

Command Alias
cw 从光标处修改到单词结尾
cb 从光标处修改到单词开头
ciw 改写整个单词

行修改

Command Alias
c$ 从光标修改到本行末尾
C 功能同上
c0 从光标修改到本行开头
cc 删除整行从头修改
S 功能同上
s 删除光标所在位置的字符,然后插入

运算

Command Alias
对数字加操作
对数字减操作
{count} 加上 [count]

如果当前光标不在数字上,则正向查找第一个数字

合并行

多行合并成一行

AAAAA
BBBBB
CCCCC

合并为:
AAAAA BBBBB CCCCC

方法1: normal状态下 3J 其中的3是范围,可以是书签或者搜索位置等方式实现,J为合并
注: 如果改为3gJ的话,则合并时各行没有空白AAAAABBBBBCCCCC, 下面方法类似,不再重复这两种合并方式的区别.

方法2: 命令状态下 :1,3 join 或 :1,3 j

方法3: 传统一点的,替换换行符的方式,为避免最后一行也被换掉,范围缩小了,命令状态下 :1,2s/\n/ /

隔行合并

AAAAA
BBBBB
CCCCC
DDDDD
合并为:

AAAAA BBBBB
CCCCC DDDDD
方法1: 借用一下宏录制功能, normal状态下 qaJjq 实现录制, 然后在合适的区域重复执行n遍,这里2遍即可,normal状态下2@a

方法2: 命令状态下 :1,4g/^/ join 增加了g过滤后,合并变成了隔行处理】

替换

Command Alias
:s/old/new/ 替换当前行第一个 old 为 new
:s/old/new/g 替换当前行所有 old 为 new
:n,$s/old/new/ 替换第 n 行开始到最后一行中每一行的第一个 old 为 new
:n,$s/old/new/g 替换第 n 行开始到最后一行中每一行所有 old 为 new
:%s/old/new/ 替换每一行的第一个 old 为 new
:%s/old/new/g 替换每一行中所有 old 为 new

恢复

Command Alias
u 撤消上次命令
U 恢复整行
ctrl+r 重做
. 重复
e! 全文恢复

多窗口打开

Command Alias
:vs file 在新的垂直分屏中打开文件
:sv file 在新的水平分屏中打开文件

Pattern 操作

Command Example Description
/{pattern}[/] /hello 向前查找第一次出现 hello 的位置
/{pattern}/{offset} /hello/2 向前查找第一次出现 hello 的位置,并向下移动两行
/ / 使用上次的模式,向前查找
//{offset} //3 使用上次的模式,偏移值为3,偏移值为空和/功能一致
?{pattern}[?] ?hello 向后查找第一次出现 hello 的位置
?{pattern}?{offset} ?hello?2 向后查找第一次出现 hello 的位置,并向下移动两行
? ? 使用上次的模式,向后查找
??{offset} ??3 使用上次的模式,偏移值为3,偏移值为空和/功能一致
n n 向前查找
N N 向后查找
* * 向前查找距离光标最近的单词
# # 向后查找距离光标最近的单词
gd gd 跳转至局部变量声明的位置
gD gD 跳转至全局变量声明的位置

使用宏

  • normal 模式下按下 qa 开始录制宏,a 就是该宏的,可以是任意字符
  • 和正常使用 vim 一样,记录下需要的操作
  • 操作完成后再次按下 q 结束录制
  • @a:当前行使用该宏,3@a:重复使用三次该宏,@@:对上次宏的重复使用