第10章、 vim 程序编辑器

10.1. vi 与 vim
由前面一路走来,我们一直建议使用文本模式来处理 Linux 的系统设定问题,因为不但可以让你比较容易了解到 Linux 的运作状况,也比较容易了解整个设定的基本精神,更能『保证』你的修改可以顺利的被运作。 所以,在 Linux 的系统中使用文本编辑器来编辑你的 Linux 参数配置文件,可是一件很重要的事情 !也因此,系统管理员至少应该要熟悉一种字处理器的!
在 Linux 的世界中,绝大部分的配置文件都是以 ASCII 的纯文本形态存在,因此利用简单的文字编辑软件就能够修改设定了! 与微软的 Windows 系统不同的是,如果你用惯了 Microsoft Word 或 Corel Wordperfect 的话,那么除了 X window 里面的图形接口编辑程序(如 xemacs )用起来尚可应付外,在 Linux 的文本模式下,会觉得文书编辑程序都没有窗口接口来的直观与方便。
那么 Linux 在文字接口下的文书编辑器有: emacs, pico, nano, joe, 与 vim 等等(注1)。 既然有这么多文字接口的文书编辑器,那么我们为什么一定要学 vi 啊?还有那个 vim 是做啥用的?底下就来谈一谈先!

10.1.1. 为何要学 vim
文书编辑器那么多,我们之前在第五章也曾经介绍过那简单好用的 nano ,学习vim原因:
- 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在;
- 很多个别软件的编辑接口都会主动呼叫 vi (例如未来会谈到的 crontab, visudo, edquota 等指令);
- vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计;
- 因为程序简单,编辑速度相当快速。

其实重点是上述的第二点,因为有太多 Linux 上面的指令都默认使用 vi 作为数据编辑的接口,所以你必须学会 vi ,否则很多指令你根本就无法操作!

什么是 vim ?可以将 vim 视作 vi 的进阶版本,vim 可以用颜色或底线等方式来显示一些特殊的信息。 举例来说,当你使用 vim 去编辑一个 C 程序语言的档案,或者是我们后续会谈到的 shell script 程序时,vim 会依据档案的扩展名或者是档案内的开头信息, 判断该档案的内容而自动的呼叫该程序的语法判断式,再以颜色来显示程序代码与一般信息。 这个 vim 是个『程序编辑器』!甚至一些 Linux 基础配置文件内的语法,都能够用 vim 来检查! 例如我们在第八章谈到的 /etc/fstab 这个档案的内容。
vi 是老式的字处理器。 vim 则可以说是程序开发者的一项很好用的工具,就连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个『程序开发工具』而不是文字处理软件。 因为 vim 里面加入了很多额外的功能,例如支持正规表示法的搜寻架构、多档案编辑、区块复制等等。 这对于我们在 Linux 上面进行一些配置文件的修订工作时,是很棒的一项功能!

10.2. vi 的使用
基本上 vi 共分为三种模式, 这三种模式的作用分别是:

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

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

三、指令列命令模式:
在一般模式当中,输入『 : / ? 』三个中的任何一个按钮,就可以将光标移动到最底下那一行。在这个模式当中, 可以提供你『搜寻资料』的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作则是在此模式中达成的!
简单的说,我们可以将这三个模式想成底下的图标来表示:
这里写图片描述
注意编辑模式与指令列模式之间不可互相切换!

10.2.1. 简易执行范例
如果你想要使用 vi 来建立一个名为 test.txt 的档案时,你可以这样做:

一、使用 vi 进入一般模式;
这里写图片描述
直接输入『 vi 档名』就能够进入 vi 的一般模式了。请注意,记得 vi 后面一定要加档名,不管该档名存在与否! 整个画面主要分为两部份,上半部与最底下一行两者可以规为独立的。如下图 2.1.1 所示,图中那个虚线是不存在的,上半部显示的是档案的实际内容,最底下一行则是状态显示列(如下图的[New File]信息), 或者是命令下达列!
这里写图片描述
如果你开启的档案是旧档(已经存在的档案),则可能会出现如下的信息:
这里写图片描述
如上图 2.1.2 所示,箭头所指的那个『”/etc/man.config” 141L, 4617C』代表的是『档名为 /etc/man.conf, 档案内有 141 行 以及具有 4617 个字符』!

