一、Linux上面的指令都默认使用vi作为数据编辑的接口,所以一定要学会vi
二、vim是vi的进阶版本,vim可以用颜色或底线等方式来显示一些特殊的信息,vi是老式的文书处理器。vim是个“程序编辑器”,具有颜色显示的功能,并且还支持许多的程序语法(syntax),当你使用vim编辑程序时(不论是C语言,还是shell script),vim可帮你直接进行“程序除错(debug)”
一、vi分为三种模式:一般指令模式、编辑模式、命令行命令模式

使用vi来创建一个名为welcome.txt的文件:
vi filename进入一般指令模式:[dmtsai@study ~]$ /bin/vi welcome.txt
# 在CentOS7中,由于一般帐号默认vi已经被vim取代了,因此要输入绝对路径来执行才行!
整个画面主要分为两部份,上半部与最底下一行两者可以视为独立的,图中那个虚线是不存在的,本文用来说明而已啦!上半部显示的是档案的实际内容,最底下一行则是状态显示列(如下图的[New File]信息),或者是命令下达列:

如果你开启的档案是旧档(已经存在的档案),则可能会出现如下的信息:

箭头所指的那个/etc/man.config" 141L, 4617C代表的是『档名为/etc/man.conf,档案内有141行以及具有4617个字符』的意思! 那一行的内容并不是在档案内,而是在vi显示一些信息的地方喔!
i进入编辑模式,开始编辑文字
注意:在vi里面,[tab]这个按钮所得到的结果与空格符所得到的结果不一样[ESC] 按钮回到一般指令模式vi环境:输入:wq即可存盘离开!注意:
- 按下
:光标就会移动到最下面一行去!- 存盘(write)并离开(quit)
在提示字符后面输入ls -l就可以看到我们刚刚创建的welcome.txt文件啦!整个图示有点像下面这样:

