一、VI的使用

1.关于vi

vi共分为三种模式,分别是一般命令模式编辑模式命令行模式。这三种模式的作用分别是:

(1)一般模式:以vi打开一个文件就直接进入一般模式了。在这个模式中,你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理文件内容,也可以使用『复制、粘贴』来处理你的文件数据。

(2)编辑模式:在一般模式中可以进行删除、复制、粘贴等等的动作,但是却无法编辑文件内容。按下“i,I,o,O,a,A,r,R”等任何一个字母之后才会进入编辑模式。通常在Linux中,按下这些按键时,在画面的左下方会出现『INSERT或REPLACE』的字样,此时才可以进行编辑。而如果要回到一般模式时,则必须要按下『Esc』这个按键即可退出编辑模式。

(3)命令行模式:在一般模式中,输入“:/?”三个中的任何一个,就可以将光标移动到最下面那一行。在这个模式之中,可以搜索数据,也可以读取、保存、大量替换字符、离开vi、显示行号等。

总的来说,这三种模式的关系如图所示:

图1.1 三种模式关系图

2.按键说明

第一部分:一般模式可以使用的命令:光标移动、复制粘贴、查找替换等。

移动光标的方法
h或向左箭头键(←)光标向左移动一个字符
j或向下箭头键(↓)光标向下移动一个字符
k或向上箭头键(↑)光标向上移动一个字符
l或向右箭头键(→)光标向右移动一个字符
[Ctrl]+[f]屏幕『向下』移动一页,相当于[PageDown]按键(常用)
[Ctrl]+[b]屏幕『向上』移动一页,相当于[PageUp]按键(常用)
[Ctrl]+[d]屏幕『向下』移动半页
[Ctrl]+[u]屏幕『向上』移动半页
+光标移动到非空格符的下一行
-光标移动到非空格符的上一行
n<space>n表示数字。按下数字后再按空格键,会向右移动n个字符。
0或功能键[Home]这是数字0:移动到这一行的最前面字符处(常用)
$或功能键[End]移动到这一行的最后面字符处(常用)
H光标移动到这个屏幕的最上方那一行的第一个字符
M光标移动到这个屏幕的中央那一行的第一个字符
L光标移动到这个屏幕的最下方那一行的第一个字符
G移动到这个文件的最后一行(常用)
nGn为数字。移动到这个文件的第n行。
gg移动到这个文件的第一行,相当于1G啊!(常用)
n<Enter>n为数字。光标向下移动n行(常用)
查找与替换
/word向光标之下寻找一个名称为word的字符串。
?word向光标之上寻找一个字符串名称为word的字符串。
n这个n是英文按键。代表『重复前一个搜寻的动作』。
N这个N是英文按键。为『反向』进行前一个搜寻动作。
:n1,n2s/word1/word2/gn1与n2为数字。在第n1与n2行之间寻找word1这个字符串,并将该字符串替换为word2。
:1,$s/word1/word2/g从第一行到最后一行寻找word1字符串,并将该字符串替换为word2(常用)
:1,$s/word1/word2/gc从第一行到最后一行寻找word1字符串,并将该字符串替换为word2!且在替换前显示提示字符给用户确认(confirm)是否需要替换(常用)
删除、复制与贴上
x,X在一行字当中,x为向后删除一个字符(相当于[del]按键),X为向前删除一个字符(相当于[backspace]亦即是退格键)(常用)
nxn为数字,连续向后删除n个字符。举例来说,我要连续删除10个字符,『10x』。
dd删除光标所在的那一整行(常用)
nddn为数字。删除光标所在的向下n行, (常用)
d1G删除光标所在到第一行的所有数据
dG删除光标所在到最后一行的所有数据
d$删除光标所在处,到该行的最后一个字符
d0删除光标所在处,到该行的最前面一个字符
yy复制光标所在的那一行(常用)
nyyn为数字。复制光标所在的向下n行, (常用)
y1G复制光标所在行到第一行的所有数据
yG复制光标所在行到最后一行的所有数据
y0复制光标所在的那个字符到该行行首的所有数据
y$复制光标所在的那个字符到该行行尾的所有数据
p,Pp为将已复制的数据在光标下一行粘贴,P则粘贴在上一行。
J将光标所在行与下一行的数据结合成同一行
c重复删除多个数据,例如向下删除10行,[10cj]
u复原前一个动作。(常用)
[Ctrl]+r重做上一个动作。(常用)
.意思是重复前一个动作的意思。如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了!(常用)

第二部分:一般模式切换到编辑模式的可用的按键说明:

