vim文本编辑器


一.vi/vim文本编辑器

回到顶部
我们经常需要对linux系统服务进行配置,不同的Linux distribution都配备了各自的系统配置管理工具, 比如Red Hat Enterprise Linux与Fedora的ntsysv与setup,SuSE则有YAST管理工具。 而配置服务最常用的方式就是编辑服务对应的配置文件。在Linux中,绝大部分服务的配置文件都是以ASCII纯文本形态存在, 这些管理工具都是通过修改配置文件来设置系统参数的。我们也可以直接利用文本编辑器来修改文本配置文件,来对系统进行参数配置。 在Linux系统中使用文本编辑器来编辑配置文件从而对系统进行配置,是系统管理员必备的一项技能! 在图形界面模式下有很多可用的文本编辑器如xemacs,而在命令行模式下,可用的文本编辑器也有很多, 经常听说的就有emacs, pico, nano, joe和vim等。 这么多文本编辑器我们该选择哪一个呢?我们为什么要学习vim编辑器?
所有的linux发行版默认的命令行文本编辑器都是vi。vi就相当于windows下的记事本,是系统内置的文本编辑器。 许多带有编辑功能的命令默认也是调用vi作为编辑接口。例如后面会介绍的crontab、visudo、edquota等。 所以如果不熟悉vi的话,很多命令都没法继续操作了。
vim作为vi的改进版本,具有更多高级强大的功能,例如支持正则表达式的搜寻模式、多文件编辑、区块复制等。 这对于我们在Linux上进行一些配置文件的修改工作时是很棒的功能。
利用vim我们不仅可以编辑修改服务的配置文件,也可以用来编写shell script, C program等程序文件, vim会根据文件的扩展名或者是文件内的开头信息, 自动判断文件中的语法信息,并用不同的颜色来区别显示。 所以我们也可以用vim来进行语法检查,方便程序设计;
所以vim不但可以修改编辑系统配置文件,更多的时候也被程序开发者作为开发程序的必备工具。 而vim自己也强调自己是程序开发工具。
另外由于vi/vim程序设计简单,编辑速度也非常快速。 总之,vi/vim就是linux下默认的命令行文本编辑器。是必须要掌握的。学会后,您将在Linux的世界里畅行无阻
在目前的绝大多数Linux发行版中,vim已经替换vi作为默认的文本编辑器。 所以不管是输入vi还是vim,实际运行的都是vim。 可以通过whereis追踪vi的可执行文件路径,最后会发现其实就是vim

二.vi/vim的使用

回到顶部

1.vi/vim三种模式切换

回到顶部
vi/vim一共有三种运行模式,分别是普通模式、编辑模式和命令行模式。 三种模式的说明如下:
vi三种运行模式
vi三种运行模式
vi模式 模式说明
普通指令模式
command mode
vi默认的打开模式,我们在命令行用vi打开一个文件就会直接进入普通模式。在普通模式下可以对vi下达不同的功能指令。 例如用上下左右按键移动光标,用d指令删除字符,使用y和p指令粘贴和复制文本等。 在一般模式中可以进行删除、复制和粘贴的功能,但是无法编辑文件内容。
以vi打开一个文件就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用上下左右按键来移动光标, 你可以使用删除字符或删除整行来处理文件内容, 也可以使用复制、粘贴来处理你的文件数据。
在编辑模式和命令行模式下,按ESC键都会返回到普通模式。
编辑模式
insert mode
在一般模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容。 在普通模式下按下进入编辑模式的指令即可进入编辑模式,这些按键指令包括:i, I, o, O, a, A, r, R等。 在编辑模式下,界面左下方会出现--INSERT--或--REPLACE--的字样。在编辑模式下可以对文件内容进行编辑。 按下Esc键就会退出编辑模式,并回到普通模式。 注意虽然在普通模式下可以进行删除字符、复制和粘贴等编辑动作,但那只是普通模式下某个指令的功能。只有编辑模式才可以真正的编辑文本。
命令行模式
command-line mode
在普通模式下输入':'、'/'、'?'这三个中的任意一个指令即可进入命令行模式。在命令行模式下,光标会移动到最底下一行,等待用户的输入。 在命令行模式下,用户可以执行文件内搜索,字符替换、设置vim编辑环境如显示行号、保存、退出等动作。 同样也是按下Esc键就会退出命令行模式,并回到普通模式。
需要注意编辑模式与命令行模式之间是不能互相切换的。
vim运行模式切换关系如下图所示:
vim运行模式切换 图 vi三种模式的相互切换
注意一般指令模式可以进入编辑模式和命令行模式, 但编辑模式与命令行模式不能互相切换。任何模式下都可以通过ESC进入普通指令模式!
另外注意普通指令模式和命令行模式的区别,普通指令模式直接执行用户的输入指令,但是不会提供光标输入。而命令行模式会在底部提供光标供用户输入。

2.vi/vim简单示例

回到顶部
我们先通过一个简单的示例来了解vim的用法。通过vim打开一个文件,编辑后保存退出。
1.首先通过vi或者vim打开一个文件,文件名为initroot.txt,如果文件不存在默认就会创建该文件:
  [root@initroot ~]$ vim initroot.txt
上面的命令不管是用vi还是vim都是一样的,实际调用的都是vim。我们后面的示例都是以vim为例。
vim打开的界面如下图所示: vim打开文件 图 用vim打开一个新文件
整个画面分为两部份,上半部与最底下一行。上半部显示的是文件的实际内容,最底下一行则是 状态显示行(New File信息),或者是命令下达行!。最后一行的内容并不是在文件内,而是 vi 显示一些信息的地 方喔!
画面中的最底下一行,在左边显示该文件的属性,包括只读文件、内容共有 11176 行与 670293 个字符;
最底下一行的右边出现的 1,1 表示光标所在为第一行, 第一个字符位置之意(请看上图中的光标所在);
看到了喔!除了批注之外,其他的行就会有特别的颜色显示呢!可以避免你打错字啊!而且, 最右下角的 1% 代表目前这个画面占整体文件的 1% 之意!
此时vim处于普通指令模式,我们就可以输入vim指令了。
2. 按下i进入编辑模式,开始编辑文字
在一般指令模式之中,只要按下 i, o, a 等指令就可以进入编辑模式了!在编辑模式下, 左下角状态栏中会出现--INSERT--的字样,表示可以输入任意字符!除了Esc键, 键盘上的其他按键都可以被vim当做文本输入,也就是可以进行文本编辑了!
我们输入www.initroot.com,如下图所示: vim编辑模式 图 用vi编辑文件
3. 按下ESC按钮回到普通指令模式
我们已经编辑好了文件,需要保存退出了。但是在保存退出之前,需要先退回到普通指令模式。 只需要按下Esc即可回到普通指令模式。此时左下角的--INSERT--也就消失不见了!!
4. 在普通指令模式下,按下':'指令进入命令行模式
因为保存和退出的命令需要在命令行模式下才能下达,所以我们通过:指令进入命令行模式, 此时光标会移到最底下一行中去,等待用户输入。
5. 在命令行模式,输入wq保存退出vim
在命令行模式下,输入wq,w表示写入(write)保存的意思,q表示退出(quit)vim。 保存并退出vim 图 在命令行模式输入wq保存并离开vim
此时我们回到了linux命令行模式下,可以通过ls -l查看刚刚建立的文件:
  root@initroot:~# ls -al initroot.txt 