如果你的文件权限不对,例如为-r--r--r--时,那么可能无法写入,此时可以使用强制写入的方式,即使用:wq!(多加一个惊叹号即可!)不过,这是在你的权限可以改变的情况下才能成立的!
一、光标移动
| 移动光标的方法 | |
|---|---|
| h 或 向左方向键(←) | 光标向左移动一个字符 |
| j 或 向下方向键(↓) | 光标向下移动一个字符 |
| k 或 向上方向键(↑) | 光标向上移动一个字符 |
| l 或 向右方向键(→) | 光标向右移动一个字符 |
| l 或 向右方向键(→) | 光标向右移动一个字符 |
如果你将右手放在键盘上的话,你会发现hjkl是排列在一起的,因此可以使用这四个按钮来移动光标。如果想要进行多次移动的话,例如向下移动30列,可以使用30j或30↓的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可! | |
| [Ctrl] + [f] | 屏幕“向下”移动一页,相当于 [Page Down]按键 (常用) |
| [Ctrl] + [b] | 屏幕“向上”移动一页,相当于 [Page Up] 按键 (常用) |
| [Ctrl] + [d] | 屏幕“向下”移动半页 |
| [Ctrl] + [u] | 屏幕“向上”移动半页 |
| + | 光标移动到非空白字符的下一列 |
| - | 光标移动到非空白字符的上一列 |
n | 那个 n 表示“数字”,例如20。按下数字后再按空白键,光标会向右移动这一列的n个字符。例如20则光标会向后面移动20个字符距离。 |
| 0或功能键[Home] | 移动到这一行的最前面字符处(常用) |
| $或功能键[End] | 移动到这一行的最后面字符处(常用) |
| H | 光标移动到这个屏幕的最上方那一行的第一个字符 |
| M | 光标移动到这个屏幕的中央那一行的第一个字符 |
| L | 光标移动到这个屏幕的最下方那一行的第一个字符 |
| G | 移动到这个文件的最后一行(常用) |
| nG | n为数字。移动到这个文件的第n行。例如20G则会移动到这个文件的第20行(可配合:set nu) |
| gg | 移动到这个文件的第一行,相当于1G啊!(常用) |
n | n为数字。光标向下移动n行(常用) |
二、搜寻与取代
| 方法 | 含义 |
|---|---|
| /word | 向光标之下寻找一个名称为word的字串 |
| ?word | 向光标之上寻找一个字串名称为word的字串 |
| n | 这个n是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行/vbird去向下搜寻vbird这个字串,则按下n后,会向下继续搜寻下一个名称为vbird的字串。如果是执行?vbird的话,那么按下n则会向上继续搜寻名称为vbird的字串! |
| N | 这个N是英文按键。与n刚好相反,为“反向”进行前一个搜寻动作。例如/vbird后,按下N则表示“向上”搜寻vbird 。 |
| :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) 是否需要取代!(常用) |
三、删除、复制与贴上
| 方法 | 含义 |
|---|---|
| x, X | x为向后删除一个字符(相当于[del]按键),X为向前删除一个字符(相当于[backspace]亦即是倒退键) (常用) |
| nx | n为数字,连续向后删除n个字符。举例来说,我要连续删除10个字符:10x |
| dd | 删除光标所在的那一整列(常用) |
| ndd | n为数字。删除光标所在的向下n行,例如20dd则是删除20行(常用) |
| d1G | 删除光标所在到第一行的所有数据 |
| dG | 删除光标所在到最后一行的所有数据 |
| d$ | 删除光标所在处,到该行的最后一个字符 |
| d0 | 删除光标所在处,到该行的最前面一个字符 |
| yy | 复制光标所在的那一行(常用) |
| nyy | n 为数字。复制光标所在的向下n行,例如20yy则是复制20行(常用) |
| y1G | 复制光标所在行到第一行的所有数据 |
| yG | 复制光标所在列到最后一列的所有数据 |
| y0 | 复制光标所在的那个字符到该行行首的所有数据 |
| y$ | 复制光标所在的那个字符到该行行尾的所有数据 |
| p, P | p为将已复制的数据在光标下一行贴上,P则为贴在光标上一列!举例来说,我目前光标在第20行,且已经复制了10行数据。则按下p后,那10行数据会贴在原本的20行之后,亦即由21行开始贴。但如果是按下P呢?那么原本的第20行会被推到变成30行。(常用) |
| J | 将光标所在行与下一行的数据结合成同一行 |
| c | 重复删除多个数据,例如向下删除10列:[10cj] |
| u | 复原前一个动作。(常用) |
| [Ctrl]+r | 重做上一个动作。(常用) |
| . | 重复前一个动作。如果你想要重复删除、重复贴上等等动作,按下小数点.就好了!(常用) |
| 进入插入或取代的编辑模式 | |
|---|---|
| i, I | 进入插入模式(Insert mode):i为从目前光标所在处插入,I为在目前所在行的第一个非空白字符处开始插入。(常用) |
| a, A | 进入插入模式(Insert mode):a为从目前光标所在的下一个字符处开始插入,A 为从光标所在列的最后一个字符处开始插入。(常用) |
| r, R | 进入取代模式(Replace mode):r只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下ESC为止;(常用) |
| [Esc] | 退出编辑模式,回到一般指令模式中(常用) |
上面除最后一个[Esc]按键外,在vi画面的左下角处会出现--INSERT--或--REPLACE--的字样。你想要在文件里面输入字符时,一定要在左下角处看到 INSERT或REPLACE才能输入喔!
| 命令行界面的储存、离开等指令 | |
|---|---|
| :w | 将编辑的数据写入硬盘文件中(常用) |
| :w! | 若文件属性为只读时,强制写入该文件。不过到底能不能写入,还是跟你对该文件的文件权限有关啊! |
| :q | 离开vi(常用) |
| :q! | 若曾修改过文件,又不想储存,使用!为强制离开不储存盘案。 |
注意:惊叹号 (!) 在vi当中,常常具有强制的意思 | |
| :wq | 储存后离开,若为:wq!则为强制储存后离开(常用) |
| ZZ | 若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开! |
| :w [filename] | 将编辑的数据储存成另一个文件(类似另存新文件) |
| :r [filename] | 在编辑的数据中,读入另一个文件的数据。亦即将filename这个文件内容加到光标所在行后面 |
| :n1,n2 w [filename] | 将n1到n2的内容储存成filename这个文件。 |
| :! command | 暂时离开vi到命令行界面下执行command的显示结果!例如:! ls /home表示可在vi当中察看/home下面以ls输出的文件信息! |
| vim环境的变更 | |
| :set nu | 显示行号,设置之后,会在每一列的字首显示该行的行号 |
| :set nonu | 与set nu相反,为取消行号! |
在vi中,数字通常代表重复做几次,或去到第几个什么什么的意思。举例来说,要删除50行,则是用50dd,数字加在动作之前~要向下移动20行就是20j或者是20↓
一、回复:当你的系统因为某些原因而导致类似死机的情况时,还可以通过某些特别的机制来让你将之前未储存的数据“救”回来!
二、当我们在使用vim编辑时,vim会在与被编辑的文件的目录下,再创建一个名为.filename.swp的文件。比如说我们在上一个小节谈到的编辑 /tmp/vitest/man_db.conf这个文件时,vim会主动的创建 /tmp/vitest/.man_db.conf.swp的暂存盘,你对man_db.conf做的动作就会被记录到这个.man_db.conf.swp当中喔!如果你的系统因为某些原因断线了,导致你编辑的文件还没有储存,这个时候.man_db.conf.swp就能够发挥救援的功能了!
三、如果在多人共同编辑的情况下, 万一大家同时储存,那么这个文件的内容将会变的乱七八糟!为了避免这个问题,因此vim会出现警告窗口! 解决的方法则是:
o即可,其实就是 [O]pen Read-Only的选项啦!四、在前一个vim的环境中,可能因为某些不知名原因导致vim中断(crashed):这就是常见的不正常结束vim产生的后果。常见的处理方法为:
R,亦即使用(R)ecover的项目, 此时vim会载入.man_db.conf.swp的内容,让你自己来决定要不要储存!这样就能够救回来你之前未储存的工作。不过那个.man_db.conf.swp并不会在你结束vim后自动删除,所以你离开vim后还得要自行删除.man_db.conf.swp才能避免每次打开这个文件都会出现这样的警告!D删除掉这个暂存盘,亦即(D)elete这个项目即可。此时vim会载入man_db.conf,并且将旧的.man_db.conf.swp删除后,创建这次会使用的新的.man_db.conf.swp喔!五、在发现暂存盘警告讯息的画面中,有出现六个可用按钮:
一、如果你使用vi后,却看到画面的右下角有显示目前光标所在的行列号码,那么你的vi已经被vim所取代
二、
[dmtsai@study ~]$ alias
....其他省略....
alias vi='vim' #重点在这行,这表示当你使用vi这个指令时,其实就是执行vim啦!如果你没有这一行,那么你就必须要使用vim filename来启动vim
三、vim的一般用法与vi完全一样~没有不同
四、假设我想要编辑/etc/services ,则输入vim /etc/services展示如下:

说明:
/etc/services是系统规划的配置文件,因此vim会进行语法检验,所以你会看到画面中内部主要为深蓝色,且深蓝色那一行是以注解符号(#)开头;如果你向下移动到其他位置时,出现的非注解的数据就会有点像这样:

说明:最右下角的1%代表目前这个画面占整体文件的1%
刚刚我们提到的简单的vi操作过程中,几乎提到的都是以行为单位的操作。那么如果我想要搞定的是一个区块范围呢? 举例来说,像底下这种格式的档案:
192.168.1.1 host1.class.net
192.168.1.2 host2.class.net
192.168.1.3 host3.class.net
192.168.1.4 host4.class.net
.....中间省略......
假设我想要将host1, host2...等等复制起来,并且加到每一行的后面,亦即每一行的结果得是192.168.1.2 host2.class.net host2这样的情况时,传统或现代的窗口型编辑器不容易达到这个需求,但是vim使用区块选择 (Visual Block) 可以办到!当我们按下v或者V或者[Ctrl]+v时,光标移动过的地方就会开始反白,这三个按键的意义分别是:
| 区块选择的按键意义 | |
|---|---|
| v | 字符选择,会将光标经过的地方反白选择! |
| V | 行选择,会将光标经过的行反白选择! |
| [Ctrl]+v | 区块选择,可以用长方形的方式选择资料 |
| y | 将反白的地方复制起来 |
| d | 将反白的地方删除掉 |
实际操作:
vim hosts来开启该档案

y来进行复制,当你按下y之后,反白的区块就会消失不见p后,如下图所示:
假设你想要将刚刚hosts内的IP复制到/etc/hosts中,那么该如何编辑?我们知道在vi内可以使用:r filename来读入某个档案的内容,不过,这样毕竟是将整个档案读入啊!如果我只是想要部分内容呢?这个时候多档案同时编辑就很有用了。我们可以使用vim后面同时接好几个档案来同时开启喔!相关的按键有:
| 多档案编辑的按键 | |
|---|---|
| :n | 编辑下一个档案 |
| :N | 编辑上一个档案 |
| :files | 列出目前这个vim的开启的所有档案 |
操作:
vim hosts /etc/hosts指令来使用一个vim开启两个档案;:files察看一下编辑的档案数据有啥?结果如下所示,图中最后一行显示的是『按下任意键』就会回到vim的一般模式中!
4yy复制四行;:n会来到第二个编辑的档案,亦即/etc/hosts内;/etc/hosts下按G到最后一行,再输入p贴上;u来还原原本的档案数据;:q来离开vim的多档案编辑吧!一、先来想象两个情况:
[ctrl]+f与[ctrl]+b(或pageup, pagedown功能键)来跑前跑后查阅?二、如何分割窗口并放入档案:在指令列模式输入:sp {filename},其中filename可有可无,如果想要在新窗口启动另一个档案,就加入档名,否则仅输入:sp时,出现的则是同一个档案在两个窗口间!
三、操作:先使用vim /etc/man.config打开档案,然后1G去到第一行,之后输入:sp再次的打开这个档案一次,然后再输入G,结果会变成底下这样喔:

如果你再输入:sp /etc/hosts,就会变成下图这样喔:

你还可以利用[ctrl]+w+↑及[ctrl]+w+↓在两个窗口之间移动呢!分割窗口的相关指令功能有很多,不过你只要记得这几个就好了:
| 多窗口情况下的按键功能 | |
|---|---|
| :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啊! |
如果我们以vim来搜寻一个档案内部的某个字符串时,这个字符串会被反白,而下次我们再次以vim编辑这个档案时,该搜寻的字符串反白情况还是存在!甚至在编辑其他档案时,如果其他档案内也存在这个字符串,还是主动反白!另外,当我们重复编辑同一个档案时,当第二次进入该档案时,游标竟然就在上次离开的那一行上头!这是因为vim会主动将你曾经做过的行为记录下来,那个记录动作的档案就是:~/.viminfo!如果你曾经使用过vim,那你的家目录应该会有这个档案。这个档案是自动产生的,你不必自行建立。而你在vim里头所做过的动作,就可以在这个档案内部查询到
二、每个distributions对vim的预设环境都不一样,举例来说,某些版本在搜寻到关键词时并不会高亮度反白,有些版本则会主动的帮你进行缩排(缩排:当你按下Enter编辑新的一行时,光标不会在行首,而是在与上一行的第一个非空格符处对齐!)的行为。但这些其实都可以自行设定的,那就是vim的环境设定。vim的环境设定参数有很多,如果你想要知道目前的设定值,可以在一般模式时输入:set all来查阅,以下给出常用、简单的设定值:
| 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 |
我是否每次使用 vim 都要重新设定一次各个参数值? 这不太合理吧?没错啊!所以,我们可以透过配置文件来直接规定我们习惯的 vim 操作环境呢! 整体 vim 的设定值一般是放置在 /etc/vimrc 这个档案,不过,不建议你修改他! 你可以修改 ~/.vimrc 这个档案 (预设不存在,请你自行手动建立!),将你所希望的设定值写入!
[root@www ~]# vim ~/.vimrc
"这个档案的双引号 (") 是批注
set hlsearch "高亮度反白
set backspace=2 "可随时用退格键删除
set autoindent "自动缩排
set ruler "可显示最后一行的状态
set showmode "左下角那一行的状态
set nu "可以在每一行的最前面显示行号啦!
set bg=dark "显示不同的底色色调
syntax on "进行语法检验,颜色显示。
在这个档案中,使用set hlsearch或:set hlsearch(最前面有没有冒号:效果都是一样的!) 至于双引号则是批注符号!不要用错批注符号,否则每次使用vim时都会发生警告讯息。建立好这个档案后,当你下次重新以vim编辑某个档案时,该档案的预设环境设定就是上头写的啰~
一、因为中文编码有big5与utf8两种,如果你的文件是使用big5编码制作的,但在vim的终端接口中你使用的是万国码(utf8),由于编码的不同,你的中文文件内容当然就是一堆乱码了!这时你得要考虑许多东西:
/etc/locale.conf有关;LANG, LC_ALL这几个变量有关;事实上最重要的是上头的第三与第四点,只要这两点的编码一致,你就能够正确的看到与编辑你的中文文件。否则就会看到一堆乱码啦!
二、假设文件内编码为big5,环境是使用Linux的GNOME,启动的终端接口为GNOME-terminal软件, 那鸟哥通常是这样来修正语系编码的行为:
[dmtsai@study ~]$ LANG=zh_TW.big5
[dmtsai@study ~]$ export LC_ALL=zh_TW.big5
然后在终端接口工具列的“终端机”-->“设置字符编码” -->“中文 (正体) (BIG5)”项目点选一下, 如果一切都没有问题了,再用vim去打开那个big5编码的文件
想要将big5编码转成utf8,使用iconv这个指令即可!
[dmtsai@study ~]$ iconv --list
[dmtsai@study ~]$ iconv -f 原本编码 -t 新编码 filename [-o newfile]
# 选项与参数:
# --list:列出 iconv 支持的语系数据
# -f:from,亦即来源之意,后接原本的编码格式;
# -t:to,亦即后来的新编码要是什么格式;
# -o file:如果要保留原本的文件,那么使用-o 新文件名,可以创建新编码文件。
# 范例一:将 =/tmp/vitest/vi.big5 转=成 utf8 编码吧!
[dmtsai@study ~]$ cd /tmp/vitest
[dmtsai@study vitest]$ iconv -f big5 -t utf8 vi.big5 -o vi.utf8
[dmtsai@study vitest]$ file vi*
vi.big5: ISO-8859 text, with CRLF line terminators
vi.utf8: UTF-8 Unicode text, with CRLF line terminators
# 范例二:将刚刚那个vi.utf8转成简体的utf8:
[root@www vitest]iconv -f utf8 -t big5 vi.utf8 | \
> iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o vi.gb.utf8