进入插入或替换的编辑模式
i,I进入插入模式(Insert mode):i为从目前光标所在处插入,I为在目前所在行的第一个非空格符处开始插入。(常用)
a,A进入插入模式(Insert mode):a为从目前光标所在的下一个字符处开始插入,A为从光标所在行的最后一个字符处开始插入。(常用)
o,O进入插入模式(Insert mode):o为在目前光标所在的下一行处插入新的一行;O为在目前光标所在处的上一行插入新的一行(常用)
r,R进入替换模式(Replace mode):r只会替换光标所在的那一个字符一次;R会一直替换光标所在的文字,直到按下ESC为止。(常用)
[Esc]退出编辑模式,回到一般模式中(常用)

第三部分:一般模式切换到命令行模式的可用的按键说明:

命令行模式的储存、离开等指令
:w将编辑的数据写入硬盘文件中(常用)
:w!若文件属性为“只读”时,强制写入该文件。不过,是否能写入与你对文件的权限有关。
:q离开vi(常用)
:q!若曾修改过文件,又不想储存,使用!为强制离开不储存文件。
:wq储存后离开,若为:wq! 则为强制储存后离开(常用)
ZZ若文件没有更动,则不储存离开,若文件已经被更动过,则储存后退出。
:w[filename]将编辑的数据储存成另一个文件(类似另存为)
:r[filename]在编辑的数据中,读入另一个文件的数据。即将filename这个文件内容加到光标所在行后面
:n1,n2w[filename]将n1到n2的内容储存成filename这个文件。
:!command暂时离开vi到指令行模式下执行command的显示结果。
vim环境的变更
:setnu显示行号,设定之后,会在每一行的前缀显示该行的行号。
:setnonu与setnu相反,为取消行号。

3.vim的保存文件、恢复与打开时的警告信息

在目前主要的文本编辑软件都会有“恢复”的功能,即当你的系统因为某些原因而导致类似死机的情况时,还可以透过某些特别的机制来让你将之前未储存的数据恢复回来。VIM是通过“保存文件”来挽回文件。

当我们在使用vim编辑时,vim会在被编辑的文件的目录下,再建立一个名为.filename.swp的文件。如果你的系统因为某些原因死机,导致编辑的文件没有保存,这个时候该文件就能发挥恢复功能。

当死机以后,由于vim的工作被不正常的中断,会导致保存文件无法通过正常流程结束,所以暂存文件就不会消失,而是继续保留下来。此时,如果我们想继续编辑那个文件,则会出现以下警告:

E325: ATTENTION  <==錯誤代碼

Found a swap file by the name ".man_db.conf.swp"  <==底下多行说明有暂存档的存在

owned by: dmtsai   dated: Mon Jul  6 23:54:16 2015

file name: /tmp/vitest/man_db.conf  <==这个暂存文件是哪个文件的暂存档

modified: no

user name: dmtsai   host name: study.centos.vbird

process ID: 31851

While opening file "man_db.conf"

dated: Mon Jul  6 23:47:21 2015

在这个暂存文件警告的界面中,有六个可以使用的按键,分别如下:

(1)[O]pen Read-Only:以只读模式打开此文件。

(2)[E]dit anyway:以正常方式打开你要编辑的文件,并不会载入暂存文件的内容。

(3)[R]ecover:载入暂存文件的内容。当你恢复文件后储存并打算离开vim的时候,需要自行删除swp文件。

(4)[D]elete it:删除暂存文件。

(5)[Q]uit:离开vim。

(6)[A]bort:忽略这个编辑行为。

二、VIM的额外功能

如果你使用vi后,却看到画面的右下角有显示目前光标所在的行行号码,那么你的vi已经被vim所取代。

1.块选择

当我们按下v或者V或者[Ctrl]+V时,这个时候光标移动过的地方就会开始反白,这三个按键的意义如下。

区块选择的按键意义
v字符选择,会将光标经过的地方反白选择。
V行选择,会将光标经过的行反白选择。
[Ctrl]+v区块选择,可以用长方形的方式选择资料。
y将反白的地方复制。
d将反白的地方删除。
p将刚刚复制的区块,在光标所在处粘贴。

 

2.多文件编辑

使用vim的按键同时打开多个文档:

多文件编辑的按键
:n编辑下一个文件
:N编辑上一个文件
:files列出目前这个vim的开启的所有文件

 

3.多窗口功能

在命令列模式输入『:sp {filename}』即可!那个 filename 可有可无, 如果想要在新窗口启动另一个档案,就加入档名,否则仅输入 :sp 时, 出现的则是同一个档案在两个窗口。