-rw-r--r-- 1 root root 17 Jan 14 20:20 initroot.txt
  
这样initroot.txt文件建立好了!有时候可能因为权限问题, vim会提示无法保存,比如文件的权限为-r--r--r-- 时,是没有权限写入的。 不过可以在wq的后面加上一个!感叹号,表示强制执行!感叹号前面的命令。 不过,需要特别注意呦!那个是在你的权限可以改变的情况下才能成立的!
以上就是vim的简单使用。我们下面详细介绍vim的指令。

三.vi/vim常用按键指令说明

回到顶部
除了上面提到的i, Esc, :等指令外,vi/vim还有非常多的按键指令可以使用。 vi的三种模式只有一般指令模式可以与编辑、指令行模式切换,编辑模式与指令行模式 之间并不能切换的!
vi/vim按键指令
第一部份:普通指令模式的按键指令
移动光标
按键指令 指令说明
h或向左箭头键(←) 光标向左移动一个字符
j或向下箭头键(↓) 光标向下移动一个字符
k或向上箭头键(↑) 光标向上移动一个字符
l或向右箭头键(→) 光标向右移动一个字符。
[Ctrl] + [f] 屏幕向下移动一页,相当于[Page Down]按键 (常用)
[Ctrl] + [b] 屏幕向上移动一页,相当于[Page Up]按键 (常用)
[Ctrl] + [d] 屏幕向下移动半页
[Ctrl] + [u] 屏幕向上移动半页
+ 光标移动到非空格符的下一行
- 光标移动到非空格符的上一行
n<space> n表示数字,例如 20 。按下数字后再按空格键,光标会向后移动n个字符。例如20<space> 则光标会向后面移动20个字符距离。
0(数字)

功能键[Home]
移动到本行的行首字符处 (常用)
$ 或功能键[End] 移动到本行的行尾字符处(常用)
w 光标跳到下个字的开头
e 光标跳到下个字的字尾
H 光标移动到屏幕最上方那一行的第一个字符
M 光标移动到屏幕中央那一行的第一个字符
L 光标移动到屏幕最下方那一行的第一个字符
G 移动到文件的最后一行(常用)
nG nG n 为数字。移动到文件的第n行。例如20G则会移动到这个文件的第20行(可配合 :set nu)
gg 移动到文件的第一行,相当于1G啊! (常用)
n<Enter> n为数字。光标向下移动n行(常用)
删除、复制与粘贴
x, X 在光标所在行中,x为向后删除光标所在位置的一个字符 (相当于del按键), X为向前删除光标前面的一个字符(相当于backspace 亦即是退格键) (常用)。 x和X不会跨行删除字符。
nx n为数字,连续向后删除n个字符。举例来说,我要连续删除10个字符, 按下10x。
dd 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 则为贴在游标上一行! 举例来说,我目前 光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本 的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
J 将光标所在行与下一行的数据结合成同一行
c 重复删除多个数据,例如向下删除 10 行,[ 10cj ]
u 复原前一个动作。(常用)
[Ctrl]+r 重做上一个动作。(常用) 这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿! 很快乐的啦!
. 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重 复贴上等等动作,按下小数点『.』就好了! (常用)
第二部份:普通指令模式切换到编辑模式,编辑模式分为插入模式和替换模式
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] 退出编辑模式,回到一般指令模式中(常用),任何模式下都可以按Esc回到普通指令模式
第三部份:普通指令模式切换到命令行模式
保存与退出
:w 将编辑的数据写入硬盘文件中(常用)
:w! 若文件属性为『只读』时,强制写入该文件。不过,到底能不能写入, 还是跟你对该文件 的文件权限有关啊!
:q 离开 vi (常用)
:q! 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存文件。 注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~
:wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用) ZZ 这是大写的 Z 喔!若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开!
:x 保存后离开
ZZ 若文件没有更动,则不保存离开,若文件已经被更改过,则保存后离开
:w [filename] 将编辑的数据储存成另一个文件(类似另存新档)
:r [filename] 在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个文件内容加到游标 所在行后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个文件。
:! command 暂时离开 vi 到指令行模式下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的文件信息!
文件内搜索与替换
/word 向光标之下寻找一个名称为 word 的字符串。例如要在文件内搜寻 vbird 这个字符串, 就输入 /vbird 即可! (常用)
?word 向光标之上寻找一个字符串名称为 word 的字符串。
n 这个 n 是英文按键。代表『重复前一个搜寻的动作』。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串
N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。 使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词! 使用 /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) 是否需要替换!(常用)
vim 环境的设置
:set nu vim显示行号,设定之后,会在每一行的前缀显示该行的行号
:set nonu 与 set nu 相反,为取消行号!
上述是几个最常用的光标移动指令,hjkl在键盘上是排行在一起的,可以使用这四个按钮来快速移动光标。
对于刚接触vim来说,可能不太习惯这样的按键用法,大部分新手更习惯用箭头键来移动光标。 这里强调一定要多多练习使用hjkl来移动光标,一旦习惯了以后,会比使用箭头键效率更高。这也是vim强烈推荐的专业用法。
特别注意,在 vi 中,『数字』是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表 去到第几个什么什么的意思。举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之 前~那我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。如果想要进行多次移动的话,例如向下移动30行,可以使用30j或30↓的组合按键, 即加上想要进行的次数(数字)后,按下动作即可! OK!会这些指令就已经很厉害了,因为常用到的指令也只有不到一半!通常 vi 的指令除了上面鸟 哥注明的常用的几个外,其他是不用背的,你可以做一张简单的指令表在你的屏幕墙上, 一有疑问 可以马上的查询呦!这也是当初使用 vim 的方法啦!
为了方便大家查询在不同的模式下可以使用的 vim 指令,查询了一些 vim 与 Linux 教育训练 手册, 发现底下这张图非常值得大家参考!可以更快速有效的查询到需要的功能喔!看看吧!
vim常用指令示意图 图 vim 常用指令示意图

vim自测练习

