简介
vi 是一种命令行的文本编辑器,vim 是进阶版的 vi,gvim是vim的图形化版本。
Vim有几种基本的工作模式:
- 一般模式(Normal Mode, 命令模式,普通模式)
一般模式是vim默认的模式,当打开一个文件时会自动进入此模式。
在此模式下,可以执行移动光标、滚动屏幕、删除字符、删除整行、复制、粘贴等操作。
- 编辑模式(Insert Mode, 输入模式、插入模式)
在普通模式下键入i 、a 、 o等就可以进入编辑模式,可以对文件进行编辑。
- 命令行模式(Command-Line, 底行模式)
在普通模式下,先输入冒号:,然后输入命令,最后按回车即可执行该命令。
- 可视模式(Visual Mode)
在普通模式下键入v、V、ctrl+v等可以进入可视模式,然后可以通过移动光标选中所需要的文本。
此模式常用于完成文本的复制、粘贴、删除等操作。
- EX模式
类似于命令行模式,可以一次运行多个命令。
这种模式个人还没有用过
模式切换图解
一般模式(Normal Mode, 命令模式,普通模式)
光标移动
上下左右
←h j↓ k↑ l→ 上、下、左、右
单词移动
w/W 移动到下一单词的开头
b/B 移动到上一单词的开头
e/E 移动到光标所在单词的末尾
ge 将光标移动到上一个单词的词末
nw 指定移动的次数
注:W、B、E命令操作的单词是以空白字符(空格、Tab)分隔的字串
比如字符串“str1-str2 str3-str4”,对W、B、E命令来说是两个单词,而对w、b、e命令来说则是四个单词
行级移动
nj/n+ 光标向下移动n行
nk/n- 光标向上移动n行
nh 光标向左移动n列
nk 光标向右移动1列/n列
0 移动光标到当前行行首
$ 移动光标到当前行行尾
^ 移动光标到当前行的第一个非空字符
ngg/nG 光标移至第n行的行首
:n 移动光标到当前文件的第n行
n| 把光标移到第n列上
fx 将光标移动到当前行的第一个字符x上
3fx 将光标移动到当前行的第3个字符x上
tx 将光标移动到目标字符x的前一个字符上
fx和tx可以通过;和,进行重复移动,一个是正向重复,一个是反向重复
文本块移动
( 移到当前句子的开头
) 移到下一个句子的开头
{ 移到当前段落的开头
} 移到当前段落的末尾
[[ 移到当前这一节的开头
]] 移到下一节的开头
屏幕级移动
zt 将当前行的位置变成屏幕顶端
zz 将当前行的位置变成屏幕中部
zb 将当前行的位置变成屏幕底部
H 把光标移到屏幕最顶端一行
M 把光标移到屏幕中间一行
L 把光标移到屏幕最底端一行
nH 移到屏幕倒数第n行
nL 移到屏幕第n行
g0 移动到当前屏幕行行首
g$ 移动到当前屏幕行行尾
g^ 移动到当前屏幕行第一个非空字符处
Ctrl + f 向下翻页
Ctrl + b 向上翻页
Ctrl + u 向前滚动半页
Ctrl + d 向后滚动半页
ctrl+e 向下滚动一行
ctrl+y 向上滚动一行
gg 移动到文件头部
G 移动到文件尾部
:$ 移动到最后一行
x% 移动到某一位置( 如要移动到文件中间,就使用50%)
标记
m{a-z} 设定当前光标位置为标记,其中,{a-z}表示任意一个小写字母;局部标记,只用于本次编辑。
m{A-Z} 全局标记。退出Vim, 重新启动,标记仍然有效。
`{a-z} 跳转到标记位置。其中,{a-z}表示之前设定的标记的字母。
到达标记后,可以用Ctrl+o返回原来的位置。
{a-z} 移动到标记行的行首
`{0-9} 回到上[2-10]次关闭vim时最后离开的位置。
. 移动到最近编辑的位置
∧ 移动到最近插入的位置
' 移动到上一次跳转前的位置
" 移动到上一次退出文件时的位置
[ 移动到上一次修改的开始处
] 移动到上一次修改的结尾处
:marks 显示所有标记。
:delmarks a b 删除标记a和b
:delmarks a-c 删除标记a、b和c
:delmarks a c-f 删除标记a、c、d、e、f。
:delmarks! 删除当前缓冲区的所有标记。
:help mark-motions 查看帮助
实例:
mx,my,mz设置三个标记
`x,`y,`z分别跳转到这三个标记
复制剪切粘贴
yy 复制整行(nyy或者yny ,复制n行,n为数字);
y^ 复制当前到行头的内容;
y$ 复制当前到行尾的内容;
yw 复制一个word (nyw或者ynw,复制n个word,n为数字);
yG 复制至档尾(nyG或者ynG,复制到第n行,例如1yG或者y1G,复制到档尾)
d 剪切选定块到缓冲区;
dd 剪切整行
d^ 剪切至行首
d$ 剪切至行尾
dw 剪切一个word
dG 剪切至档尾
p 小写p代表粘贴到光标所在行下面
P 大写P代表粘贴到光标所在行上面
删除
x/d1 删除光标所在的字符
X/dh 删除光标左边的字符
D 删除至行尾(包括光标所在的字符)
dd 删除光标所在的行,也是剪切
ndd 向下删除n行
dw 删除一个单词(从光标处到空格)
daw 无论光标在什么位置,删除光标所在的整个单词(包括空白字符)
diw 删除整个单词文本,但是保留空格字符不删除
d2w 删除从当前光标开始处的2个单词
d$ 删除从光标到一行末尾的整个文本
d0 删除从光标到一行开头的所有单词
dgg 删除从光标到文本开头
dG 删除从光标到文本结尾
J 删除一个分行符,将当前行与下一行合并
修改和替换
~ 修改光标下字符的大小写
xp 交换光标和下一个字符
r 替换当前光标下的字符
R 进入到替换模式,连续取代,直到按下ESC
撤销操作
u 撤销上一步的操作
Ctrl+r 恢复上一步被撤销的操作
重复命令
. 重复上一个命令(不会重复撤销命令)
退出
ZZ 保存退出
ZQ 不保存退出
文件跳转
移动光标到文件路径上,然后键入gf,可以跳转到该文件。
键入ctrl+F6可以再跳转回原文件。
进入编辑模式
下面的命令都可以进入编辑模式,区别是在不同位置编辑:
i 在当前光标的前面插入字符
a 在当前光标的后面追加字符
o 在当前光标的下一行行首插入字符
I 在一行的开头添加文本
A 在一行的结尾处添加文本
O 在光标当前行的上一行插入文本
s 删除当前光标处的字符并进入到插入模式
S 删除光标所在处的行,并进入到插入模式
cw 删除从光标处到单词结尾的文本并进入编辑模式
cb 删除从光标处到单词开头的文本并进入编辑模式
cc 删除一整行并进入到插入模式
进入可视化模式
v 字符选择,会将光标经过的地方反白选择
V 行选择,通过上下移动光标可以选中多行
也可以通过行级光标移动操作选择多行,如通过ngg 从当前行选中到n行
Ctrl+v 矩形区域选择
o 让光标置于被选中文本的另一头,这样就可以通过控制光标移动来决定被选文本将从何处开始,再按“o”又会让光标置于被选文本的末端。
O 当进行矩形文本块内容的选择时,有4个角都可以改变。“o”只会把光标带到对角的位置去,使用“O”命令可以让光标在同一行的左右两个角之间移动。
编辑模式(Insert Mode, 输入模式、插入模式)
ctrl+n (ctrl+p),显示历史输入过的代码,可以自动补全;
命令行模式(Command-Line, 底行模式)
退出
:q 退出
:q! 强制退出,丢弃做出的修改
:wq 保存退出
:x 保存退出
:e! 命令放弃所有修改并重新载入该文件的原始内容
查找
/string 正向查找
?string 反向查找
替换
:s/old/new 将当前行的第一个字符串old替换为new
:s/old/new/g 将当前行的所有字符串old替换为new
:90s/old/new/g 将指定行的所有字符串old替换为new
:90,93s/old/new/g 将指定范围的行的所有字符串old替换为new
:%s/old/new/g 将文本中所有的字符串old替换为new
:%s/old/new/gc 依次替换每个字符串关键字
:%s/^struct/int/g 将所有以struct开头的字符串替换为int
可视模式(Visual Mode)
可视模式是选中一块区域进行操作,包括删除,替换,复制,粘贴,改变大小写等。
进入可视化模式:
v 字符选择,会将光标经过的地方反白选择
V 行选择,通过上下移动光标可以选中多行
也可以通过行级光标移动操作选择多行,如通过ngg 从当前行选中到n行
Ctrl+v 矩形区域选择
o 让光标置于被选中文本的另一头,这样就可以通过控制光标移动来决定被选文本将从何处开始,再按“o”又会让光标置于被选文本的末端。
O 当进行矩形文本块内容的选择时,有4个角都可以改变。“o”只会把光标带到对角的位置去,使用“O”命令可以让光标在同一行的左右两个角之间移动。
操作:
d 删除/剪切反白区域
D 删除反白区域经过的行
y 复制反白区域
p 将复制的反白区块,在光标所在处粘贴
多列插入 选中多列后键入shift+i,编辑,最后键入ESC
多列替换 选中多列后键入s,编辑,最后键入ESC
u 将反白部分的字符全部改为小写
U 将反白部分的字符全部改为大写
> 将选中部分右移一个 tab 键规定的长度
< 将选中部分左移一个 tab 键规定的长度
VIM与系统剪贴板的复制粘贴
在同一个vim文件内部进行复制和粘贴命令分别是y和p;
如果要复制外部数据到vim中或者将vim中的数据复制到外部,这两个命令就无效了。
除了使用鼠标外,还可以使用下面的命令:
向外复制: 先通过visual模式选中内容,然后执行 "+y将vim数据复制到系统剪贴板,在vim外执行Ctrl v即可完成数据粘贴。
从外粘贴:在normal模式下执行"*p(不是命令行模式,直接按这三个键就行)
可以在vimrc中设置快捷键:
vnoremap <C-y> "+y "支持在Visual模式下,通过Ctrl+y复制到系统剪切板
nnoremap <C-p> "*p "支持在normal模式下,通过Ctrl+p粘贴系统剪切板
注意Ctrl y和Ctrl p在 vim 中有特殊含义,使用以上设置后会覆盖默认设置。