常用功能如下:

多窗口情况下的按键功能
: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 啊!

 

4.vim的字补全功能

组合按钮补齐的内容
[ctrl]+x -> [ctrl]+n透过目前正在编辑的这个『文件的内容文字』作为关键词,予以补齐
[ctrl]+x -> [ctrl]+f以当前目录内的『文件名』作为关键词,予以补齐
[ctrl]+x -> [ctrl]+o以扩展名作为语法补充,以vim内建的关键词,予以补齐

 

5.vim环境设置与记录:~/.vimrc~/.viminfo

vim 会主动的将你曾经做过的行为登录下来,那个记录动作的文件就是: ~/.viminfo

可以输入:set all查看所有的选项,如图2.1所示。

图2.1 setall选项图

    各个选项设置如下:

vim 的环境设定参数
:set nu
:set nonu
设定与取消行号
:set hlsearchhlsearch就是highlightsearch(高亮度搜寻)。
:set autoindent
:set noautoindent
是否自动缩排。autoindent就是自动缩排。
:set backup是否自动储存备份档。一般是nobackup的。
:set ruler就是在显示或不显示该设定值的啦!
:set showmode是否要显示--INSERT--之类的字眼在左下角的状态栏。
:set backspace=(012)一般来说,如果我们按下i进入编辑模式后,可以利用退格键(backspace)来删除任意字符的。但是,某些distribution则不许如此。此时,我们就可以透过backspace来设定啰~当backspace为2时,就是可以删除任意值;0或1时,仅可删除刚刚输入的字符,而无法删除原本就已经存在的文字了!
:set all显示目前所有的环境参数设定值。
:set显示与系统默认值不同的设定参数,一般来说就是你有自行变动过的设定参数啦!
:syntax on
:syntax off
是否依据程序相关语法显示不同颜色
:set bg=dark
:set bg=light
可用以显示不同的颜色色调

当我们想要使用自己的习惯而不是VIM默认习惯的时候,可以修改~/.vimrc这个文件。比如说你可以这样写:

[dmtsai@study ~]$ vim ~/.vimrc"这个档案的双引号 (") 是批注

set hlsearch            "高亮度反白

set backspace=2         "可随时用退格键删除

set autoindent          "自动缩排

 

6.vim常用指令示意图

图2.2 常用指令示意图(图片来源于deniro)

三、其它VIM使用注意事项

1.中文编码的问题

修正中文编码:LANG=zh_CN.UTF-8

2.DOSLinux的断行字符

在DOS使用的断行字符为^M,我们称为CR与LF两个符号。而在Linux底下,则是仅有LF()这个断行符号。

在Linux底下的命令在开始执行时,他的判断依据是『Enter』,而Linux的Enter为LF符号,不过,由于DOS的断行符号是CRLF,也就是多了一个^M的符号出来,在这样的情况下,如果是一个shell script的程序档案,呵呵~将可能造成『程序无法执行』的状态,因为他会误判程序所下达的指令内容

我们所需要的指令默认没有安装,在没有网络的情况下,使用安装光盘,然后输入下面的命令(在root权限下)。

[root@study ~]# mount /dev/sr0 /mnt

[root@study ~]# rpm -ivh /mnt/Packages/dos2unix-*

warning: /mnt/Packages/dos2unix-6.0.3-4.el7.x86_64.rpm: Header V3 RSA/SHA256 ....

Preparing...                          ################################# [100%]

Updating / installing...

1:dos2unix-6.0.3-4.el7             ################################# [100%]

[root@study ~]# umount /mnt

[root@study ~]# exit

命令格式如下。

[dmtsai@study ~] dos2unix [-kn] file [newfile] [dmtsai@study ~] unix2dos [-kn] file [newfile]

选项与参数:

-k  :保留该文件原本的 mtime 时间格式 (不更新档案上次内容经过修订的时间)

-n  :保留原本的旧档,将转换后的内容输出到新档案,如: dos2unix -n old new

 

3.语系编码转换

如何将GBK编码转成UTF8编码呢?可以使用iconv指令。

[dmtsai@study ~] iconv --list [dmtsai@study ~] iconv -f 原本编码 -t 新编码 filename [-o newfile]

选项与参数:

--list:列出iconv支持的语系数据

-f:from,亦即来源之意,后接原本的编码格式;

-t:to,亦即后来的新编码要是什么格式;

-o file:如果要保留原本的档案,那么使用-o新文件名,可以建立新编码文件。