回到顶部
来来来!赶紧测试一下你是否已经熟悉 vi 这个指令呢?请依照底下的需求进行指令动作。 (底下的 操作为使用 CentOS 7.1 中的 man_db.conf 来做练习的,该文件你可以在这里下载:
http://linux.vbird.org/linux_basic/0310vi/man_db.conf。) 看看你的显示结果与的结果是否相同啊?
1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录;2. 进入 vitest 这个目录当中;
3. 将 /etc/man_db.conf 复制到本目录底下(或由上述的连结下载 man_db.conf 文件);
4. 使用 vi 开启本目录下的 man_db.conf 这个文件;
5. 在 vi 中设定一下行号;
6. 移动到第 43 行,向右移动 59 个字符,请问你看到的小括号内是哪个文字?
7. 移动到第一行,并且向下搜寻一下『 gzip 』这个字符串,请问他在第几行?
8. 接着下来,我要将 29 到 41 行之间的『小写 man 字符串』改为『大写 MAN 字符串』,并且一个一个挑 选是否需要修改,如何下达指令?如果在挑选过程中一直按『y』 , 结果会在最后一行出现改变了几个 man 呢?
9. 修改完之后,突然反悔了,要全部复原,有哪些方法?
10. 我要复制 66 到 71 这 6 行的内容(含有 MANDB_MAP),并且贴到最后一行之后;
11. 113 到 128 行之间的开头为 # 符号的批注数据我不要了,要如何删除?
12. 将这个文件另存成一个 man.test.config 的檔名;
13. 去到第 25 行,并且删除 15 个字符,结果出现的第一个单字是什么?
14. 在第一行新增一行,该行内容输入『I am a student...』;
15. 储存后离开吧!
整个步骤可以如下显示:
1. 『mkdir /tmp/vitest』
2. 『cd /tmp/vitest』
3. 『cp /etc/man_db.conf .』
4. 『/bin/vi man_db.conf』
5. 『:set nu』然后你会在画面中看到左侧出现数字即为行号。
6. 先按下『43G』再按下『59→』会看到『 as 』这个单字在小括号内;
7. 先执行『1G』或『gg』后,直接输入『/gzip』 ,则会去到第 93 行才对!
8. 直接下达『 :29,41s/man/MAN/gc 』即可!若一直按『y』最终会出现『在 13 行内置换 13 个字符串』的 说明。
9. (1)简单的方法可以一直按『 u 』回复到原始状态,(2)使用不储存离开『 :q! 』之后,再重新读取一次 该文件;
10. 『66G』 然后再『 6yy 』之后最后一行会出现『复制 6 行』之类的说明字样。 按下『 G 』到最后一行, 再给他『 p 』贴上 6 行!
11. 因为 113~128 共 16 行,因此『 113G 』→『 16dd 』就能删除 16 行,此时你会发现游标所在 113 行 的地方变成 『 # Flags. 』 开头啰
12. 『 :w man.test.config 』 ,你会发现最后一行出现 "man.test.config" [New].. 的字样。
13. 『25G』 之后,再给他『 15x 』即可删除 15 个字符,出现『 tree 』的字样;
14. 先『 1G 』去到第一行,然后按下大写的『 O 』便新增一行且在插入模式;开始输入『I am a student...』 后, 按下[Esc]回到一般指令模式等待后续工作;
15. 『:wq』 如果你的结果都可以查的到,那么 vi 的使用上面应该没有太大的问题啦!剩下的问题会是在...打字 练习...。

四.vim的缓存文件、救援恢复与启动时的警告信息

回到顶部
当我们在编辑文件的时候,如果遇到突然断电等原因而导致linux系统意外关机,编辑的文件没有来得及保存, 那么没有来得及保存的数据还能不能找回来呢?vim可以通过缓存文件恢复意外丢失的数据。
当使用vim编辑文件时, vim会在与被编辑文件的目录下,再建立一个名为.filename.swp的缓存文件。 文件前面有个.,所以这是一个隐藏文件。我们对文件的编辑操作都会同步到这个隐藏的缓存文件中。 如果系统因为意外关机,意外崩溃,导致文件没有正常保存,那么这个暂存文件就会发挥作用。我们就可以利用vim创建的缓存文件恢复没有来得及保存的数据。
我们在家目录下创建一个测试目录vimtest,然后用vim打开一个文件test.txt。 此时vim会在vimtest目录下创建一个.test.txt.swp文件,这个文件就是vim为test.txt创建的缓存文件。 我们通过ctrl-z组合键将vim放到后台暂停运行。这时就会回到shell命令行, 我们通过ls -al观察会发现当前目录下多了一个.test.txt.swp文件:
root@initroot:~/vimtest# vim test.txt 
#此时进入vim界面,直接按下ctrl-z组合键将vim进程放到后台暂停运行。
[1]+  Stopped                 vim test.txt
root@initroot:~# ls -al
total 20
drwxr-xr-x  2 root root 4096 Jan 15 10:11 .
drwx------ 14 root root 4096 Jan 15 10:11 ..
-rw-r--r--  1 root root   39 Jan 15 10:11 test.txt
-rw-r--r--  1 root root 4096 Jan 15 10:11 .test.txt.swp
如果vim正常退出,那么.test.txt.swp也会随之消失了。 因为vim是正常退出的,没有数据丢失,不需要救援恢复,所以这个文件也就没有必要保留了。
但是如果vim意外退出,那么这个文件就会保留下来用于数据的恢复救援。
我们通过kill命令将vim进程杀掉,来模仿vim意外退出:

  root@initroot:~# ps aux | grep vim
#一种方法
root@initroot:~# kill -9 n
root@initroot:~# jobs
#另外一种方法
root@initroot:~# kill -9 %1 [1]+ Killed vim test.txt root@initroot:~# ls -al total 20 drwxr-xr-x 2 root root 4096 Jan 15 10:11 . drwx------ 14 root root 4096 Jan 15 10:11 .. -rw-r--r-- 1 root root 39 Jan 15 10:11 test.txt -rw-r--r-- 1 root root 4096 Jan 15 10:11 .test.txt.swp
这样导致暂存盘无法通过正常的流程结束,所以暂存文件不会消失,而是继续保留下来。 通过ls -al命令观察,.test.txt.swp文件依然还在。
因为vim已经退出了,所以我们重新用vim打开test.txt文件:
  root@initroot:~# vim test.txt 
进入vim界面后,会出现如下提示:
  E325: ATTENTION          #错误代码

  #下面是对缓存文件的说明信息
Found a swap file by the name ".test.txt.swp"
          owned by: root   dated: Wed Jan 15 10:11:22 2020
         file name: ~root/test.txt    #缓存文件所缓存的实际文件
          modified: no
         user name: root   host name: initroot
        process ID: 3395
While opening file "test.txt"
             dated: Wed Jan 15 10:11:18 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 test.txt"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".test.txt.swp"
    to avoid this message.

Swap file ".test.txt.swp" already exists!   #下面给出可以执行的动作按键
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort: 
如果打开文件的目录下,有对应文件的缓存文件,那么vim就会主动判断这个文件可能存在问题。 vim首先会行出缓存文件的基本信息,然后给出出现这个缓存文件可能发生的原因以及解决方案:
1.可能有其他用户或程序同时在编辑这个文件。
由于Linux是多用户多任务的环境,因此很有可能会出现多个用户同时编辑某一个文件。 如果多个用户同时编辑同一个文件,势必会造成文件内容的混乱。所以为了避免这个问题,vim希望这个文件同时只能有一个用户在编辑。 所以在用vim打开一个有缓存文件的文件时,vim认为可能已经有人在编辑这个文件了,于是就会给出警告提示。
如果是这种情况的话,我们可以先按q键退出(Q)uit vim,找出正在编辑该文件的用户或者进程,等待用户或者进程结束编辑后,再重新打开文件编辑。 或者如果只是想看看文件的内容而不编辑,可以以只读方式打开[O]pen Read-Only,根据最后一行的提示,只需要输入o键,即可以只读模式打开[O]pen Read-Only。
2.vim给出的第二个可能的原因是,vim可能因为意外原因而崩溃中断了。
我们上面通过kill命令将vim杀死了,就是模拟的这种情况。 这时候如果想要恢复(R)ecover意外丢失的数据,我们就是按下r键,这样vim就会载入.test.txt.swp的内容,覆盖掉test.txt,然后就可以正常编辑文件了。 但是如果你正常结束vim的工作,那个.test.txt.swp文件还是会存在的,需要通过rm命令手动删除该文件。
另外在出现上面的警告界面时,如果确定那个缓存文件是没有用的,也可以按下d键,直接将缓存文件删除(D)elete it。 这时候vim就会加载真正要打开的文件test.txt,同时为该文件建立新的缓存文件.test.txt.swp。
上述输出的最后一行,给出了可用的按键信息。这些按键我们在上面的说明中也已经提到过了:
[O]pen Read-Only:以只读模式打开文件,可以用在你只是想要查阅该文件内容并不想要进行编辑行为时。这样即使有别人在编辑该文件,也不会出现冲突;
(E)dit anyway:仍然打开要编辑的文件, 并不会载入缓存文件的内容。除非你非常确定在做什么,否则不建议用这个;
(R)ecover:用缓存文件恢复要编辑的文件。也就是如果出现意外,我们就通过这个按键恢复丢失的文件数据。 不过当文件恢复,并且正常退出vim后,该缓存文件仍然存在,需要用rm命令手动删除;否则每次打开对应的文件时都会出现这样的提示。

(D)elete it:如果确定缓存文件的内容并不重要,对你是无用的。那么可以用d键直接删除该缓存文件;
(Q)uit:按下q直接退出vim ,不执行任何动作即回到命令提示字符;
(A)bort:忽略这个编辑行为,类似(Q)uit! 也会回到命令提示字符!

五.vim的额外功能

回到顶部
以上介绍的内容,vim的用法与vi都是完全一模一样的,几乎没有什么区别。 目前大部分linux发行版已使用vim替代vi。我们通过type或者whereis命令可以看出vi的可执行文件为/usr/bin/vi。 通过ls命令我们追踪到/usr/bin/vi其实就是vim命令的符号链接。
其实,目前大部分的Linux发行版本都以vim替换了vi。为什么要用vim呢?因为vim具有颜色显示的功能,并且还支持许多的程序语法(syntax)和相应的提示信息。 不过和vi相比,vim多了很多额外的功能。例如支持编程语法的颜色显示等。本节就来介绍vim独有的高级功能。

1.区块选择(Visual Block)

回到顶部
我们提到的vi/vim操作指令,大部分都是以行为单位的操作。区块选择指令除了以行为单位,也可以以字符和区块为单位进行选择操作。 区块选择的指令有v、V和Ctrl+v,这个功能可以让我们复制一个矩形区域的内容,十分方便。
指令的含义如下表所示:
vim区块选择指令
vim区块选择指令
按键指令 指令说明
v 字符选择,按下v键后,通过hjkl移动光标,将光标经过的地方反白选择!
V 行选择,按下V键后,通过hjkl移动光标,将光标经过的行反白选择! 注意如果V是通过大写锁定键Capslock输入的,按下V键后,此时键盘处于大写锁定状态,需要先解除大写锁定,然后在通过hjkl移动光标。 可以通过shift+v输入大写V。
Ctrl+v 区块选择,按下Ctrl+v键后,通过hjkl移动光标,将光标起点和结束点组成的矩形区域反白选择
y 将反白的地方复制起来
d 将反白的地方删除掉
p 将刚刚复制的区块,在游标所在处贴上!。需要注意的是,粘贴时候也是粘贴在一个块的范围内,而不是以行为单位来处理的。
按下v家族指令后,vim界面的左下角会出现-- VISUAL BLOCK --的字样,表示此时可以移动光标进行选择操作了。
我们通过一个简单的示例来实际操作一下选择与复制粘贴操作。br /> 将/etc/hosts文件复制到/tmp目录下,并看产hosts文件的内容如下:
  root@initroot:/tmp# cp /etc/hosts .
  root@initroot:/tmp# cat hosts
  192.168.1.1 host1.initroot.com
  192.168.1.2 host2.initroot.com
  192.168.1.3 host3.initroot.com
  192.168.1.4 host4.initroot.com
  ...省略...
我们将host1, host2,host3,host4复制,然后粘贴到每行的后面,最后的文件看起来应该像这样:
  root@initroot:/tmp# cp /etc/hosts .
  root@initroot:/tmp# cat hosts
  192.168.1.1 host1.initroot.com host1
  192.168.1.2 host2.initroot.com host2
  192.168.1.3 host3.initroot.com host3
  192.168.1.4 host4.initroot.com host4
  ...省略...
操作步骤如下:
1. 使用vim hosts打开文件;
2. 使用hjkl指令将光标移动到第一行host1的前面,按下ctrl-v ,左下角出现-- VISUAL BLOCK --字样;
3. 使用hjkl指令将光标移动到最后一行host4单词4的位置,此时光标移动过的区域会反白显示,表示处于选择状态;
4. 按下y复制被选择的区域,此时反白的区块就消失不见了;
5. 最后,使用hjkl指令将光标移动到第一行的最后,输入a指令进入编辑模式,键入两个空格键; 然后按Esc回到普通指令模式后, 按下p键,这样就将刚才复制的内容粘贴到每行的末尾了。

2.多文件编辑

回到顶部
vim可以同时编辑多个文件。只需要在vim命令后面输入多个要打开的文件名即可。vim会将这些文件同时打开. 但是vim只有一个编辑窗口,所以只能显示当前正在编辑的文件,通过:n和:N指令可以切换当前编辑的文件。 大家在使用vim的时候,可能会碰到你需要复制一个文件中的某段到另外一个文件中,而vim不能够在关闭的时候,把这段保留住。或者是用其它的方法复制。
【vim file1 file2】
我们在两个或多个文件之间复制粘贴内容时,这个功能会让我们方便很多。
使用命令vim name1 name2 name3...(各个文件名之间用空格隔开)可以同时打开多个文件。
vim多文件切换指令
vim多文件切换指令
按键指令 指令说明
:n 编辑下一个文件
:N 编辑上一个文件
:files 行出目前vim打开的所有文件
我们前面修改了/tmp/hosts文件的四行内容,现在想将这四行内容复制粘贴到/etc/host文件中。 这时候就用到多文件同时编辑了。操作步骤如下:
1. 通过vim hosts /etc/hosts同时打开两个文件;
2. 先使用:files察看当前已经打开的文件;按下任意键回到一般指令模式;
3. 在第一行输入4yy复制四行;
4. 输入:n切换到第二个编辑的文件,此时编辑的文件为/etc/hosts;
5. 按下G指令将光标移动到最后一行,输入p指令粘贴刚才复制的内容;
6. 按下多次的u指令可以还原原本的文件数据;
7. 按下:q退出vim!
利用多文件编辑的功能,可以让你很快速的就将需要的资料复制到正确的文件内。
上面vim只显示了一个编辑界面。vim也可以同时显示多个编辑窗口。 这就是下面即将介绍的多窗口功能。

3.多窗口功能

回到顶部
:sp {filename}指令可以将vim的编辑窗口分区为多个编辑窗口。注意filename可有可无, 如果想要在新窗口打开另一个文件,就加入文件名,只输入:sp时, vim会为同一个文件开启不同的编辑窗口!
按ctrl+w可以将光标移动到不同的窗口中。
有两个需要对照着看的文件
【:sp filename】开启一个新窗口,如果有加 filename, 表示在新窗口开启一个新文件,否则表示两个窗口为同一个文件内容(同步显示)。
可以在一个窗口中打开多个文件。
输入命令:sp{filename}便可以实现这个功能。如果想要在新窗口启动另外一个文件,则加入文件名。如果省略文件名,则打开的是同一个文件。
vim manpath.config打开一个文件。在一般模式下输入:sp。发现打开的是同一个文件。如果再输入:sp /etc/hosts。则变成:
vim多窗口指令
vim多窗口指令
按键指令 指令说明
:sp {filename} 打开一个新窗口,如果有加filename, 表示在新窗口打开filename文件,否则两个窗口同时打开同一个文件
ctrl+w 不同窗口之间切换
【ctrl+w+j】
【ctrl+w+↓】按键的按法是:先按下 【ctrl】 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向下箭头键),则光标可移动到下方的窗口。
【ctrl+w+k】
【ctrl+w+↑】同上,不过光标移动到上面的窗口。
Ctrl+w+j:先按下Ctrl不放,再按下w后放开所有的按键,再按下j(或向下箭头键),则光标可以移到下方的窗口;
Ctrl+w+k:同上,不过光表移到上面的窗口;
Ctrl+w+q:离开。
多窗口编辑功能在实际应用中也是很有帮助的,比如需要对比两个文件的内容, 或者一个文件很大,想同时查看文件的开头和结尾,就可以用多窗口功能了。

