在 Linux 的命令行通过 vi 文件名 或 vim 文件名 即可用 VIM 编辑器打开文件,打开文件后默认是进入了普通模式,利用 h、j、k、l 四个按键分别左、下、上、右地移动光标。当光标抵达目标位置之后,敲一下 i 按键使得 VIM 切换到插入模式(界面左下角显示 – INSERT – 字样),此时可以自由的编辑文档了,就像在 Windows 下使用记事本那样去编辑。回到普通模式,仅需要敲一下键盘左上角的 Esc 按键即可(界面左下角的 – INSERT – 标志消失)。
回到普通模式,仅需要敲一下键盘左上角的 Esc 按键即可(界面左下角的 – INSERT – 标志消失)。
按键
|
含义
|
i
|
在光标的前边进入插入模式 |
I
|
在光标所在行的行首进入插入模式 |
a
|
在光标的后边进入插入模式 |
A
|
在光标所在行的行尾进入插入模式 |
o
|
在光标所在行的下方插入空行并进入插入模式 |
O
|
在光标所在行的上方插入空行并进入插入模式 |
s
|
删除光标指定的字符并进入插入模式 |
S
|
将光标所在行清除并进入插入模式 |
一般退出 VIM 分两种:一种是保存修改并退出;另一种则是直接退出。无论你选择哪一种退出方式,都先请敲一下 Esc 按键回到普通模式。
对于第一种(保存修改并退出),这里教大家两招:
对于第二种(直接退出)则要区分情况:
当然你可以选择在插入模式中使用退格键(Backspace)或删除键(Delete)来删除光标前面或当前的字符。不过这样做挺麻烦的,因为你需要先通过方向键将光标调整到目标位置才行(h、j、k、l需要在普通模式才能使用,还记得吗?)。
我们曾经说过:”对于真正的 VIM 用户,插入模式根本不存在“。是的,回到普通模式去吧,那里有更广阔的天地,在那里可以大有作为的!
在普通模式下,删除单一字符可以用 x 命令。跟在插入模式按下 Delete 键一样,x 命令是删除光标指定的字符。
删除更多字符可以使用 d 命令!
使用删除操作符 d 的删除命令的格式是 d motion
d 是 Delete(删除)的意思,motion 即指定要删除的对象,所以这个命令可以很灵活!
motion 其实是一些表示操作范围的指令,比如:
按键
|
含义
|
0
|
将光标定位到行首的位置 |
^
|
同上 |
$
|
将光标定位到行尾的位置 |
b
|
将光标定位到光标所在单词的起始处 |
e
|
将光标定位到光标所在单词的结尾处 |
w
|
将光标定位到下一个单词的起始处(注意,是光标所在单词的下一个单词噢^_^) |
gg
|
将光标定位到文件的开头 |
G
|
将光标定位到文件的末尾 |
按键
|
含义
|
d0
|
删除光标从当前位置(不包含)到该行行首的所有字符 |
d^
|
同上 |
d$
|
删除从光标当前位置(包含)到该行行尾的所有字符 |
db
|
删除从光标当前位置(不包含)到单词起始处的所有字符 |
de
|
删除从光标当前位置(包含)到单词结尾处的所有字符 |
dw
|
删除从光标当前位置(包含)到下个单词起始处的所有字符 |
dh
|
删除光标前面一个字符 |
dl
|
删除光标指定的字符 |
dj
|
删除光标所在行以及下一行的所有字符 |
dk
|
删除光标所在行以及上一行的所有字符 |
dd
|
删除光标所在行的所有字符 |
dgg
|
删除光标所在行(包含)到文件开头的所有字符 |
dG
|
删除光标所在行(包含)到文件末尾的所有字符 |
VIM 利用数字可以干很多的事儿了。比如普通模式下按一下 h 按键是将光标向左移动一格,而在其前面输入数字 3,即 3h 则是将光标向前移动 3 格,依此类推 3j 则是将光标向下移动三行,3w 则是将光标跳到三个单词后的开始位置……
同样的,d3h 表示删除光标前的 3 个字符,d3j 表示删除光标所在行以及下面 3 行的所有字符,而 d3w 则表示向后删除当前光标到后面第三个单词前的所有字符。
小写的 u 表示撤销最后一次修改;而大写的 U 表示撤销对整行的修改。
Ctrl + r 快捷键可以恢复撤销的内容!!
使用 p 命令可以将最后一次删除的内容粘贴到光标之后。(大写的 P 则是粘贴到光标之前)
VIM 用 y 命令实现拷贝。语法跟删除的 d 命令一样:y motion。其中的 motion 同样是用来表示操作范围的指令,即 yy 表示拷贝当前行,3yy 则表示拷贝 3 行;y$ 表示从光标所在的位置拷贝到行尾的所有字符;yG 则表示从光标所在行拷贝到文件末尾行的所有字符。
拷贝完成之后同样使用 p 命令进行粘贴,没什么好说的。
VIM 还提供了一个简单的替换命令:r 命令。
r 用于替换光标所在的字符,做法是先将光标移动到需要替换的字符处,按一下 r 键,然后输入新的字符。注意,全程无需进入插入模式,也不会进入插入模式。
数字 + r 可能会产生一些物理反应。先输入【数字】再输入 r,最后输入新字符,说明从当前光标的位置开始,替换【数字】个新字符。
对于需要替换多个字符,更好的方案是直接进入替换模式。按下大写的 R 键,屏幕左下角出现 – REPLACE – 字样,说明你已经处于替换模式。此时输入字符可以连续替换光标及其后边的内容。注意:退格键(Backspace)在替换模式中被解释为如果左边内容被替换过,则恢复到原来的样子;如果没有被替换过,则简单的向左移动。修改完毕后,按下 Esc 回到普通模式。
修改跟替换是不一样的!
修改会进入插入模式,替换不会进入插入模式!
修改命令我们使用 c 键来启动,格式是:c [number] motion
没错,motion 依然表示范围,[数字]依然拥有奥义,同样是可选的,加上数字表示重复执行多次 motion 范围……
比如 cw 是修改光标指定单词的内容(VIM 的做法就是删除当前光标位置到下个单词前的所有字符,并进入插入模式);而 c2w 便是修改当前光标指定的单词以及下一个单词共计两个单词的内容……
按键
|
含义 |
c0
|
删除光标从当前位置(不包含)到该行行首的所有字符,并进入插入模式 |
c^
|
同上 |
c$
|
删除从光标当前位置(包含)到该行行尾的所有字符,并进入插入模式 |
cb
|
删除从光标当前位置(不包含)到单词起始处的所有字符,并进入插入模式 |
ce
|
删除从光标当前位置(包含)到单词结尾处的所有字符,并进入插入模式 |
cw
|
删除从光标当前位置(包含)到下个单词起始处的所有字符,并进入插入模式 |
ch
|
删除光标前边一个字符,并进入插入模式 |
cl
|
删除光标指定的字符,并进入插入模式 |
cj
|
删除光标所在行以及下一行的所有字符,并在光标下一行进入插入模式 |
ck
|
删除光标所在行以及上一行的所有字符,并在光标下一行进入插入模式 |
cc
|
删除光标所在行的字符,并进入插入模式 |
修改 == 删除 + 进入插入模式
有时候,你可能需要知道当前的文件信息,比如文件名,文件状态,文件的总行数,以及光标所在的相对位置。
快捷键 ctrl + g 可以解决你的需求。
当你的光标在文件中随意徘徊时,突然想到目标就在第 333 行的位置,你应该怎么做?假设你当前光标位于文件第 1333 行,你的做法是在普通模式下按 1000 次 k 键?
还是将光标先定位到文件的起始处(gg 命令,还记得吗?),然后按332 次 j 键?
无论使用哪种做法,我想都是在摧残我们的心智。
当然你可能想到了数字的奥义,先输入数字 332 再输入 j,那么就可以直接跳转到 333 行了。不错,但你还得先将光标移动到文件的起始处,多麻烦……或者直接输入数字 1000,再输入 k,但……这就需要计算了,如果是 1387 行跳到 678 行不还得拿个计算器啊?!
我们需要的是一步到位,我们需要的是瞬间转移!!!
可以,VIM 是神之编辑器,只有你想不到,没有它办不到的!
在 VIM 有两种方式可以将光标跳转到指定的位置:
比如将光标跳转到第 333 行的位置,你就输入数字 333,再输入大写字母 G 即可见证奇迹;或者输入冒号(:)进入命令行模式,再输入数字 333,最后回车,也可以跳转到目的地。
TIPS:如果单独输入 G 键(前边没有输入数字),那么光标是直接去到文件的最后一行;如果输入两个小写 g,即 gg,则将光标跳转到文件的第一行。
我们知道这个世界上除了情侣是一对对的之外,还有括号也是一对对的,不成对的括号则毫无逻辑可言。当你的代码量到一定程度的时候,或许你就只能在屏幕中看到一半的括号,那么有时候寻找它的另一半将成为你心头的磐石。
VIM 有个按键可以帮你快速定位到另一半括号,别说我没告诉你,就是 % 键。将光标移动到 (),[],{},中的任何一半括号上,按下 % 键,便可看到此时光标已经跳转到另外一半的括号上了。
在程序调试时,这个功能用来查找不配对的括号是很有用的。因为有时候你代码删删删,括号一对给你删了一半,剩下一半落在那里,编译自然就会报错……此时你在落单的那一半括号上使用 % 键,你会发现 VIM 根本不鸟你,因为它找不到另一半了……
注意:别拿书名号什么的来开玩笑,% 无法识别它们,因为 VIM 是为了编程而生的!
在编写代码的时候我们经常需要对代码进行缩进,VIM 可以使用尖括号(< 或 >)来控制缩进,我们常用的就是两个同方向的尖括号表示将光标所在的语句进行缩进和反缩进操作。很明显 >> 表示缩进,而 << 则表示反缩进。
但是这样一次只能缩进一行,一行行来也挺麻烦,因此你想到了数字的奥义:先输入数字 2 在输入 >> 表示将光标所在行以及下一行共两行同时插入一个缩进。
不过行数一多……到底要缩进多少行就成了一个问题……
这时,你可以按一下 v 进入可视模式(左下角出现 – VISUAL – 字样),然后通过 h、j、k、l 或 其他 motion 来移动你的光标,此时光标所到之处必被一道亮光所包围(表示被选中),选择好需要缩进的目标后,只需按一下 > 即可完成任务。
VIM 的查找是从按下斜杠(/)那一刻开始的……
在普通模式下按下斜杠(/)也是进入命令行模式,此时该字符和光标均出现在屏幕的底部,这跟冒号(:)一样。
紧挨着斜杠(/)的是搜索目标,比如 /love,说明你找的是 love 这个字符串在光标后边第一次出现的位置,当然你也可以输入中文,比如 /你瞅啥
那如果要找下一个目标怎么办?这时你只需按 n 键即可定位到下一个符合的目标(向下查找),而按 N 键则返回上一个(向上查找)。
注意:第一个搜索到的目标不是文件中的第一个目标,而是从你的光标所在处开始找到的那个目标。所以你如果想要搜索文件中第一个匹配的目标,你应该先 gg 将光标移动到文件头,然后再使用搜索命令。
在普通模式下按下问号(?)也是进入命令行模式,实现的也是搜索功能。不过这回它是反过来的,你可以认为它是斜杠(/)功能的“反面派”。
前边我们说过 /FishC 是从光标位置向后开始搜索 FishC 这个字符串,而 ?FishC 则相反,是从光标位置向前开始搜索。
怕你头晕,给你列个表:
/目标
|
?目标
|
|
搜索方向
|
从光标位置向后 | 从光标位置向前 |
n
|
向后搜索下一个 | 向前搜索下一个 |
N
|
向前搜索下一个 | 向后搜索下一个 |
当搜索到了文件的末尾(/目标)或开头(?目标),页面下方面会显示“Search hit BOTTOM, continuing at TOP”或“Search hit TOP, continuing at BOTTOM”的字样。表示一轮搜索到文件尾/头了,搜索下一个就是从文件头/尾开始咯。
我发现你发现了,VIM 会自动高亮所有匹配的目标,即使在你找到目标之后,它们仍然高傲的亮着!
很烦人对吧?告诉你怎么取消,输入冒号(:)进入命令行模式,然后输入 nohl 即可。
最后提个醒:在搜索命令中,.、*、[、]、^、%、/、?、~ 和 $ 这 10 个字符有着特殊意义,所以在使用这些字符的时候要在前面加上一个反斜杠(\),比如你要搜索问号,则输入 /?
通过搜索功能,我们将光标定位到目标位置,如果你确定这个目标是可恶的,需要被替换的,你可以输入 ?/old/new,这样即可将光标所在行的第一个 old 替换为 new;你如果输入的是 ?/old/new/g,则表示将光标所在行的所有 old 替换为 new。
但如果要替换整个文件的所有匹配字符串怎么办?总不能每一行来一下吧?
只要你能想到的,VIM 就有办法!输入 :%s/old/new/g表示替换整个文件中每个匹配的字符串。
噢,你没有太大的把握,希望 VIM 在每次替换前都咨询一下你:“亲,我准备替换 XX 了,你确定要将 XX 替换成 OO 吗?”
可以,输入 :%s/old/new/gc
看到页面下方的 (y/n/a/q/l/E/Y) 了吗?这是 VIM 在咨询您的意见呢!
好吧,你可能会问“如果我只想替换第 5 行到第 13 行之间的所有 XX,可以吗?”
当然可以啦,使用 :5,13s/old/new/g 即可胜任你的要求:
我想你已经猜到了:5 表示开始替换的行号,13 表示结束替换的行号。
运行在命令行下的 VIM,貌似不可能“最小化”,这就有诸多不方便的地方了。比如有时我需要知道某个路径下有哪些文件(我的程序需要调用它们),那我可能就需要先关闭 VIM,然后查看有哪些文件,最后重新打开 VIM。
这就显得有点折腾了,不符合 VIM 一直强调的高效作风!因此,伟大的 VIM 作者(Bram Moolenaar)高呼一声“我有办法!”,于是祭出了一个感叹号(!)
比如你想知道根目录(/)下面有哪些目录和文件,可以在VIM中输入 :!ls /
然后敲一下回车
即可显示根目录(/)下边有哪些目录和文件.
总之,在输入冒号(:)进入命令行模式,输入感叹号(!),在其后便可以加上 shell 命令。此后 VIM 将临时跳转回 shell,并执行命令。再次按下 Enter 键回到 VIM。
一般的文本编辑工具都会有“另存为”的功能,用于将文件重新存放到一个新的文件中(旧文件保留不变)。VIM 也可以这么干,做法是输入 :w 新文件名
下边我用 VIM 打开的是 test 文件,然后我输入 :w test2
该命令会以 test2 为文件名拷贝保存整个 test 文件。
VIM 除了支持文件另存为之外,还支持另一种新技能:文件局部另存为。言下之意就是,VIM 可以将文件中的局部文本另存为一个新的文件,厉害吧?!
这就需要你进入一种新的模式,叫:可视模式
在普通模式中按下 V 键即进入可视模式,进入后左下角显示 – VISUAL –
此时光标的位置开始为选中状态,你可以通过任何移动或范围的按键来移动光标,光标所到之处皆为选中状态(h、j、k、l 移动光标,$ 去到行尾,0 去到行首……)
选好范围之后的操作就跟“文件另存为”一样了。
按下冒号(:)屏幕左下方出现 :’<,’>
现在请输入 w test2
表示新建一个 test2 文件,并将选中的内容单独存放进去。
这里有个问题,如果路径中已经存在 test2 文件,那么 VIM 会提醒你需要加感叹号(!)才能强制覆盖文件。即输入 w! test2
所谓合并文件,便是在 VIM 打开的一个文件中读取并置入另一个文件。怎么样,光听着就觉得炫酷吧?!
命令很简单,只需要输入冒号(:)进入命令行模式,然后输入 r 文件名
即可将指定文件的内容读取并置入到光标的下一行中。
VIM 还可以同时打开多个文件,并且允许你通过水平或垂直的方式并排它们。
VIM 使用 –o 或 –O 选项打开多个文件,其中 –o 表示垂直并排。
打开后默认光标是落在第一个文件中的,此时之前学过的所有命令都可以上,不过仅限于第一个文件。那如何将焦点(光标)切换到另一个文件中呢?很简单,使用 ctrl + w + w 将光标切换到下一个文件;或者使用 ctrl + w + 方向(方向键或 h、j、k、l)。
退出文件的话可以使用原来的 q、q!、wq 或者 ZZ(shirt + z + z)。
但你肯定会发现你如果同时打开三四个文件,这样子却不得不退出三四次才行。太麻烦了……
那有没有更优秀的办法呢?
答案是有的!
只需在原来退出命令的后边加上小写 a,则表示退出动作是针对所有的(ALL):qa、qa!、wqa