6. vim
本章同步视频:https://edu.51cto.com/sd/e4874
6.1 vi与vim
l 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在;
l 很多个别软件的编辑接口都会主动呼叫 vi (例如未来会谈到的 crontab, visudo, edquota 等指令);
l vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计;
l 因为程序简单,编辑速度相当快速。
本章同步视频:https://edu.51cto.com/sd/e4874
6.2 vim的使用
6.2.1 vim的三种模式
基本上 vi 共分为三种模式,分别是『一般指令模式』、『编辑模式』与『末行命令模式』。这三种模式的作用分别是:
1.一般指令模式 (command mode)
以 vi 打开一个档案就直接进入一般指令模式了(这是默认的模式,也简称为一般模式)。在这个模式中,你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整列』来处理档案内容,也可以使用『复制、贴上』来处理你的文件数据。
2.编辑模式 (insert mode)
在一般指令模式中可以进行删除、复制、贴上等等的动作,但是却无法编辑文件内容的!要等到你按下『i, I, o, O, a, A, r, R』等任何一个字母之后才会进入编辑模式。而如果要回到一般指令模式时,则必须要按下『Esc』这个按键即可退出编辑模式。
3.末行命令模式 (command-line mode)
在一般模式当中,输入『 : / ? 』三个中的任何一个按钮,就可以将光标移动到最底下那一列。在这个模式当中,可以提供你『搜寻资料』的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作则是在此模式中达成的!
6.2.2 vim的使用
1.打开文件
[root@localhost tmp]# vim root
2.按下i/a/o/r键,进入编辑模式
3.输入文本内容后,按ESC进入命令模式。
4.在命令模式下,输入:,进入末行命令模式,准备保存退出。
6.2.3 按键说明
1.一般指令模式可用的按钮说明,光标移动、复制贴上、搜寻取代等
移动光标的方法 |
|
h 或向左箭头键(←) |
光标向左移动一个字符 |
j 或向下箭头键(↓) |
光标向下移动一个字符 |
k 或向上箭头键(↑) |
光标向上移动一个字符 |
l 或向右箭头键(→) |
光标向右移动一个字符 |
如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" 或 "30↓" 的组合按键,亦即加上想要进行的次数(数字)后,按下动作即可! |
|
[Ctrl] + [f] |
屏幕『向下』移动一页,相当于 [Page Down]按键 (常用) |
[Ctrl] + [b] |
屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) |
[Ctrl] + [d] |
屏幕『向下』移动半页 |
[Ctrl] + [u] |
屏幕『向上』移动半页 |
+ |
光标移动到非空格符的下一行 |
- |
光标移动到非空格符的上一行 |
n |
那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一列的 n 个字符。例如 20 |
0 或功能键[Home] |
这是数字『 0 』:移动到这一行的最前面字符处 (常用) |
$ 或功能键[End] |
移动到这一行的最后面字符处(常用) |
H |
光标移动到这个屏幕的最上方那一行的第一个字符 |
M |
光标移动到这个屏幕的中央那一行的第一个字符 |
L |
光标移动到这个屏幕的最下方那一行的第一个字符 |
G |
移动到这个档案的最后一行(常用) |
nG |
n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu) |
gg |
移动到这个档案的第一行,相当于 1G 啊! (常用) |
n |
n 为数字。光标向下移动 n 行(常用) |
删除、复制与贴上 |
|
x, X |
在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用) |
nx |
n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符,『10x』。 |
dd |
删除游标所在的那一整行(常用) |
ndd |
n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 列 (常用) |
d1G |
删除光标所在到第一行的所有数据 |
dG |
删除光标所在到最后一行的所有数据 |
d$ |
删除游标所在处,到该行的最后一个字符 |
d0 |
那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符 |
yy |
复制游标所在的那一行(常用) |
nyy |
n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用) |
y1G |
复制光标所在列到第一行的所有数据 |
yG |
复制光标所在列到最后一行的所有数据 |
y0 |
复制光标所在的那个字符到该行行首的所有数据 |
y$ |
复制光标所在的那个字符到该行行尾的所有数据 |
p, P |
p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! (常用) |
J |
将光标所在行与下一行的数据结合成同一行 |
c |
重复删除多个数据,例如向下删除 10 行,[ 10cj ] |
u |
复原前一个动作。(常用) |
[Ctrl]+r |
重做上一个动作。(常用) |
这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦! |
|
. |
不要怀疑!这就是小数点!意思是重复前一个动作的意思。如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用) |
搜寻与取代 |
|
/word |
向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用) |
?word |
向光标之上寻找一个字符串名称为 word 的字符串。 |
n |
这个 n 是英文按键。代表『重复前一个搜寻的动作』。举例来说,如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串! |
N |
这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。 |
使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词! |
|
:n1,n2s/word1/word2/g |
n1 与 n2 为数字。在第 n1 与 n2 列之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 列之间搜寻vbird 并取代为 VBIRD 则: 『:100,200s/vbird/VBIRD/g』。(常用) |
:1,$s/word1/word2/g |
从第一列到最后一列寻找 word1 字符串,并将该字符串取代为 word2 !(常用) |
:1,$s/word1/word2/gc |
从第一列到最后一列寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用) |
2.一般指令模式切换到编辑模式的可用的按钮说明
进入插入或取代的编辑模式 |
|
i, I |
进入插入模式(Insert mode): i 为『从目前光标所在处插入』, I 为『在目前所在列的第一个非空格符处开始插入』。 (常用) |
a, A |
进入插入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始插入』, A 为『从光标所在列的最后一个字符处开始插入』。(常用) |
o, O |
进入插入模式(Insert mode): 这是英文字母 o 的大小写。o 为『在目前光标所在的下一列处插入新的一列』; O 为在目前光标所在处的上一列插入新的一列!(常用) |
r, R |
进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用) |
上面这些按键中,在 vi 画面的左下角处会出现『--INSERT--』或『--REPLACE--』的字样。由名称就知道该动作了吧!!特别注意的是,我们上面也提过了,你想要在档案里面输入字符时,一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔! |
|
[Esc] |
退出编辑模式,回到一般指令模式中(常用) |
3.一般指令模式切换到指令列模式的可用按钮说明
指令列模式的储存、离开等指令 |
|
:w |
将编辑的数据写入硬盘档案中(常用) |
:w! |
若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入,还是跟你对该档案的档案权限有关啊! |
:q |
离开 vi (常用) |
:q! |
若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。 |
注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~ |
|
:wq |
储存后离开,若为 :wq! 则为强制储存后离开 (常用) |
ZZ |
这是大写的 Z 喔!若档案没有更动,则不储存离开,若档案已经被更动过,则储存后离开! |
:w [filename] |
将编辑的数据储存成另一个档案(类似另存新档) |
:r [filename] |
在编辑的数据中,读入另一个档案的数据。亦即将『filename』这个档案内容加到游标所在列后面 |
:n1,n2 w [filename] |
将 n1 到 n2 的内容储存成 filename 这个档案。 |
:! command |
暂时离开 vi 到指令列模式下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息! |
4.环境设置 ~/.vimrc
vim 的环境设定参数 |
|
:set nu :set nonu |
就是设定与取消行号啊! |
:set hlsearch :set nohlsearch |
hlsearch 就是 high light search(高亮度搜寻)。这个就是设定是否将搜寻的字符串反白的设定值。默认值是 hlsearch |
:set autoindent :set noautoindent |
是否自动缩排?autoindent 就是自动缩排。 |
:set backup |
是否自动储存备份档?一般是 nobackup 的,如果设定 backup 的话,那么当你更动任何一个档案时,则源文件会被另存成一个档名为 filename~ 的档案。举例来说,我们编辑 hosts ,设定 :set backup ,那么当更动 hosts 时,在同目录下,就会产生 hosts~ 文件名的档案,记录原始的 hosts 档案内容 |
:set ruler |
还记得我们提到的右下角的一些状态栏说明吗?这个 ruler 就是在显示或不显示该设定值的啦! |
:set showmode |
这个则是,是否要显示 --INSERT-- 之类的字眼在左下角的状态栏。 |
:set backspace=(012) |
一般来说,如果我们按下 i 进入编辑模式后,可以利用退格键 (backspace) 来删除任意字符的。但是,某些 distribution 则不许如此。此时,我们就可以透过 backspace 来设定啰~当 backspace 为 2 时,就是可以删除任意值;0 或 1 时,仅可删除刚刚输入的字符,而无法删除原本就已经存在的文字了! |
:set all |
显示目前所有的环境参数设定值。 |
:set |
显示与系统默认值不同的设定参数,一般来说就是你有自行变动过的设定参数啦! |
:syntax on :syntax off |
是否依据程序相关语法显示不同颜色?举例来说,在编辑一个纯文本档时,如果开头是以 # 开始,那么该列就会变成蓝色。如果你懂得写程序,那么这个 :syntax on 还会主动的帮你除错呢!但是,如果你仅是编写纯文本档案,要避免颜色对你的屏幕产生的干扰,则可以取消这个设定。 |
:set bg=dark :set bg=light |
可用以显示不同的颜色 色调,预设是『 light 』。如果你常常发现批注的字体深蓝色实在很不容易看,那么这里可以设定为 dark 喔!试看看,会有不同的样式呢! |
本章同步视频:https://edu.51cto.com/sd/e4874
6.3 vim 的额外功能
6.3.1 vim 的暂存档、救援回复与开启时的警告讯息
[root@localhost tmp]# vim root #打开root文件后按ctrl+z退出
[1]+ Stopped vim root #出现如上提示
[root@localhost tmp]# vim root #再次打开root文件
E325: ATTENTION
Found a swap file by the name ".root.swp"
owned by: root dated: Wed Apr 1 22:01:18 2020
file name: /tmp/root
modified: no
user name: root host name: localhost.localdomain
process ID: 35570 (still running)
While opening file "root"
dated: Wed Apr 1 21:31:15 2020
(1) Another program may be editing the same file. If this is the case,
be careful not to end up with two different instances of the same
file when making changes. Quit, or continue with caution.
(2) An edit session for this file crashed.
If this is the case, use ":recover" or "vim -r root"
to recover the changes (see ":help recovery").
If you did this already, delete the swap file ".root.swp"
to avoid this message.
Swap file ".root.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
#说明
u [O]pen Read-Only:打开此档案成为只读档,可以用在你只是想要查阅该档案内容并不想要进行编辑行为时。
u (E)dit anyway:还是用正常的方式打开你要编辑的那个档案,并不会载入暂存盘的内容。
u (R)ecover:就是加载暂存盘的内容,用在你要救回之前未储存的工作。不过当你救回来并且储存离开 vim 后,还是要手动自行删除那个暂存档喔!
u (D)elete it:你确定那个暂存档是无用的!
u (Q)uit:按下 q 就离开 vim ,不会进行任何动作回到命令提示字符。
u (A)bort:忽略这个编辑行为,感觉上与 quit 非常类似!也会送你回到命令提示字符就是!
6.3.2 区块选择(Visual Block)
注:按下快捷键后,用键盘移动光标进行操作。
区块选择的按键意义 |
|
v |
字符选择,会将光标经过的地方反白选择! |
V |
列选择,会将光标经过的列反白选择! |
[Ctrl]+v |
区块选择,可以用长方形的方式选择资料 |
y |
将反白的地方复制起来 |
d |
将反白的地方删除掉 |
p |
将刚刚复制的区块,在游标所在处贴上! |
6.3.3 多档案编辑
多档案编辑的按键 |
|
:n |
编辑下一个档案 |
:N |
编辑上一个档案 |
:files |
列出目前这个 vim 的开启的所有档案 |
[root@localhost tmp]# vim aaa bbb
#注:aaa文件的内容是bbbb,bbb文件的内容是cccc。
输入:n
回车后切换到bbb文件
输入:files
回车后
6.3.4 多窗口功能
多窗口情况下的按键功能 |
|
:sp [filename] |
开启一个新窗口,如果有加 filename,表示在新窗口开启一个新档案,否则表示两个窗口为同一个档案内容(同步显示)。 |
[ctrl]+w+ j [ctrl]+w+↓ |
按键的按法是:先按下 [ctrl] 不放,再按下 w 后放开所有的按键,然后再按下 j (或向下箭头键),则光标可移动到下方的窗口。 |
[ctrl]+w+ k [ctrl]+w+↑ |
同上,不过光标移动到上面的窗口。 |
[ctrl]+w+ q |
其实就是 :q 结束离开啦!举例来说,如果我想要结束下方的窗口,那么利用 [ctrl]+w+↓移动到下方窗口后,按下 :q 即可离开,也可以按下 [ctrl]+w+q 啊! |
打开一个文件
[root@localhost tmp]# vim aaa
输入:sp aaa
回车后
本章同步视频:https://edu.51cto.com/sd/e4874
6.4 总结
l vi 为所有 unix like 的操作系统都会存在的编辑器,且执行速度快速;
l vi 有三种模式,一般指令模式可变换到编辑与指令列模式,但编辑模式与指令列模式不能互换;
l vim 会主动的建立 swap 暂存档,所以不要随意断线!
l vim 的环境设定可以写入在 ~/.vimrc 档案中;
l