4.vim文字自动补全功能

回到顶部
bash下可以按下tab键来对命令、选项、参数等进行补全。 现在非常多的图形界面下的编辑器都具有内容自动补全功能,比如比较流行的程序编辑器vscode, 在你输入程序关键词的时候,vscode会自动显示出可能的关键词供用户选择,同时对关键词显示不同的颜色。 vim同样也可以做到内容自动补全。 vim常用的内容补全指令如下表所示:
vim文字自动补全指令
vim文字自动补全指令
按键指令 指令说明
[ctrl]+x -> [ctrl]+n 通过当前正在编辑的文件的内容作为关键词,予以补齐
[ctrl]+x -> [ctrl]+o 按照文件扩展名所表示的语言语法,以vim内建的关键词,予以补齐
[ctrl]+x -> [ctrl]+f 以当前目录内的文件名作为关键词,予以补齐
比较常用的就是前两条指令了。第一个组合按键中,你可能会在同一个文件里面重复出现许多相同的关键词, 那么就能够透过这个补全的功能来处理。如果你是想要使用vim内建的语法检验功能来处理取得关键词的补全,那么第二个组合就很有用了,这个组合需要注意编辑文件的扩展名。
光看说明可能比较难以理解,我们实践一下很快就能明白了。
我们编辑一个网页html文件,由于网页通常会支持 CSS 的语法,而 CSS 的美化语法使用的是 style 这个关键词, 这个关键词后面接的就是 CSS 的元素与元素值。 若想要取得可能的元素有哪些,例如背景 (background) 的语法中, 想要了解有哪些跟它有关的内建元素,直接输入 b 然后按下 [crtl]+x 再按下 [crtl]+o: vim文字补全 图 vim文字补全功能
通过上图我们发现vim会把关键词以不同的颜色显示。输入b然后按下crtl+x,再按下crtl+o组合键后就会出现相关字词可以选择,此时就能够使用上下按钮来挑选所需要的关键元素! 这样使用上当然方便很多啊!只是要注意,一定要使用正确的扩展名,否则会无法出现任何关键词词喔!

