本文根据使用经验,会持续更新。
一般模式:normal模式。可以移动光标,删除字符或整行,也可复制、粘贴文件数据。打开vim就是进入这个模式,3个模式的切换也是在这里中转。
编辑模式:一般模式下按下
i
I
o
O
a
A
r
R
s
S
任何一个进入该模式。可以编辑文件内容,按Esc回到一般模式。
i
I
是insert(在光标所在字符前和行首)
o
O
是open新行(在光标所在行的下面另起一新行和在光标所在行的上面另起一行开始插入
a
A
是append(在在光标所在字符后和在光标所在你行的行尾)
s
S
是删除(光标所在的字符并开始插入和光标所在行并开始插入),即substitute替换。
r
R
是replace光标所在的字符和变成替换模式
命令行模式:一般模式下按下
:
/
?
任何一个进入该模式(下文会介绍这些符号的含义)。可以查找数据操作,读取、保存、大量替换字符、离开vim、显示行号等操作,按Esc回到一般模式。
可视模式:一般模式下按下
v
V
ctr+v
进入可视模式,相当于高亮选取文本后的普通模式,即在该模式下进行任意选择特定区域且被选择的区域高亮显示,
v
选择单位:一个字符;
V
又称为可视行模式,选择单位:行;
ctr+v
又称为可视块模式,选择的单位:方块;这三者都有用,详细看下文。
w
→ 到下一个单词的开头
e
→ 到下一个单词的结尾 (单词默认是以空格分隔的)
W
→ 到下一个字符串的开头
E
→ 到下一个字符串的结尾 (字符串指的是数字、字母、下划线组成的字符串)
B
→ 到前一个字符串的首字符上
b
→ “命令则将光标移动到前一个word的首字符上。
默认上来说,一个单词由字母,数字和下划线组成
如果你认为单词是由blank字符分隔符,那么你需要使用大写的E和W(陈皓: 注)
0
→ 数字零,到行头
^
→ 到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等)
$
→ 到本行行尾
g_
→ 到本行最后一个不是blank字符的位置
%
→ 到光标所在这对括号的另外一个
gg
→ 首行
G
→ 最后一行
h
j
k
l
(强例推荐使用其移动光标,但不必需) →你也可以使用光标键 (←↓↑→). 注: j 向下伸,k是向上伸
w
and
b
、
W
and
B
(或者如果本行太长可用下文的搜索功能)到目的单词
^
%
ctrl+w+(h or j or k or l)
(h、j、k、l)
d$
删除到开头:
d^
mx
meaning: mark x, x is the name of mark;
'x
meaning: go to the position of x mark
gd
意思: go to definition
[
再按
ctrl+d
跳转到#define处
[
再按
ctrl+i
跳转到函数、变量和#define
注意 :语言支持不太良好, 大家可以试试所用的语言
ctr + d
page down
ctr + u
page up
ctr + f
page forward
ctr + b
page back
d
d
elete a character and copy to clipboard
D
从光标所在位置一直
删除
到行尾
y
c
opy to clipboard
Y
复制
一行(=
yy
)
s
s
ubstitue a character
S
替换
光标所在行
r
r
eplace a character
R
不常用
,表示进入替换模式
c
c
hange a character
C
不常用
,表示
修改
光标所在位置一直到行尾,与
S
呈现效果一样
p
p
aste after the cursor
P
黏贴
在光标位置之前(如果是黏贴一整行,则黏贴到上一行)
u
u
ndo a operation
U
一次性
撤销
对一整行的所有操作
x
cut a character
X
不常用
, 向左
剪切
,即退格:删除光标的左边那个字符
*
向下搜索当前光标所在的单词
,找到就跳到下一个单词
#
向上搜索当前光标所在的单词
,找到就跳到上一个单词
/word
向下全文搜索单词word
,跳到匹配的第一个单词,如果多个,继续向下查找按n键(顺着命令本来方向),向上找按N键。
?word
向上全文搜索单词word
,跳到匹配的第一个单词,如果多个,继续向上查找按n键(顺着命令本来方向),向下找按N键。
a
a
ppend after the cursor
A
是
附加
在光标所在行的行尾)
i
i
nsert before the cursor
I
插入
在光标所在行的行首
o
在光标所在行的下面另起一新行,open the new world?
O
在光标所在行的上面另起一行开始插入
v
进入
v
isual模式,用来选择区域(可跨行),用来配合后续的其他操作(增删改查)
v
进入visual行模式,用来选择一些行,用来配合后续的其他操作(增删改查)
f
f
ind a character after the cursor
F
向光标位置之前
查找一个字符
t
t
ill a character tx和fx相同,区别是跳到字符x前
T
Tx 和Fx相同,区别是跳到字符x后
=
自动格式化
==
(连按=两次), 或对多行用
n==
(n是自然数)表示自动缩进从当前行起的下面n行
=
进行格式化,相当于一般IDE里的code format。
gg=G
可对整篇代码进行排版。
u
undo撤销上一步的操作,命令可以组合,例如
Nu
N是任意一个整数,表示撤销N步操作,以下类同。
U
恢复当前行(即一次撤销对当前行的全部操作)
ctr+r
control+redo 恢复上一步被撤销的操作
CTRL-R
回退前一个命令
normal 模式下输入替换命令:
:[range]s/pattern/string/[flags]
:10,20s/from/to/g
对第10行到第20行的内容进行替换。
:1,$s/from/to/g
对第一行到最后一行的内容进行替换(即全部文本)
:1,.s/from/to/g
对第一行到当前行的内容进行替换。
:.,$s/from/to/g
对当前行到最后一行的内容进行替换。
:'a,'bs/from/to/g
对标记a和b之间的行(含a和b所在的行)进行替换,其中a和b是之前用m命令所做的标记。
替换所有行的内容:
:%s/from/to/g
注:N是数字
Nyy
从当前行算起向下拷贝N行、
Ndd
从当前行算起向下删除N行、
Ngg
跳到第N行、
dNw
删除从当前光标开始到第N个单词前(不包含空白,即删除N-1个单词)、
yNe
拷贝从当前光标到第N个单词末尾(注意:
yy
=
1yy
dd
=
1dd
)、
d$
删除到本行末尾
N.
(N表示重复的次数)
normal模式下:
[ctr + ] v + (h or j or k or l)
[ctr + ] v
选中某些行的行头之后 再按
=
效果:
代码格式自动调整
[ctr + ] v
选中某些行的行头之后 再按
I
再按注释的符号(比如:
//
)最后按
ESC
效果:选中的这些行全部注释了
多行快速注释
[ctr + ] v
选中某些行的行头之后 再按
A
再按注释的内容 最后按
ESC
(比如:
//这是测试代码
) 效果:选中的这些行的行尾全部注释上
//这是测试代码
多行快速注释
[ctr + ] v
选中某些行的行头的注释(比如:
//
)之后 再按
d
最后按
ESC
效果:选中的这些行全部注释删除了
多行快速删除注释
[ctr + ] v
选中某些区块之后,再按上文动作的按键实现区域操作
动作 + 移动 [+重复次数]
前面已经已经大量使用组合,这里继续:
ctrl+w
在按
+
或
-
或
=
,当然在按
+
或
-
或
=
之前先按一个数字,改变窗口高度,
=
是均分的意思。。
:resize -N
或
:resize +N
明确指定窗口减少或增加N行
ctrl+w
在按
<
或
>
或
=
,当然在按
<
或
>
或
=
之前先按一个数字,改变窗口宽度,
=
是均分的意思。
ctrl+w
+
T
移动当前窗口至新的标签页。
vim 从 vim7 开始加入了多标签切换的功能, 相当于多窗口. 之前的版本虽然也有多文件编辑功能, 但是总之不如这个方便啦。 用法normal模式下:
:tabnew
[++opt选项] [+cmd] 文件 建立对指定文件新的tab
:tabc
关闭当前的tab or
:q
:tabo
关闭
其他
的tab
:tabs
查看
所有打开
的tab
:tabp
前一个previous tab window
:tabn
后一个next tab window
gt
,
gT
可以直接在tab之间切换。 还有很多他命令, :help table 吧。
:Te
以tab窗口形式显示当前目录 然后可进行切换目录、打开某个文件
:!ls
这种是vim调用shell命令的方式
:!ls + shell_command
,但不是以tab窗口的形式显示当前目录。
ci'
ci"
ci(
ci[
ci{
ci<
分别change这些配对标点符号中的文本内容
di'
di"
di(
或
dib
di[
di{
或
diB
di<
分别删除这些配对标点符号中的文本内容
yi'
yi"
yi(
yi[
yi{
yi<
分别复制这些配对标点符号中的文本内容
vi'
vi"
vi(
vi[
vi{
vi<
分别选中这些配对标点符号中的文本内容
cit
dit
yit
vit
分别操作一对标签之间的内容,编辑html很好用
另外如果把上面的
i
改成
a
可以同时操作配对标点和配对标点内的内容
,举个例子:
比如要操作的文本:111”222”333,将光标移到”222”的任何一个字符处输入命令
vim提供12个剪贴板,它们的名字分别为vim有11个粘贴板,分别是0、1、2、…、9、a、“。如果开启了系统剪贴板,则会另外多出两个+和*。使用:reg命令,可以查看各个粘贴板里的内容。
在vim中简单用
y
只是复制到
"
的粘贴板里,同样用
p
粘贴的也是这个粘贴板里的内容。
要将vim某个粘贴板里的内容粘贴进来,需要退出编辑模式,在正常模式按
"Np
,其中N为粘贴板号。比如,可以按
"5p
将5号粘贴板里的内容粘贴进来,也可以按
"+p
将系统全局粘贴板里的内容粘贴进来。
和系统剪贴板的交互又应该怎么用呢?遇到问题一般第一个寻找的是帮助文档,剪切板即是 Clipboard。通过
:h clipboard
查看帮助
星号*和加号+粘贴板是系统粘贴板。在windows系统下, * 和 + 剪贴板是相同的。对于 X11 系统, * 剪贴板存放选中或者高亮的内容, + 剪贴板存放复制或剪贴的内容。打开clipboard选项,可以访问 + 剪贴板;打开xterm_clipboard,可以访问 * 剪贴板。 * 剪贴板的一个作用是,在vim的一个窗口选中的内容,可以在vim的另一个窗口取出。
复制到系统剪贴板
example:
"*y
"+y
"+Nyy
复制N行到系统剪切板
剪切到系统剪贴板
example:
从系统剪贴板粘贴到vim
normal模式下:
:put+
含义: Ex command puts contents of system clipboard on a new line
插入模式下:
<C-r>+
含义: From insert mode (or commandline mode)
“+p比 Ctrl-v 命令更好,它可以更快更可靠地处理大块文本的粘贴,也能够避免粘贴大量文本时,发生每行行首的自动缩进累积,因为Ctrl-v是通过系统缓存的stream处理,一行一行地处理粘贴的文本。
Vim 可以很好的编辑各种字符编码的文件,这当然包括UCS-2、UTF-8 等流行的 Unicode 编码方式。
四个字符编码选项,encoding、fileencoding、fileencodings、termencoding (这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names,它们的意义如下:
包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。默认是根据你的locale选择.用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在.vimrc 中改变它的值才有意义。你可以用另外一种编码来编辑和保存文件,如你的vim的encoding为utf-8,所编辑的文件采用cp936编码,vim会自动将读入的文件转成utf-8(vim的能读懂的方式),而当你写入文件时,又会自动转回成cp936(文件的保存编码).
Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。
启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。
如果vim所在的term与vim编码相同,则无需设置。如其不然,你可以用vim的termencoding选项将自动转换成term的编码.这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。 好了,解释完了这一堆容易让新手犯糊涂的参数,我们来看看 Vim 的多字符编码方式支持是如何工作的。
对于fedora来说,vim的设置一般放在/etc/vimrc文件中,不过,建议不要修改它。可以修改~/.vimrc文件(默认不存在,可以自己新建一个),写入所希望的设置。
我的.vimrc文件如下:
1 |
:set encoding=utf-8 |
其中,fileencoding配置可以设置utf-8,但是我的mp3好像不支持utf-8编码,所以干脆,我就设置为gb2312了。现在搞定了,不管是vi中还是mp3上都可以显示无乱码的.txt文件了。
本人 无插件使用 过程中的配置很短,写在vim的配置文件 ~/.vimrc 里, 配置是使用 vim script 进行配置的,它有自己的一套语法,详细请点击 vim Script
1 |
set number "display number |
首先保证系统中的diff命令是可用的。Vim的diff模式是依赖于diff命令的。
1 |
vimdiff file1 file2 [file3 [file4]] |
1 |
vim -d file1 file2 [file3 [file4]] |
窗口比较局部于当前标签页中。你不能看到某窗口和别的标签页中的窗口的差异。这样,可以同时打开多组比较窗口,每组差异在单独的标签页中。Vim 将为每个文件打开一个窗口,并且就像使用
-O
参数一样,使用
垂直分割
。如果你要
水平分割
,加上
-o
参数:
1 |
vimdiff -o file1 file2 [file3 [file4]] |
如果已在 Vim 中,你可以用三种方式进入比较模式,只介绍一种:
1 |
:diffs[plit] {filename} |
对 {filename} 开一个新窗口。当前的和新开的窗口将设定和”vimdiff” 一样的参数。要垂直分割窗口,在前面加上
:vertical
。例如:
1 |
:vert diffsplit another_filename |
[c
反向跳转至上一处更改的开始。计数前缀使之重复执行相应次。
]c
正向跳转至下一个更改的开始。计数前缀使之重复执行相应次。
比较目的就是合并差异,直接使用以下自带命令或者麻烦的办法:手动从一个窗口拷贝至另一个窗口。
1 |
:[range]diffg[et] [bufspec] |
如果希望撤销修改,可以和平常用vim编辑一样,直接进入normal模式下按
u
但是要注意一定要将光标移动到需要撤销修改的文件窗口中。
1 |
:set diffopt=context:3 |
在比较和合并告一段落之后,可以用下列命令对多个文件同时进行操作。
比如同时退出:
:qa (quit all)
如果希望保存全部文件:
:wa (write all)
或者是两者的合并命令,保存全部文件,然后退出:
:wqa (write, then quit all)
如果在退出的时候不希望保存任何操作的结果:
:qa! (force to quit all)
:help diff
:w
将编辑的数据写入硬盘文件中。
:w!
若文件属性为“只读”,强制写入该文件。但能否写入还由对该文件的文件权限有关。
:q
保存后离开。若为“:wq!”则强制保存后离开。
:w[文件名]
将编辑的数据保存为另一个文件。
:r[文件名]
在编辑的数据中读入另一个文件的内容加到光标所在行后面。
:n1,n2 w[文件名]
将n1行到n2行的内容保存到另一个文件。
:!command
暂时离开vi到命令行模式下执行command的显示结果。
ZZ
若文件未改动,则直接离开;若已改动则保存后离开。
set num/nonum
显示/取消行号。
本文只提供个人使用过程中积累的高频场景,完整版请点击 此处 ,或查阅 vim manual
用进废退 ,所以多用才是王道,这里推荐一个游戏:通过键盘输入控制人物角色冒险的游戏,玩游戏的过程中熟悉VIM命令: vim-adventures