二、按下 i 进入编辑模式,开始编辑文字
在一般模式之中,只要按下 i, o, a 等字符就可以进入编辑模式了!在编辑模式当中,你可以发现在左下角状态栏中会出现 –INSERT- 的字样,那就是可以输入任意字符的提示!这个时候,键盘上除了 [Esc] 这个按键之外,其他的按键都可以规作为一般的输入按钮了,所以你可以进行任何的编辑!
这里写图片描述
在 vi 里面, [tab] 这个按钮所得到的结果与空格符所得到的结果是不一样的!

三、按下 [ESC] 按钮回到一般模式
按下 [Esc] 即退出!就会发现画面左下角的 – INSERT – 不见了!

四、在一般模式中按下 :wq 储存后离开 vi
输入『:wq』即可存档离开! (注意了,按下 : 该光标就会移动到最底下一行去!) 这时你在提示字符后面输入『 ls -l 』即可看到我们刚刚建立的 test.txt 档案!
这里写图片描述
如此一来,你的档案 test.txt 就已经建立起来了!需要注意的是,如果你的档案权限不对,例如为 -r–r–r– 时,那么可能会无法写入,此时可以使用『强制写入』的方式吗?可以!使用『 :wq! 』 多加一个惊叹号即可!不过,需要特别注意!那个是在『你的权限可以改变』的情况下才能成立的!

10.2.2. 按键说明
除了上面简易范例的 i, [Esc], :wq 之外,其实 vim 还有非常多的按键可以使用!

第一部份:一般模式可用的按钮说明,光标移动、复制贴上、搜寻取代等
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

第二部份:一般模式切换到编辑模式的可用的按钮说明
这里写图片描述

第三部份:一般模式切换到指令列模式的可用的按钮说明
这里写图片描述
在 vi 中,『数字』是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前~那我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。 OK !会这些指令就已经很厉害了,因为常用到的指令也只有不到一半!