六.vim环境设定与记录: ~/.vimrc, ~/.viminfo

回到顶部
需要注意的是,vim会将i我们的以前的行为都记录下来,以方便我们操作。它保存在文件:~/.viminfo中。
如果我们以vim软件来查找一个文件内部的某个字符串时,这个字符串会被反白, 而下次我们再次以vim编辑这个文件时,该查找的字符串反白情况还是存在。 另外,当我们重复编辑同一个文件时,当第二次进入该文件时, 光标竟然就在上次离开的那一行的开头。这个功能可能是方便,但也有不方便的时候。
怎么会这样呢?这是因为我们的vim会主动的将你曾经做过的行为登录下来,那个记录动作的文件就是: ~/.viminfo,不想用这个功能,就直接删除~/.viminfo。只要你曾经使用过vim,那么你的家目录就会有这个文件。 这个文件是自动产生的,你在vim里头所做过的动作,就可以在这个文件内部找到。有兴趣的朋友可以自己查看文件里面的内容。
不过,对于每个不同的发行版本对vim的预设环境都不太相同。举例来说,某些版本在查找到关键词时并不会高亮度反白, 有些版本则会主动的帮你进行缩排(所谓的缩排,就是当你按下 Enter 编辑新的一行时,光标不会在行首,而是在与上一行的第一个非空格符处对齐)的行为。其实这些都可以自行设定的,下面我们就来看看vim的环境设定。 vim的环境设定参数有很多,如果你想要知道目前的设定值,可以在一般模式时输入【 :set all】来查阅,由于设定项目实在太多了, 我们在这里就仅行出一些平时比较常用的一些简单的设定值,给大家提供参考。
有没有发现,如果我们以 vim 软件来搜寻一个文件内部的某个字符串时,这个字符串会被反白, 而 下次我们再次以 vim 编辑这个文件时,该搜寻的字符串反白情况还是存在呢!甚至于在编辑其他文 件时, 如果其他文件内也存在这个字符串,哇!竟然还是主动反白耶!真神奇! 另外,当我们重复 编辑同一个文件时,当第二次进入该文件时, 光标竟然就在上次离开的那一行上头呢!真是好方便啊~但是,怎么会这样呢?
这是因为我们的 vim 会主动的将你曾经做过的行为记录下来,好让你下次可以轻松的作业啊! 那个 记录动作的文件就是: ~/.viminfo !如果你曾经使用过 vim, 那你的家目录应该会存在这个文件才 对。这个文件是自动产生的, 你不必自行建立。而你在 vim 里头所做过的动作,就可以在这个文件 内部查询到啰~ ^_^
此外,每个 distributions 对 vim 的预设环境都不太相同,举例来说,某些版本在搜寻到关键词时并 不会高亮度反白, 有些版本则会主动的帮你进行缩排的行为。但这些其实都可以自行设定的,那就 是 vim 的环境设定啰~ vim 的环境设定参数有很多,如果你想要知道目前的设定值,可以在一般 指令模式时输入『 :set all 』 来查阅,不过.....设定项目实在太多了~所以,在这里仅行出一些 平时比较常用的一些简单的设定值, 提供给你参考啊。
Tips 所谓的缩排,就是当你按下 Enter 编辑新的一行时,光标不会在行首,而是在与上一 行的第一个非空格符处对齐!vim 的环境设定参数
vim环境设置指令
vim环境设置指令
按键指令 指令说明
:set all 显示目前所有的环境参数设定值。 :set all 显示目前所有的环境参数设置值
:set 显示与系统默认值不同的设定参数, 一般来说就是你有自行变动过的设定参数啦! :set 显示与系统默认值不同的参数值
:set nu
:set nonu
设定与取消行号啊! :set nu 显示行号
:set nonu 取消行号显示
:set hlsearch
:set nohlsearch
hlsearch 就是 high light search(高亮度搜寻)。 这个就是设定是否将搜寻的字符串反白的设定值。默认值是 hlsearch :set hlsearch 设置高亮度查找
:set nohlsearch 取消高亮度查找
:set hlsearch "高亮度反白(高亮度搜寻)
:set nohlsearch "取消高亮度反白(高亮度搜寻)
:set autoindent
:set noautoindent
是否自动缩排?autoindent 就是自动缩排。 :set autoindent "自动缩排
:set noautoindent "取消自动缩排
:set backup 是否自动储存备份档?一般是 nobackup 的, 如果设定 backup 的话,那么当你更动任 何一个文件时,则源文件会被另存成一个档名为 filename~ 的文件。 举例来说,我们 编辑 hosts ,设定 :set backup ,那么当更动 hosts 时,在同目录下,就会产生 hosts~ 文件名的文件,记录原始的 hosts 文件内容 :set backup 自动备份文件
:set ruler 还记得我们提到的右下角的一些状态栏说明吗? 这个 ruler 就是在显示或不显示该设 定值的啦! :set ruler 开启右下角状态栏说明
:set ruler "可显示最后一行的状态
:set showmode 这个则是,是否要显示 --INSERT-- 之类的字眼在左下角的状态栏。 :set showmode 显示左下角的INSERT之类的状态栏
:set showmode "左下角那一行的状态
:set backspace=(012) 一般来说, 如果我们按下 i 进入编辑模式后,可以利用退格键 (backspace) 来删除任 意字符的。 但是,某些 distribution 则不许如此。此时,我们就可以透过 backspace 来设定啰~ 当 backspace 为 2 时,就是可以删除任意值;0 或 1 时,仅可删除刚刚 输入的字符, 而无法删除原本就已经存在的文字了! :set backspace={0,1,2} 设置退格键功能。为2时可以删任意字符。为0或1时仅可以删除刚才输入的字符。
:set backspace=2 "在编辑的时候可随时用退格键删除 (0、1的时候,只针对刚输入的字符有效)
:syntax on
:syntax off
是否依据程序相关语法显示不同颜色? 举例来说,在编辑一个纯文本档时,如果开头是 以 # 开始,那么该行就会变成蓝色。 如果你懂得写程序,那么这个 :syntax on 还会 主动的帮你除错呢!但是, 如果你仅是编写纯文本文件,要避免颜色对你的屏幕产生的 干扰,则可以取消这个设定 。 :syntax on/off 是否开启依据相关程序语法显示不同的颜色
:syntax on "进行语法检验,颜色显示
:syntax off "关闭语法检验
:set bg=dark
:set bg=light
可用以显示不同的颜色色调,预设是『 light 』。如果你常常发现批注的字体深蓝色实 在很不容易看, 那么这里可以设定为 dark 喔!试看看,会有不同的样式呢! :set bg=dark/light 是否显示不同的颜色色调
:set bg=dark "显示不同的底色色调
但是我们没有必要每次使用vim都要重新设置一次各个参数值。我们可以通过配置文件来直接规定我们习惯的vim操作环境。 整体vim的设置值一般是放在/etc/vimrc中的。我们一般不要修改这个文件。我们可以通过修改~/.vimrc这个文件, 如果不存在,可以手动创建。然后将我们所希望的设置值写入。例如,我们可以这样写:
创建并保存这个文件之后,当下次重新以vim编辑某个文件时,该文件的默认环境就是这么设置的。
了解完上面的内容后,下面我们就能写一下自己的vim操作环境。
整体vim的设定值一般是置在/etc/vimrc这个文件里面,不建议大家来修改他。我们在自己的家目录里面建立个.vimrc文件,在这里面写入自己的内容就能实现了。
保存退出vim后,在下次使用vim的时候,就会有自己的vim操作环境了。
提醒一点,这个文件中每一行前面加不加【:】效果都是一样的。
但是我们没有必要每次使用vim都要重新设置一次各个参数值。我们可以通过配置文件来直接规定我们习惯的vim操作环境。
整体vim的设置值一般是放在/etc/vimrc中的。我们一般不要修改这个文件。我们可以通过修改~/.vimrc这个文件,如果不存在,可以手动创建。
然后将我们所希望的设置值写入。例如,我们可以这样写:
[cpp] view plaincopy
创建并保存这个文件之后,当下次重新以vim编辑某个文件时,该文件的默认环境就是这么设置的。
总之,这些设定值很有用处的啦!但是......我是否每次使用 vim 都要重新设定一次各个参数值? 这 不太合理吧?没错啊!所以,我们可以透过配置文件来直接规定我们习惯的 vim 操作环境呢! 整体 vim 的设定值一般是放置在 /etc/vimrc 这个文件,不过,不建议你修改他! 你可以修改 ~/.vimrc 这 个文件 (预设不存在,请你自行手动建立!),将你所希望的设定值写入! 举例来说,可以是这样的 一个文件:
[root@initroot ~]$ vim ~/.vimrc
"这个文件的双引号 (") 是批注set hlsearch "高亮度反白
set backspace=2 "可随时用退格键删除
set autoindent "自动缩排
set ruler "可显示最后一行的状态
set showmode "左下角那一行的状态
set nu "可以在每一行的最前面显示行号啦!
set bg=dark "显示不同的底色色调
syntax on "进行语法检验,颜色显示。
vim ~/.vimrc 
set hlsearch(注意:set前面也可以加冒号,结果一样)
set backspace=2
set ruler
set showmode
set nu
syntax on
[root@yufei ~]# 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 编辑某个文件时,该文件的预设环境设定就是上头写的啰~ 这样,是否很方便你的操作啊!多多利用 vim 的环境设定功能呢!^_^

