普通(normal
)模式下的常用命令
一般命令:
- 进入插入模式:
i
在当前光标位置进行插入,a
在当前光标位置后面进行插入; - 移动行:
:1 move 2
将第一行移动到第二行,:.,.+2 move $
将当前行到它的下两行移动至文件末尾处; - 删除:
dl
删除一个字符,dw
删除一个单词,dd
删除一行; - 撤销:
u
; - 重做:
ctrl + r
; - 保存:
:w
; - 退出:
:q
。
文件内跳转:
- 输入
-
跳回之前光标停留的位置; - 输入
G
直接跳到文件末尾; - 输入
gg
直接跳到文件开头; - 输入
:12
直接跳到第12行。
查找匹配:
- 输入
/
,然后输入正则表达式后回车进行匹配,必要时(例如正则表达式的保留字符.
*
/
)需要使用\
前缀进行转义; - 直接输入
/
然后按回车,会以上一次使用的正则表达式为准进行匹配。
查找替换:
- 输入
:s/aaa/bbb/
,将当前行的第一个aaa替换为bbb; - 输入
:s/aaa/bbb/g
,将当前行的所有aaa替换为bbb; - 输入
:%s/aaa/bbb/
,将每一行的第一个aaa替换为bbb; - 输入
:%s/aaa/bbb/g
,将每一行的所有aaa替换为bbb; - 输入
:.,$s/aaa/bbb/
,从当前行到文件末尾,将第一个aaa替换为bbb; - 输入
:1,2s/aaa/bbb/
,从第一行到第二行,将第一个aaa替换为bbb; - 如果要查找或者替换的内容含有
/
可以更换查找替换的定界符,例如可替换为%
::s%aaa%bbb%
。
恢复使用tab字符进行缩进:
- 假设已经配置了一个tab字符扩展为4个空格,但某些格式的文件一定要使用tab字符进行缩进(例如
Makefile
),在你编写完成后该文件后; - 输入
:set ts=4
,即:set tabstop=4
,让一行开头的4个空格被识别为一个tab字符; - 输入
:set noet
,即:set noexpandtab
,让Vim不对tab字符扩展为空格; - 输入
:%retab!
,让每一行都强制重新输入开头的tab字符。
编码切换:
:!chardetect %
,可以显示对文件编码的探测;- 假设你原本有一个
GBK
编码的文件,又假设要将其保存为UTF-8
编码,则输入:set fileencoding=utf-8
,然后输入:w
进行保存; - 假设有某个文件有混合编码方式的内容,例如既有
GBK
又有UTF-8
,而Vim将文件探测判断为UTF-8
,当你想正确显示GBK
的内容时,则输入:set encoding=gbk
。这种方式只会使用不同的编码方式读取Vim缓冲区的内容以便重新显示,不会对缓冲区或者文件内容有任何改动。
可视(visual
)模式下的常用命令
在普通模式下输入v
可进入可视模式,在可视模式下输入esc
可退回普通模式。
进入可视模式后,可通过上下左右移动选中你要的内容。选中内容后,可输入一系列命令对选中内容进行编辑。
复制粘贴:
- 选中内容后,输入
y
进行复制; - 将光标移动至你要粘贴内容的地方;
- 输入
p
进行粘贴。
行首批量插入内容(例如输入//
注释代码):
- 选中内容后,输入
ctrl + v
进入可视块
模式; - 输入大写
I
进入选中范围内首行插入模式,输入要插入到行首的内容,例如//
; - 连续输入两个
esc
,让选中的块的行首都插入该内容。
行首批量删除内容(例如反注释//
代码):
- 输入
ctrl + v
进入可视块
模式; - 用方向键将行首要删除的内容当作一整块选中,例如每一行的
//
; - 输入
d
删除该选中的块,即选中的所有行首内容。
插入(insert
)模式下的常用命令
关键字补全:
ctrl + n
从当前位置向后搜索关键字并显示补全列表;ctrl + p
从当前位置向前搜索关键字并显示补全列表。
文件末尾新行的问题
在Vim默认的文本编辑模式中,是无论如何都会在文件末尾添加一个新的换行符\n
。这一般无伤大雅,而且十分便于文本合并。但是对于一些IDE的代码编辑器来说,是没有这种设定的,例如VS Code。如果在VS Code创建的文件,没有人手添加文件末尾的换行符,然后代码通过Git提交了,然后不知道哪天使用了Vim打开过这份文件,这便会导致文件末尾多出一个换行符,而Git则认为代码有改动。为了避免这种问题,可以在Vim里面将文件末尾的换行符删除:
- vim打开文件,进入普通模式;
:set binary
,进入二进制模式;:set noeol
,删除文件末尾的换行符;:wq
,保存、退出。
……未完待续 To Be Continued
打赏作者由 bruce 于 2018-01-11 22:37 更新