10.2.3. 一个案例的练习
请依照底下的需求进行指令动作。 (底下的操作为使用 CentOS 5.2 中的 man.config 来做练习的,该档案你可以在这里下载: http://linux.vbird.org/linux_basic/0310vi/man.config。) 看看你的显示结果是否相同?
1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录;
2. 进入 vitest 这个目录当中;
3. 将 /etc/man.config 复制到本目录底下(或由上述的连结下载 man.config 档案);
4. 使用 vi 开启本目录下的 man.config 这个档案;
5. 在 vi 中设定一下行号;
6. 移动到第 58 行,向右移动 40 个字符,请问你看到的双引号内是什么目录?
7. 移动到第一行,并且向下搜寻一下『 bzip2 』这个字符串,请问他在第几行?
8. 接着下来,我要将 50 到 100 行之间的『小写 man 字符串』改为『大写 MAN 字符串』,并且一个一个挑选是否需要修改,如何下达指令?如果在挑选过程中一直按『y』, 结果会在最后一行出现改变了几个 man 呢?
9. 修改完之后,突然反悔了,要全部复原,有哪些方法?
10.我要复制 65 到 73 这九行的内容(含有MANPATH_MAP),并且贴到最后一行之后;
11.21 到 42 行之间的开头为 # 符号的批注数据我不要了,要如何删除?
12.将这个档案另存成一个 man.test.config 的档名;
13.去到第 27 行,并且删除 15 个字符,结果出现的第一个单字是什么?
14.在第一行新增一行,该行内容输入『I am a student…』;
15.储存后离开吧!

整个步骤可以如下显示:
1. 『mkdir /tmp/vitest』
2. 『cd /tmp/vitest』
3. 『cp /etc/man.config .』
4. 『vi man.config』
5. 『:set nu』然后你会在画面中看到左侧出现数字即为行号。
6. 先按下『58G』再按下『40→』会看到『/dir/bin/foo』这个字样在双引号内;
7. 先执行『1G』或『gg』后,直接输入『/bzip2』,则会去到第 118 行才对!
8. 直接下达『 :50,100s/man/MAN/gc 』即可!若一直按『y』最终会出现『在 23 行内置换 25 个字符串』的说明。
9. (1)简单的方法可以一直按『 u 』回复到原始状态,(2)使用不储存离开『 :q! 』之后,再重新读取一次该档案;
10.『65G』 然后再『 9yy 』之后最后一行会出现『复制九行』之类的说明字样。 按下『 G 』到最后一行,再给他『 p 』贴上九行!
11.因为 21~42 22 行,因此『 21G 』→『 22dd 』就能删除 22 行,此时你会发现游标所在 21 行的地方变成 MANPATH 开央啰, 批注的 # 符号那几行都被删除了。
12.『 :w man.test.config 』,你会发现最后一行出现 “man.test.config” [New].. 的字样。
13.『27G』 之后,再给他『 15x 』即可删除 15 个字符,出现『 you 』的字样;
14.先『 1G 』去到第一行,然后按下大写的『 O 』便新增一行且在插入模式;开始输入『I am a student…』后, 按下[Esc]回到一般模式等待后续工作;
15.『:wq』

如果你的结果都可以查的到,那么 vi 的使用上面应该没有太大的问题了。

10.2.4. vim 的暂存档、救援回复与开启时的警告讯息
在目前主要的编辑软件都会有『回复』的功能, 那么 vim 回复功能就是透过『暂存档』来救援的! 当我们在使用 vim 编辑时, vim 会在与被编辑的档案的目录下,再建立一个名为 .filename.swp 的档案。 比如说我们在上一个小节谈到的编辑 /tmp/vitest/man.config 这个档案时, vim 会主动的建立 /tmp/vitest/.man.config.swp 的暂存档,你对 man.config 做的动作就会被记录到这个 .man.config.swp 当中!如果你的系统因为编辑的档案还没有储存,这个时候 .man.config.swp 就能够发辉救援的功能了!
这里写图片描述
当我们在 vim 的一般模式下按下 [ctrl]-z 的组合按键时,你的 vim 会被丢到背景去执行! 这部份的功能我们会在第十七章的程序管理当中谈到, 你这里先知道一下即可。回到命令提示字符后,接下来我们来模拟将 vim 的工作不正常的中断!
这里写图片描述
那个 kill 可以仿真将系统的 vim 工作删除的情况! 由于 vim 的工作被不正常的中断,导致暂存盘无法藉由正常流程来结束, 所以暂存档就不会消失,而继续保留下来。此时如果你继续编辑那个 man.config , 会出现如下所示的状态:
这里写图片描述
这里写图片描述
由于暂存盘存在的关系,因此 vim 会主动的判断你的这个档案可能有些问题,在上面的图示中 vim 提示两点主要的问题与解决方案,分别是这样的:

问题一:可能有其他人或程序同时在编辑这个档案:
由于 Linux 是多人多任务的环境,因此很可能有很多人同时在编辑同一个档案。如果在多人共同编辑的情况下, 万一大家同时储存,那么这个档案的内容将会变的乱七八糟!为了避免这个问题,因此 vim 会出现这个警告窗口! 解决的方法则是:
- 找到另外那个程序或人员,请他将该 vim 的工作结束,然后你再继续处理。
- 如果你只是要看该档案的内容并不会有任何修改编辑的行为,那么可以选择开启成为只读(O)档案, 亦即上述画面反白部分输入英文『 o 』即可,其实就是 [O]pen Read-Only 的选项!

问题二:在前一个 vim 的环境中,可能因为某些不知名原因导致 vim 中断 (crashed):
这就是常见的不正常结束 vim 产生的后果。解决方案依据不同的情况而不同!常见的处理方法为:
- 如果你之前的 vim 处理动作尚未储存,此时你应该要按下『R』,亦即使用 (R)ecover 的项目, 此时 vim 会载入 .man.config.swp 的内容,让你自己来决定要不要储存!这样就能够救回来你之前未储存的工作。 不过那个 .man.config.swp 并不会在你结束 vim 后自动删除,所以你离开 vim 后还得要自行删除 .man.config.swp 才能避免每次打开这个档案都会出现这样的警告 !
- 如果你确定这个暂存盘是没有用的,那么你可以直接按下『D』删除掉这个暂存盘,亦即 (D)elete it 这个项目即可。 此时 vim 会载入 man.config ,并且将旧的 .man.config.swp 删除后,建立这次会使用的新的 .man.config.swp !

至于这个发现暂存盘警告讯息的画面中,有出现六个可用按钮,各按钮的说明如下:
- [O]pen Read-Only:打开此档案成为只读档, 可以用在你只是想要查阅该档案内容并不想要进行编辑行为时;
- (E)dit anyway:还是用正常的方式打开你要编辑的那个档案, 并不会载入暂存盘的内容。不过很容易出现两个使用者互相改变对方的档案等问题!
- (R)ecover:就是加载暂存盘的内容,用在你要救回之前未储存的工作。 不过当你救回来并且储存离开 vim 后,还是要手动自行删除那个暂存档!
- (D)elete it:你确定那个暂存档是无用的!那么开启档案前会先将这个暂存盘删除! 这个动作其实是比较常做的!因为你可能不确定这个暂存档是怎么来的,所以就删除掉他!
- (Q)uit:按下 q 就离开 vim ,不会进行任何动作回到命令提示字符。
- (A)bort:忽略这个编辑行为,感觉上与 quit 非常类似! 也会送你回到命令提示字符就是!

10.3. vim 的额外功能
其实,目前大部分的 distributions 都以 vim 取代 vi 的功能了!如果你使用 vi 后,却看到画面的右下角有显示目前光标所在的行列号码,那么你的 vi 已经被 vim 所取代。 用 vim 是因为 vim 具有颜色显示的功能,并且还支持许多的程序语法 (syntax), 因此,当你使用 vim 编辑程序时( 不论是 C 语言,还是 shell script ), 我们的 vim 将可帮你直接进行『程序除错 (debug)』的功能!
如果你在文本模式下,输入 alias 时,出现这样的画面:
这里写图片描述
这表示当你使用 vi 这个指令时,其实就是执行 vim !如果你没有这一行,那么你就必须要使用 vim filename 来启动 vim !基本上, vim 的一般用法与 vi 完全一模一样!假设我想要编辑 /etc/man.config ,则输入『vim/etc/man.config』。
这里写图片描述
上面是 vim 的画面示意图,在这个画面中有几点特色要说明:
1. 由于 man.config 是系统规划的配置文件,因此 vim 会进行语法检验,所以你会看到画面中内部主要为深蓝色, 且深蓝色那一行是以批注符号 (#) 为开头;
2. 最底下一行的左边显示该档案的属性,包括 141行与 4617 字符;
3. 最底下一行的右边出现的 1,1 表示光标所在为第一行, 第一个字符位置之意(请看一下上图中的游标所在);

所以,如果你向下移动到其他位置时,出现的非批注的数据就会有点像这样:
这里写图片描述
除了批注之外,其他的行就会有特别的颜色显示!可以避免打错字!而且, 最右下角的 30% 代表目前这个画面占整体档案的 30% 之意!

10.3.1. 区块选择(Visual Block)
刚刚我们提到的简单的 vi 操作过程中,几乎提到的都是以行为单位的操作。那么如果我想要搞定的是一个区块范围呢? 举例来说,像底下这种格式的档案:
这里写图片描述
这个档案我将他放置到 http://linux.vbird.org/linux_basic/0310vi/hosts ,你可以自行下载来看一看这个档案!假设我想要将 host1, host2… 等等复制起来, 并且加到每一行的后面,亦即每一行的结果要是『 192.168.1.2 host2.class.net host2 』这样的情况时, 在传统或现代的窗口型编辑器似乎不容易达到这个需求,但是咱们的 vim 是办的到的!那就使用区块选择 (Visual Block) 吧!当我们按下 v 或者 V 或者 [Ctrl]+v 时, 这个时候光标移动过的地方就会开始反白,这三个按键的意义分别是:
这里写图片描述
来实际进行我们需要的动作!就是将 host 再加到每一行的最后面,你可以这样做:
1. 使用 vim hosts 来开启该档案,记得该档案请由上述的连结下载先!
2. 将光标移动到第一行的 host 那个 h 上头,然后按下 [ctrl]-v ,左下角出现区块示意字样:
这里写图片描述
3. 将光标移动到最底部,此时光标移动过的区域会反白!如下图所示:
这里写图片描述
4. 此时你可以按下『 y 』来进行复制,当你按下 y 之后,反白的区块就会消失不见!
5. 最后,将光标移动到第一行的最右边,并且再用编辑模式向右按两个空格键,回到一般模式后, 再按下『 p 』后,如下图所示:
这里写图片描述
透过上述的功能,你可以复制一个区块,并且是贴在某个『区块的范围』内,而不是以行为单位来处理你的整份文件!

10.3.2. 多档案编辑
假设一个例子,你想要将刚刚我们的 hosts 内的 IP 复制到你的 /etc/hosts 这个档案去, 那么该如何编辑?我们知道在 vi 内可以使用 :r filename 来读入某个档案的内容, 不过,这样毕竟是将整个档案读入!如果我只是想要部分内容这个时候多档案同时编辑就很有用了。 我们可以使用 vim 后面同时接好几个档案来同时开启!相关的按键有:
这里写图片描述
在过去,鸟哥想要将 A 档案内的十条消息『移动』到 B 档案去,通常要开两个 vim 窗口来复制, 偏偏每个 vim 都是独立的,因此并没有办法在 A 档案下达『 nyy 』再跑到 B 档案去『 p 』! 在这种情况下最常用的方法就是透过鼠标圈选, 复制后贴上。不过这样一来还是有问题,因为鸟哥超级喜欢使用 [Tab] 按键进行编排对齐动作, 透过鼠标却会将 [Tab] 转成空格键,这样内容就不一样了!此时这个多档案编辑就派上用场了! 现在你可以做一下练习看看说!假设你要将刚刚鸟哥提供的 hosts 内的前四行 IP 资料复制到你的 /etc/hosts 档案内,那可以怎么进行呢?可以这样啊:
1. 透过『 vim hosts /etc/hosts 』指令来使用一个 vim 开启两个档案;
2. 在 vim 中先使用『 :files 』察看一下编辑的档案数据有啥?结果如下所示。 至于下图的最后一行显示的是『按下任意键』就会回到 vim 的一般模式中!
这里写图片描述
3. 在第一行输入『 4yy 』复制四行;
4. 在 vim 的环境下输入『 :n 』会来到第二个编辑的档案,亦即 /etc/hosts 内;
5. 在 /etc/hosts 下按『 G 』到最后一行,再输入『 p 』贴上;
6. 按下多次的『 u 』来还原原本的档案数据;
7. 最终按下『 :q 』来离开 vim 的多档案编辑!

利用多档案编辑的功能,可以让你很快速的就将需要的资料复制到正确的档案内。 当然,这个功能也可以利用窗口接口来达到,那就是底下要提到的多窗口功能。

10.3.3. 多窗口功能
在开始这个小节前,先来想象两个情况:
当我有一个档案非常的大,我查阅到后面的数据时,想要『对照』前面的数据, 是否需要使用 [ctrl]+f 与 [ctrl]+b (或 pageup, pagedown 功能键) 来跑前跑后查阅?
我有两个需要对照着看的档案,不想使用前一小节提到的多档案编辑功能;
在一般窗口接口下的编辑软件大多有『分割窗口』或者是『冻结窗口』的功能来将一个档案分割成多个窗口的展现, vim也可以!在指令列模式输入『:sp {filename}』即可!那个 filename 可有可无, 如果想要在新窗口启动另一个档案,就加入档名,否则仅输入 :sp 时, 出现的则是同一个档案在两个窗口间 ! 让我们来测试一下,你先使用『 vim /etc/man.config 』打开这个档案,然后『 1G 』去到第一行,之后输入『 :sp 』 再次的打开这个档案一次,然后再输入『 G 』,结果会变成底下这样:
这里写图片描述
万一你再输入『 :sp /etc/hosts 』时,就会变成下图这样:
这里写图片描述
两个档案同时在一个屏幕上面显示,你还可以利用『[ctrl]+w+↑』及『[ctrl]+w+↓』 在两个窗口之间移动!这样的话,复制、查阅等等的,就变的很简单了,分割窗口的相关指令功能有很多,不过你只要记得这几个就好了:
这里写图片描述

10.3.4. vim 环境设定与记录: ~/.vimrc, ~/.viminfo
如果我们以 vim 软件来搜寻一个档案内部的某个字符串时,这个字符串会被反白, 而下次我们再次以 vim 编辑这个档案时,该搜寻的字符串反白情况还是存在!甚至于在编辑其他档案时, 如果其他档案内也存在这个字符串竟然还是主动反白! 另外,当我们重复编辑同一个档案时,当第二次进入该档案时, 光标竟然就在上次离开的那一行上头!这是因为我们的 vim 会主动的将你曾经做过的行为登录下来,好让你下次可以轻松的作业! 那个记录动作的档案就是: ~/.viminfo !如果你曾经使用过 vim, 那你的家目录应该会存在这个档案才对。这个档案是自动产生的, 你不必自行建立。而你在 vim 里头所做过的动作,就可以在这个档案内部查询到,每个 distributions 对 vim 的预设环境都不太相同,举例来说,某些版本在搜寻到关键词时并不会高亮度反白, 有些版本则会主动的帮你进行缩排的行为。但这些其实都可以自行设定的,那就是 vim 的环境设定,如果你想要知道目前的设定值,可以在一般模式时输入『 :set all 』 来查阅,不过…..设定项目实在太多了。所以在这里仅列出一些平时比较常用的一些简单的设定值, 提供给你参考。
这里写图片描述
这里写图片描述
这里写图片描述
总之,这些设定值很有用处的!我们可以透过配置文件来直接规定我们习惯的 vim 操作环境! 整体 vim 的设定值一般是放置在 /etc/vimrc 这个档案,不过,不建议你修改他! 你可以修改 ~/.vimrc 这个档案 (预设不存在,请你自行手动建立!),将你所希望的设定值写入! 举例来说,可以是这样的一个档案:
这里写图片描述
在这个档案中,使用『 set hlsearch 』或『 :set hlsearch 』,亦即最前面有没有冒号『 : 』效果都是一样的! 至于双引号则是批注符号!不要用错批注符号,否则每次使用 vim 时都会发生警告讯息! 建立好这个档案后,当你下次重新以 vim 编辑某个档案时,该档案的预设环境设定就是上头写的。

10.3.5. vim 常用指令示意图
为了方便大家查询在不同的模式下可以使用的 vim 指令,查询了一些 vim 与 Linux 教育训练手册, 发现底下这张图非常值得大家参考!可以更快速有效的查询到需要的功能!
这里写图片描述

10.4. 其他 vim 使用注意事项
10.4.1. 中文编码的问题
vim 里面无法显示正常中文的原因其实这很有可能是因为编码的问题! 因为中文编码有 big5 与 utf8 两种,如果你的档案是使用 big5 编码制作的,但在 vim 的终端接口中你使用的是万国码(utf8), 由于编码的不同,你的中文档案内容当然就是一堆乱码了!怎么办?这时你得要考虑许多东西!有这些:
1. 你的 Linux 系统默认支持的语系数据:这与 /etc/sysconfig/i18n 有关;
2. 你的终端界面 (bash) 的语系: 这与 LANG 这个变数有关;
3. 你的档案原本的编码;
4. 开启终端机的软件,例如在 GNOME 底下的窗口接口。

事实上最重要的是上头的第三与第四点,只要这两点的编码一致,你就能够正确的看到与编辑你的中文档案。一般来说,中文编码使用 big5 时,在写入某些数据库系统中,在『许、盖、功』这些字体上面会发生错误! 所以近期以来大多希望大家能够使用万国码 utf8 来进行中文编码!
在 Linux 本机前的 tty1~tty6 原本默认就不支持中文编码,所以不用考虑这个问题!因为你一定会看到乱码! 现在假设俺的文件档案内编码为 big5 时,而且我的环境是使用 Linux 的 GNOME ,启动的终端接口为 GNOME-terminal 软件, 那通常是这样来修正语系编码的行为:
这里写图片描述
然后在终端接口工具栏的『终端机』–>『设定字符编码』 –>『中文 (正体) (BIG5)』项目点选一下, 如果一切都没有问题了,再用 vim 去开启那个 big5 编码的档案,就没有问题了!

10.4.2. DOS 与 Linux 的断行字符: dos2unix, unix2dos
我们在第七章里面谈到 cat 这个指令时,曾经提到过 DOS 与 Linux 断行字符的不同。 而我们也可以利用 cat -A 来观察以 DOS (Windows 系统) 建立的档案的特殊格式, 也可以发现在 DOS 使用的断行字符为 ^M$ ,我们称为 CR 与 LF 两个符号。 而在 Linux 底下,则是仅有 LF ($) 这个断行符号。这个断行符号对于 Linux 的影响很大!
我们说过,在 Linux 底下的指令在开始执行时,他的判断依据是 『Enter』,而 Linux 的 Enter 为 LF 符号, 不过,由于 DOS 的断行符号是 CRLF ,也就是多了一个 ^M 的符号出来, 在这样的情况下,如果是一个 shell script 的程序档案,将可能造成『程序无法执行』的状态, 因为他会误判程序所下达的指令内容!
我们可以透过简单的指令来进行格式的转换!
这里写图片描述
这里写图片描述
因为断行字符以及 DOS 与 Linux 操作系统底下一些字符的定义不同,因此, 不建议你在 Windows 系统当中将档案编辑好之后,才上传到 Linux 系统,会容易发生错误问题。 而且,如果你在不同的系统之间复制一些纯文本档案时,千万记得要使用 unix2dos 或 dos2unix 来转换一下断行格式!

10.4.3. 语系编码转换: iconv
很多朋友都会有的问题,就是想要将语系编码进行转换!举例来说,想要将 big5 编码转成 utf8 。使用 iconv 这个指令即可! 将之前的 vi 章节做成 big5 编码的档案,你可以照底下的连结来下载先:
http://linux.vbird.org/linux_basic/0310vi/vi.big5
在终端机的环境下你可以使用『 wget 网址』来下载上述的档案!将他下载在 /tmp/vitest 目录下。
这里写图片描述
这指令支持的语系非常之多,除了正体中文的 big5, utf8 编码之外,也支持简体中文的 gb2312 。
不过如果是要将正体中文的 utf8 转成简体中文的 utf8 编码时,那就得费些功夫了! 举例来说,如果要将刚刚那个 vi.utf8 转成简体的 utf8 时,可以这样做:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/kk53976047/article/details/78998052