七.vim插件

回到顶部

八.其他vim使用注意事项

回到顶部
vim 其实不是那么好学,虽然他的功能确实非常强大!所以底下我们还有一些需要注意的地方要来跟 大家分享喔!

1.中文编码问题

回到顶部
很多朋友常常哀嚎,说他们的 vim 里面怎么无法显示正常的中文啊?其实这很有可能是因为编码的 问题! 因为中文编码有 big5 与 utf8 两种,如果你的文件是使用 big5 编码制作的,但在 vim 的 终端接口中你使用的是万国码(utf8), 由于编码的不同,你的中文文件内容当然就是一堆乱码了!怎 么办?这时你得要考虑许多东西啦!有这些:
1. 你的 Linux 系统默认支持的语系数据:这与 /etc/locale.conf 有关;
2. 你的终端界面 (bash) 的语系: 这与 LANG, LC_ALL 这几个变数有关;
3. 你的文件原本的编码;
4. 开启终端机的软件,例如在 GNOME 底下的窗口接口。
事实上最重要的是上头的第三与第四点,只要这两点的编码一致,你就能够正确的看到与编辑你的中 文文件。 否则就会看到一堆乱码啦!
一般来说,中文编码使用 big5 时,在写入某些数据库系统中,在『许、盖、功』这些字体上面会发 生错误! 所以近期以来大多希望大家能够使用万国码 utf8 来进行中文编码!但是在中文 Windows 上的软件常常默认使用 big5 的编码 (不一定是 windows 系统的问题,有时候是某些中文软件的默 认值之故), 包括由于沿用以前的文件数据文件,也大多使用 big5 的编码。此时就得要注意上 述的这些咚咚啰。
在 Linux 本机前的 tty1~tty6 原本默认就不支持中文编码,所以不用考虑这个问题!因为你一定会看 到乱码!呵呵! 现在假设俺的文件文件内编码为 big5 时,而且我的环境是使用 Linux 的 GNOME ,启动的终端接口为 GNOME-terminal 软件, 那通常是这样来修正语系编码的行为:
[root@initroot ~]$ LANG=zh_TW.big5
[root@initroot ~]$ export LC_ALL=zh_TW.big5
然后在终端接口工具栏的『终端机』-->『设定字符编码』 -->『中文 (正体) (BIG5)』项目点选一下, 如果一切都没有问题了,再用 vim 去开启那个 big5 编码的文件,就没有问题了!以上!报告完毕!

