文章目录
vim快速入门
第一节:使用 h j k l 来移动你的光标
在 VIM 中移动光标,当然可以使用方向键,但是为此我们需要将手向右下角挪动 20 cm……
VIM 提供了更好的方式,就是使用 h j k l 四个按键(普通模式),这时我们的手指不需要离开字符区便可控制光标的移动。
h j k l 四个按键分别代表左、下、上、右
第二节:插入模式和退出VIM的方法
在此之前,你可能听说过 VIM 最具特色的功能就是支持多种模式,并允许你在这些模式间自由切换,以实现它的强大功能。那 VIM 有多少种模式呢?告诉你吧,VIM 具有 6 种基本模式和 5 种派生模式。(基本模式:普通模式、插入模式、可视模式、选择模式、命令行模式和 Ex 模式;派生模式:操作符等待模式、插入普通模式、插入可视模式、插入选择模式和替换模式)
插入模式
在 Linux 的命令行通过 vi 文件名 或 vim 文件名 即可用 VIM 编辑器打开你的文件,打开文件后默认是进入了普通模式。当光标抵达目标位置之后,敲一下 i 按键使得 VIM 切换到插入模式(界面左下角显示 – INSERT – 字样),此时你可以自由的编辑文档了,就像你在 Windows 下使用记事本那样去编辑。
回到普通模式
回到普通模式,仅需要敲一下键盘左上角的 Esc 按键即可(界面左下角的 – INSERT – 标志消失)。
进入插入模式的各种方法
并不只有敲击按键 i 才能进入插入模式,其实方法多了去了,这儿小甲鱼给大家介绍几个常用的:
按键 | 含义 |
---|---|
i | 在光标的前边进入插入模式 |
I | 在光标所在行的行首进入插入模式 |
a | 在光标的后边进入插入模式 |
A | 在光标所在行的行尾进入插入模式 |
o | 在光标所在行的下方插入空行并进入插入模式 |
O | 在光标所在行的上方插入空行并进入插入模式 |
s | 删除光标指定的字符并进入插入模式 |
S | 将光标所在行清除并进入插入模式 |
注意:最后这个大 S 是清除所在行,而不是删除。清除的意思就是保留行,把内容清空,然后在行首进入插入模式。
退出 VIM 的方法
一般退出 VIM 分两种:一种是保存修改并退出;另一种则是直接退出。无论你选择哪一种退出方式,都先请敲一下 Esc 按键回到普通模式。
- ZZ(两个大写字母Z,也就是Shift+z+z)
- :wq(这是一个组合命令,如果是 :w 表示保存,而 :q 表示退出)
对于第二种(直接退出)则要区分情况:
- 如果你打开文件只是看看,并不做任何改动,那么直接输入 :q 即可
- 如果对文件动过手脚,但不希望保存(放弃修改)而直接退出,则需要再后边加上一个感叹号 :q!
第三节:删除命令、数字的奥义、撤销和恢复命令
删除命令
在普通模式下,删除单一字符可以用 x 命令。跟在插入模式按下 Delete 键一样,x 命令是删除光标指定的字符。
删除更多字符可以使用 d 命令!
更多删除命令
使用删除操作符 d 的删除命令的格式是 d motion
d 是 Delete(删除)的意思,motion 即指定要删除的对象,所以这个命令可以很灵活!
motion 其实是一些表示操作范围的指令,比如:
按键 | 含义 |
---|---|
0 | 将光标定位到行首的位置 |
^ | 同上 |
$ | 将光标定位到行尾的位置 |
b | 将光标定位到光标所在单词的起始处 |
e | 将光标定位到光标所在单词的结尾处 |
w | 将光标定位到下一个单词的起始处(注意,是光标所在单词的下一个单词噢_) |
gg | 将光标定位到文件的开头 |
G | 将光标定位到文件的末尾 |
将 d 命令跟它们结合
按键 | 含义 |
---|---|
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 则表示向后删除当前光标到后面第三个单词前的所有字符。
撤销和恢复命令
VIM 有后悔药提供:u 和 U
其中小写的 u 表示撤销最后一次修改;而大写的 U 表示撤销对整行的修改。
Ctrl + r 快捷键可以恢复撤销的内容
这上面所有的“删除”操作并不是真的删除,它们事实上是存放在 VIM 的一个缓冲区(VIM 把它称之为寄存器)中,相当于 Windows 的剪切功能!!!
第四节:粘贴命令、拷贝命令、替换模式和修改命令
粘贴命令
使用 p 命令可以将最后一次删除的内容粘贴到光标之后。(大写的 P 则是粘贴到光标之前)
这里需要注意的是:如果你需要粘贴的是整行为单位,那么 p 命令将在光标的下一行开始粘贴;如果你拷贝的是非整行的局部字符串,那么 p 命令将在光标后开始粘贴。
拷贝命令
其实我们用的最多的还是拷贝粘贴,VIM 用 y 命令实现拷贝。语法跟删除的 d 命令一样:y motion
其中的 motion 同样是用来表示操作范围的指令,即 yy 表示拷贝当前行,3yy 则表示拷贝 3 行;y$ 表示从光标所在的位置拷贝到行尾的所有字符;yG 则表示从光标所在行拷贝到文件末尾行的所有字符。
按键 | 含义 |
---|---|
yy | 复制游标所在的那一行(常用) |
nyy | n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用) |
y1G | 复制游标所在行到第一行的所有数据 |
yG | 复制游标所在行到最后一行的所有数据 |
y0 | 复制光标所在的那个字符到该行行首的所有数据 |
y$ | 复制光标所在的那个字符到该行行尾的所有数据 |
拷贝完成之后同样使用 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 可以解决你的需求.
注意:光标在文件中的相对位置是用百分数来显示的,那如果想知道光标具体的位置呢?看到还有个 5,1 了吗?那个是原来就有的,表示光标当前的位置(行,列)
跳转
当你的光标在文件中随意徘徊时,突然想到目标就在第 333 行的位置,你应该怎么做?假设你当前光标位于文件第 1333 行,你的做法是在普通模式下按 1000 次 k 键?
还是将光标先定位到文件的起始处(gg 命令,还记得吗?),然后按332 次 j 键?
无论使用哪种做法,我想都是在摧残我们的心智。
在 VIM 有两种方式可以将光标跳转到指定的位置:
- 行号 + G
- :行号
比如将光标跳转到第 333 行的位置,你就输入数字 333,再输入大写字母 G 即可见证奇迹;或者输入冒号(:)进入命令行模式,再输入数字 333,最后回车,也可以跳转到目的地。
定位括号
VIM 有个按键可以帮你快速定位到另一半括号,就是 % 键。将光标移动到 (),[],{},中的任何一半括号上,按下 % 键,便可看到此时光标已经跳转到另外一半的括号上了。
缩进
在编写代码的时候我们经常需要对代码进行缩进,比如我输入做大括号({),然后回车,VIM 将自动为下边的语句插入一个缩进,直到你输入右大括号(}),代表语句块结束。
int strcmp(char *s, char *t)
{
int i;
for (i=0; s[i] == t[i]; i++)
;
return s[i] - t[i];
}
那现在我们需要在 for 循环中添加一个条件判断:
int strcmp(char *s, char *t)
{
int i;
for (i=0; s[i] == t[i]; i++)
if (s[i] == '\0')
return 0;
return s[i] - t[i];
}
现在我们需要将第 6 行和第 7 行均添加一个缩进
VIM 可以使用尖括号(< 或 >)来控制缩进,我们常用的就是两个同方向的尖括号表示将光标所在的语句进行缩进和反缩进操作。很明显 >> 表示缩进,而 << 则表示反缩进。
但是这样一次只能缩进一行,一行行来也挺麻烦,因此你想到了数字的奥义:先输入数字 2 在输入 >> 表示将光标所在行以及下一行共两行同时插入一个缩进。
不过行数一多……到底要缩进多少行就成了一个问题……
这时,你可以按一下 v 进入可视模式(左下角出现 – VISUAL – 字样),然后通过 h、j、k、l 或 其他 motion 来移动你的光标,此时光标所到之处必被一道亮光所包围(表示被选中),选择好需要缩进的目标后,只需按一下 > 即可完成任务
第六节:搜索命令和替换命令
搜索命令
VIM 的查找是从按下斜杠(/)那一刻开始的……
在普通模式下按下斜杠(/)也是进入命令行模式,此时该字符和光标均出现在屏幕的底部,这跟冒号(:)一样。
紧挨着斜杠(/)的是搜索目标,比如 /love,说明你找的是 love 这个字符串在光标后边第一次出现的位置,当然你也可以输入中文,比如 /你
那如果要找下一个目标怎么办?这时你只需按 n 键即可定位到下一个符合的目标(向下查找),而按 N 键则返回上一个(向上查找)。
注意:第一个搜索到的目标不是文件中的第一个目标,而是从你的光标所在处开始找到的那个目标。所以你如果想要搜索文件中第一个匹配的目标,你应该先 gg 将光标移动到文件头,然后再使用搜索命令。
在普通模式下按下问号(?)也是进入命令行模式,实现的也是搜索功能。不过这回它是反过来的,你可以认为它是斜杠(/)功能的“反面派”。
前边我们说过 /FC 是从光标位置向后开始搜索 FC 这个字符串,而 ?FC 则相反,是从光标位置向前开始搜索。
/目标 | ?目标 | |
---|---|---|
搜索方向 | 从光标位置向后 | 从光标位置向前 |
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。
但如果要替换整个文件的所有匹配字符串怎么办?
输入 :%s/old/new/g表示替换整个文件中每个匹配的字符串。
看到页面下方的 (y/n/a/q/l/E/Y) 了吗?这是 VIM 在咨询您的意见呢!
- y 表示替换
- n 表示不替换
- a 表示替换所有
- q 表示放弃替换
- l 表示替换第一个并进入插入模式
- ^E 表示用 Ctrl+e 来滚动屏幕
- ^Y 表示用 Ctrl+y 来滚动屏幕
如果我只想替换第 5 行到第 13 行之间的所有 XX,可以吗?”
使用 :5,13s/old/new/g 即可胜任你的要求:
第七节:执行shell命令、文件另存为、合并文件和打开多个文件
执行shell命令
运行在命令行下的 VIM,貌似不可能“最小化”,这就有诸多不方便的地方了。比如有时我需要知道某个路径下有哪些文件(我的程序需要调用它们),那我可能就需要先关闭 VIM,然后查看有哪些文件,最后重新打开 VIM。
比如你想知道根目录(/)下面有哪些目录和文件,可以在VIM中输入 :!ls /,然后敲一下回车,即可显示根目录(/)下边有哪些目录和文件:
总之,在输入冒号(:)进入命令行模式,输入感叹号(!),在其后便可以加上 shell 命令。此后 VIM 将临时跳转回 shell,并执行命令。再次按下 Enter 键回到 VIM。
文件另存为
一般的文本编辑工具都会有“另存为”的功能,用于将文件重新存放到一个新的文件中(旧文件保留不变)。VIM 也可以这么干,做法是输入 :w 新文件名
下边我用 VIM 打开的是 test 文件,然后我输入 :w test2,该命令会以 test2 为文件名拷贝保存整个 test 文件。
局部内容另存为
VIM 可以将文件中的局部文本另存为一个新的文件,这就需要你进入一种新的模式,叫:可视模式
在普通模式中按下 V 键即进入可视模式,进入后左下角显示 – VISUAL –
此时光标的位置开始为选中状态,你可以通过任何移动或范围的按键来移动光标,光标所到之处皆为选中状态(h、j、k、l 移动光标,$ 去到行尾,0 去到行首……):
选好范围之后的操作就跟“文件另存为”一样了。
按下冒号(:)屏幕左下方出现 :‘<,’>
现在请输入 w test2
表示新建一个 test2 文件,并将选中的内容单独存放进去。
这里有个问题,如果路径中已经存在 test2 文件,那么 VIM 会提醒你需要加感叹号(!)才能强制覆盖文件。即输入 w! test2
合并文件
所谓合并文件,便是在 VIM 打开的一个文件中读取并置入另一个文件。
命令很简单,只需要输入冒号(:)进入命令行模式,然后输入 r 文件名
即可将指定文件的内容读取并置入到光标的下一行中。
打开多个文件
VIM 还可以同时打开多个文件,并且允许你通过水平或垂直的方式并排它们。
VIM 使用 –o 或 –O 选项打开多个文件,其中 –o 表示垂直并排,例如 vim -o lesson4 lesson5 lesson6
-O 表示水平并排,例如 vim -O lesson4 lesson5 lesson6
打开后默认光标是落在第一个文件中的,此时之前学过的所有命令都可以上,不过仅限于第一个文件。那如何将焦点(光标)切换到另一个文件中呢?很简单,使用 ctrl + w + w 将光标切换到下一个文件;或者使用 ctrl + w + 方向(方向键或 h、j、k、l)。
- 对于垂直并排的文件:使用 ctrl + w + 上、下方向,表示上、下切换文件;
- 对于水平并排的文件:使用 ctrl + w + 左、右方向,表示左、右切换文件。
退出文件的话可以使用原来的 q、q!、wq 或者 ZZ(shirt + z + z)。
如果同时打开三四个文件,这样子却不得不退出三四次才行。太麻烦了……
vim只需在原来退出命令的后边加上小写 a,则表示退出动作是针对所有的(ALL):qa、qa!、wqa
vim配置文件
vim的配置文件为/etc/vimrc,但一般不建议直接修改这个文件,而是在用户根目录下创建一个新的隐藏文件:
vim ~/.vimrc
然后编辑这个文件,常用的配置如下:
"双引号后面的内容为注释
set nu "显示行号
set hlsearch "查找的字符串反白显示
set backspace=2 "可随时用退格键进行删除
set autoindent "自动缩排
set ruler "在最下方一行显示状态
set showmode "在左下角显示模式
set bg=dark "显示不同的底色,还可以为light
syntax on "语法检验,颜色显示