2.DOS 与 Linux 的断行字符

回到顶部
我们在第六章里面谈到 cat 这个指令时,曾经提到过 DOS 与 Linux 断行字符的不同。 而我们也可 以利用 cat -A 来观察以 DOS (Windows 系统) 建立的文件的特殊格式, 也可以发现在 DOS 使用 的断行字符为 ^M$ ,我们称为 CR 与 LF 两个符号。 而在 Linux 底下,则是仅有 LF ($) 这个断 行符号。这个断行符号对于 Linux 的影响很大喔! 为什么呢?
我们说过,在 Linux 底下的指令在开始执行时,他的判断依据是 『Enter』,而 Linux 的 Enter 为 LF 符号, 不过,由于 DOS 的断行符号是 CRLF ,也就是多了一个 ^M 的符号出来, 在这样的 情况下,如果是一个 shell script 的程序文件,呵呵~将可能造成『程序无法执行』的状态~ 因为他 会误判程序所下达的指令内容啊!这很伤脑筋吧!那怎么办啊?很简单啊,将格式转换成为 Linux 即可啊!『废话』,这当然大家都知道,但是, 要 以 vi 进入该文件,然后一个一个删除每一行的 CR 吗?当然没有这么没人性啦! 我们可以透过简 单的指令来进行格式的转换啊!
不过,由于我们要操作的指令默认并没有安装,也无法预期你有没有网络,因此假设你没有网络 的状况下, 请拿出你的原版光盘,放到光驱里头去,然后使用底下的方式来安装我们所需要的这个 软件喔!
[root@initroot ~]$ su -
# 安装软件一定要是 root 的权限才行!
[root@initroot ~]# mount /dev/sr0 /mnt
[root@initroot ~]# 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@initroot ~]# umount /mnt
[root@initroot ~]# exit
那就开始来玩一玩这个字符转换吧!
[root@initroot ~]$ dos2unix [-kn] file [newfile]
[root@initroot ~]$ unix2dos [-kn] file [newfile]
选项与参数: -k :保留该文件原本的 mtime 时间格式 (不更新文件上次内容经过修订的时间)
-n :保留原本的旧档,将转换后的内容输出到新文件,如: dos2unix -n old new
范例一:将 /etc/man_db.conf 重新复制到 /tmp/vitest/ 底下,并将其修改成为 dos 断行
[root@initroot ~]# cd /tmp/vitest
[root@initroot vitest]$ cp -a /etc/man_db.conf .
[root@initroot vitest]$ ll man_db.conf
-rw-r--r--. 1 root root 5171 Jun 10
2014 man_db.conf
[root@initroot vitest]$ unix2dos -k man_db.conf
unix2dos: converting file man_db.conf to DOS format ...
# 屏幕会显示上述的讯息,说明断行转为 DOS 格式了!
[root@initroot vitest]$ ll man_db.conf
-rw-r--r--. 1 root root 5302 Jun 10
2014 man_db.conf
# 断行字符多了 ^M ,所以容量增加了!
范例二:将上述的 man_db.conf 转成 Linux 断行字符,并保留旧文件,新档放于 man_db.conf.linux
[root@initroot vitest]$ dos2unix -k -n man_db.conf man_db.conf.linux
dos2unix: converting file man_db.conf to file man_db.conf.linux in Unix format ...
[root@initroot vitest]$ ll man_db.conf*
-rw-r--r--. 1 root root 5302 Jun 10 2014 man_db.conf
-rw-r--r--. 1 root root 5171 Jun 10 2014 man_db.conf.linux[root@initroot vitest]$ file man_db.conf*
man_db.conf:
ASCII text, with CRLF line terminators
# 很清楚说明是 CRLF 断行!
man_db.conf.linux: ASCII text
因为断行字符以及 DOS 与 Linux 操作系统底下一些字符的定义不同,因此, 不建议你在 Windows 系统当中将文件编辑好之后,才上传到 Linux 系统,会容易发生错误问题。 而且,如果你在不同的 系统之间复制一些纯文本文件时,千万记得要使用 unix2dos 或 dos2unix 来转换一下断行格式啊!

3.语系编码转换

回到顶部
很多朋友都会有的问题,就是想要将语系编码进行转换啦!举例来说,想要将 big5 编码转成 utf8 。 这个时候怎么办?难不成要每个文件打开会转存成 utf8 吗?不需要这样做啦!使用 iconv 这个指令 即可! 将之前的 vi 章节做成 big5 编码的文件,你可以照底下的连结来下载先: http://linux.vbird.org/linux_basic/0310vi/vi.big5 在终端机的环境下你可以使用『 wget 网址』来下载上述的文件喔!将他下载在 /tmp/vitest 目 录下。 接下来让我们来使用 iconv 这个指令来玩一玩编码转换吧!
[root@initroot ~]$ iconv --list
[root@initroot ~]$ iconv -f 原本编码 -t 新编码 filename [-o newfile]
选项与参数:
--list :行出 iconv 支持的语系数据
-f :from ,亦即来源之意,后接原本的编码格式;
-t :to ,亦即后来的新编码要是什么格式;
-o file:如果要保留原本的文件,那么使用 -o 新档名,可以建立新编码文件。
范例一:将 /tmp/vitest/vi.big5 转成 utf8 编码吧!
[root@initroot ~]$ cd /tmp/vitest
[root@initroot vitest]$ iconv -f big5 -t utf8 vi.big5 -o vi.utf8
[root@initroot vitest]$ file vi*
vi.big5: ISO-8859 text, with CRLF line terminators
vi.utf8: UTF-8 Unicode text, with CRLF line terminators
# 是吧!有明显的不同吧! ^_^ 这指令支持的语系非常之多,除了正体中文的 big5, utf8 编码之外,也支持简体中文的 gb2312 , 所 以对岸的朋友可以简单的将鸟站的网页数据下载后,利用这个指令来转成简体,就能够轻松的读取文 件数据啰! 不过,不要将转成简体的文件又上传成为您自己的网页啊!这明明是写的不是吗? ^_^语系编码转换
不过如果是要将正体中文的 utf8 转成简体中文的 utf8 编码时,那就得费些功夫了! 举例来说,如 果要将刚刚那个 vi.utf8 转成简体的 utf8 时,可以这样做:
[root@initroot vitest]$ iconv -f utf8 -t big5 vi.utf8 | \
> iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o vi.gb.utf8
9.5 本章总结
Linux 底下的配置文件多为文本文件,故使用 vim 即可进行设定编辑;
vim 可视为程序编辑器,可用以编辑 shell script, 配置文件等,避免打错字;
vi 为所有 unix like 的操作系统都会存在的编辑器,且执行速度快速;
vi 有三种模式,一般指令模式可变换到编辑与指令行模式,但编辑模式与指令行模式不能互换;
常用的按键有 i, [Esc], :wq 等;
vi 的画面大略可分为两部份,(1)上半部的本文与(2)最后一行的状态+指令行模式;
数字是有意义的,用来说明重复进行几次动作的意思,如 5yy 为复制 5 行之意;
光标的移动中,大写的 G 经常使用,尤其是 1G, G 移动到文章的头/尾功能!
vi 的替换功能也很棒! :n1,n2s/old/new/g 要特别注意学习起来;
小数点『 . 』为重复进行前一次动作,也是经常使用的按键功能!
进入编辑模式几乎只要记住: i, o, R 三个按钮即可!尤其是新增一行的 o 与替换的 R vim 会主动的建立 swap 暂存档,所以不要随意断线!
如果在文章内有对齐的区块,可以使用 [ctrl]-v 进行复制/贴上/删除的行为
使用 :sp 功能可以分区窗口
若使用 vim 来撰写网页,若需要 CSS 元素数据,可透过 [crtl]+x, [crtl]+o 这两个连续组合按键来取得关 键词
vim 的环境设定可以写入在 ~/.vimrc 文件中;
可以使用 iconv 进行文件语系编码的转换
使用 dos2unix 及 unix2dos 可以变更文件每一行的行尾断行字符。
9.6 本章练习
(要看答案请将鼠标移动到『答:
』底下的空白处,按下左键圈选空白处即可察看) 实作题部分:
在第七章的情境模拟题二的第五点,编写 /etc/fstab 时,当时使用 nano 这个指令, 请尝试使用 vim 去编 辑 /etc/fstab ,并且将第七章新增的那一行的 defatuls 改成 default ,会出现什么状态? 离开前请务必要 修订成原本正确的信息。此外,如果将该行批注 (最前面加 #),你会发现字体颜色也有变化喔!
尝试在你的系统中,你惯常使用的那个账号的家目录下,将本章介绍的 vimrc 内容进行一些常用设定,包 括:
o 设定搜寻高亮度反白
o 设定语法检验启动
o 设定默认启动行号显示
o 设定有两行状态栏 (一行状态+一行指令行) :set laststatus=2 简答题部分:
我用 vi 开启某个文件后,要在第 34 行向右移动 15 个字符,应该在一般指令模式中下达什么指令? (1)先按下 34G 到第 34 行;(2)再按下 [ 15 + 向右键 ],或 [ 15l ] 亦可!
在 vi 开启的文件中,如何去到该文件的页首或页尾?
去页首按下 1G 或 gg ;去页尾按下 G 即可
在 vi 开启的文件中,如何在光标所在行中,移动到行头及行尾?
移动到行头,按 0 ,移动到行尾按 $ 即可!
vi 的一般指令模式情况下,按下『 r 』有什么功能?
替换光标所在的那个字符
在 vi 的环境中,如何将目前正在编辑的文件另存新档名为 newfilename?
:w newfilename
在 linux 底下最常使用的文书编辑器为 vi ,请问如何进入编辑模式?
在一般指令模式底下输入: i, I, a, A 为在本行当中输入新字符;(出现 –Insert- )
在一般指令模式当中输入: o, O 为在一个新的一行输入新字符;
在一般指令模式当中输入: r, R 为替换字符!
(左下角出现 –Replace-)
在 vi 软件中,如何由编辑模式跳回一般指令模式?
可以按下[Esc]
在 vi 环境中,若上下左右键无法使用时,请问如何在一般指令模式移动光标?
[h, j, k, l]分别代表[左、下、上、右]
在 vi 的一般指令模式中,如何删除一行、n 行;如何删除一个字符?
分别为 dd, ndd, x 或 X (dG 及 d1G 分别表示删除到页首及页尾)
在 vi 的一般指令模式中,如何复制一行、n 行并加以贴上?
分别为 yy, nyy, p 或 P
在 vi 的一般指令模式中如何搜寻 string 这个字符串?
?string (往前搜寻)
/string (往后搜寻)
在 vi 的一般指令模式中,如何替换 word1 成为 word2,而若需要使用者确认机制,又该如何?
:1,$s/word1/word2/g 或:1,$s/word1/word2/gc (需要使用者确认)
在 vi 目前的编辑文件中,在一般指令模式下,如何读取一个文件 filename 进来目前这个文件?
:r filename
在 vi 的一般指令模式中,如何存盘、离开、存档后离开、强制存档后离开?
:w; :q: :wq; :wq!
在 vi 底下作了很多的编辑动作之后,却想还原成原来的文件内容,应该怎么进行?
直接按下 :e! 即可恢复成文件的原始状态!
我在 vi 这个程序当中,不想离开 vi ,但是想执行 ls /home 这个指令,vi 有什么额外的功能可以达到这
个目的:
事实上,可以使用[ :! ls /home ]不过,如果你学过后面的章节之后,你会发现,执行[ ctrl + z ]亦可暂时退出 vi 让你在指令行 模式当中执行指令喔!

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读