Vim 文件编辑与使用

具体参考鸟哥第十章
这里写图片描述

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

在目前主要的编辑软件都会有回复的功能,亦即当你的系统因为某些原因而导致类似死机的情况时,还可
以透过某些特别的机制来让你将之前未储存的数据“救”回来!这就是鸟哥这里所谓的回复功能啦! 那么
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 会出
    现这个警告窗口!解决的方法则是:

    o 找到另外那个程序或人员,请他将该 vim 的工作结束,然后你再继续处理。
    o 如果你只是要看该文件的内容并不会有任何修改编辑的行为,那么可以选择打开成为只读(O)文件,
    亦即上述画面反白部分输入英文“ o ”即可,其实就是 [O]pen Read-Only 的选项啦!

  • 问题二:在前一个 vim 的环境中,可能因为某些不知名原因导致 vim 中断 (crashed):
    ~这就是常见的不正常结束 vim 产生的后果。解决方案依据不同的情况而不同喔!常见的处理方法为:
    o 如果你之前的 vim 处理动作尚未储存,此时你应该要按下“R”,亦即使用 (R)ecover 的项目,
    此时 vim 会载入 .man.config.swp 的内容,让你自己来决定要不要储存!这样就能够救回来你之
    前未储存的工作。不过那个 .man.config.swp 并不会在你结束 vim 后自动删除,所以你离开
    vim 后还得要自行删除 .man.config.swp 才能避克每次打开这个文件都会出现这样的警告!
    o 如果你确定这个暂存盘是没有用的,那么你可以直接按下“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 非常类似! 也会送你回到命令提示字符就是啰!

2.Vim 的功能

其实,目前大部分的 distributions 都以 vim 替代 vi 的功能了!如果你使用 vi 后,却看到画面的
右下角有显示目前光标所在的行列号码,那么你的 vi 已经被 vim 所替代啰~ 为什么要用 vim 呢?
因为 vim 具有颜色显示的功能,并且还支持许多的程序语法 (syntax), 因此,当你使用 vim 编辑
程序时( 不论是 C 语言,还是 shell script ),我们的 vim 将可帮你直接进行“程序除错 (debug)”
的功能!真的很不赖吧!^_^

如果你在文本模式下,输入 alias 时,出现这样的画面:
这里写图片描述
这表示当你使用 vi 这个指令时,其实就是执行 vim 啦!如果你没有这一行,那么你就必须要使用 vim
filename 来 vim 啰!基本上, vim de 一般用法与 vi 完全一模一样~没有不同啦!那么我们就来看看
vim 的画面是怂样啰!假设我想要编辑 /etc/man.config ,则输入“vim /etc/man.config”

这里写图片描述
上面是 vim 的画面示意图,在这个画面中有几点特色要说明喔:
1. 由于 man.config 是系统规划的配置文件,因此 vim 会进行语法检验,所以你会看到画面中内部主要为
深蓝色, 且深蓝色那一行是以批注符号 (#) 为开头;
2. 最底下一行的左边显示该文件的属性,包括 141行不 4617 字符;
3. 最底下一行的右边出现的 1,1 表示光标所在为第一行, 第一个字符位置之意(请看一下上图中的游标所在);
所以,如果你向下移动到其他位置时,出现的非批注的数据就会有点像这样:
这里写图片描述

看到了喔!除了批注之外,其他的行就会有特别的颜色显示呢!可以避免你打错字啊!而且,最右下角的
30% 代表目前这个画面占整体档案的 30%之意!

2.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 时, 这个时候光标移动过的地方就会开始反白,这三个
按键的意义分别是:`

——块选择的按键的意义
v字符选择,会将光标经过的地方反白选择!
v行选择,会将光标经过的行反白选择!
ctrl+v区块选择,可以用长方形的方式选择资料
y将反白的地方复制
d将反白的地方删除

来实际进行我们需要的动作吧!就是将 host 再加到每一行的最后面,你可以这样做:
- 使用 vim hosts 来打开该文件,记得该文件请由上述的链接下载先!
- 将光标移动到第一行的 host 那个 h 上央,然后按下 [ctrl]-v ,左下角出现区块示意字样:
这里写图片描述
- 将光标移动到最底部,此时光标移动过的区域会反白!如下图所示:
这里写图片描述
- 此时你可以按下“y ”来进行复制,当你按下 y 之后,反白的区块就会消夭不见啰!
- 最后,将光标移动到第一行的最右边,并且再用编辑模式向右按两个空格键,回到一
般模式后, 再按下 “p ”后,你会发现很有趣!如下图所示:
这里写图片描述
透过上述的功能,你可以复制一个区块,并且是贴在某个“区块的范围”内,而不是以行为单位
来处理你的整份文件喔! 鸟哥个人是觉得这玩意儿非常的有帮助啦!至少在进行排列整齐的文本
文件中复制/删除区块时,会是一个非常棒的功能!

2.2多文件编辑

假设一个例子,你想要将刚刚我们的 hosts 内的 IP 复制到你的 /etc/hosts 这个文件去,那么该如
何编辑?我们知道在 vi 内可以使用 :r filename 来读入某个文件的内容,不过,这样毕竟是将整个
文件读入啊!如果我只是想要部分内容呢?呵呵!这个时候多文件同时编辑就很有用了。 我们可以
使用 vim 后面同时接好几个文件来同时打开喔!相关的按键有:

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

在过去,鸟哥想要将 A 文件内的十条消息“移动”到 B 文件去,通常要开两个 vim 窗口来复制,偏偏
每个 vim 都是独立的,因此并没有办法在 A 文件下达“ nyy ”再跑到 B 文件去“p”啦! 在这种情况下
最常用的方法就是透过鼠标圈选,复制后贴上。不过这样一来还是有问题,因为鸟哥超级喜欢使用 [Tab]
按键进行编排对齐动作,透过鼠标却会将 [Tab] 转成空格键,这样内容就不一样了!此时这个多文件编辑
就派上用场了!

现在你可以做一下练习看看说!假设你要将刚刚鸟哥提供的 hosts 内的前四行 IP 资料复制到你的
/etc/hosts 档案内,那可以怎么进行呢?可以这样啊:
- 透过“ vim hosts /etc/hosts ”指令来使用一个 vim 打开两个文件;
- 在 vim 中先使用“ :files ”察看一下编辑的文件数据有啥?结果如下所示。 至于下图的最后一行
显示的是“按下任意键”就会回到 vim 的一般模式中!
这里写图片描述
- 在第一行输入“ 4yy ”复制四行;
- 在 vim 的环境下输入“ :n ”会来到第二个文件,亦即 /etc/hosts 内;
- 在 /etc/hosts 下按“ G ”到最后一行,再输入“ p ”贴上;
- 按下多次的“ u ”来还原原本的文件数据;
- 最终按下“ :q ”来离开 vim 的多档案文件吧!
看到了吧?利用多文件编辑的功能,可以让你很快速的就将需要的资料复制到正确的文件内。
当然啰,这个功能也可以利用窗口接口来达到,那就是底下要提到的多窗口功能。

2.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+↓” 在两个窗口之间移动呢!这样的话,复制啊、查阅啊等等的,就变的很简单啰~ 分割窗口的相关指令功能有很多,不
过你只要记得这几个就好了:

-多窗口情况下的按键功能
: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 的分割窗口时,真是很高兴啊!竟然有这种功能!太棒了! ^_^

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

有没有发现,如果我们以 vim 软件来搜寻一个文件内部的某个字符串时,这个字符串会被反白, 而下
次我们再次以 vim 编辑这个文件时,该搜寻的字符串反白情况还是存在呢!甚至于在编辑其他文件时,
如果其他文件内也存在这个字符串,哇!竟然还是主动反白耶!真神奇! 另外,当我们重复编辑同一个
文件时,当第二次进入该文件时, 光标竟然就在上次离开的那一行上头呢!真是好方便啊~但是,怎么
会这样呢? 这是因为我们癿的vim 会主动的将你曾经做过的行为登录下来,好让你下次可以轻松的作业
啊! 那个记录动作的文件就是: ~/.viminfo !如果你曾经使用过 vim, 那你的家目录应该会存在这个
文件才对。这个档文件是自动产生的,你不必自行建立。而你在 vim 里所做过的动作,就可以在这个
文件内部查询到啰~ ^_^ 此外,每个 distributions 对 vim 的预设环境都不太相同,举例来说,某些版
本在搜寻到关键词时并不会高亮度反白, 有些版本则会主动的帮你进行缩排的行为。但这些其实都可以
自行设定的,那就是 vim 的环境设定啰~ vim 的环境设定参数有很多,如果你想要知道目前的设定值,
可以在一般模式时输入”:set all “ 来查阅,不过…..设定项目实在太多了~所以,鸟哥在这里仅列出一些
平时比较常用的一些简单的设定值, 提供给你参考啊。
`Tips: 所谓的缩排,就是当你按下 Enter 编辑新的一行时,光标会会在行首,而是在不上一行的第一个非

-vim 的环境设置参数
:set nu
:set nonu
就是设定与消行号啊!
:set hlsearch
:set nohlsearch
hlsearch 就是 high light search(高亮度搜寻)。 这个就是设定是否将搜寻的字符串反白的设定值。默认值是 hlsearch
:set autoindent
:setnoautoindent
是否自动缩排?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 这个文件 (预设不存在,请你自行手动建立!),将你所希望的设定值写入! 举例来说,可以是这样的一个文件:
这里写图片描述
在这个文件中,使用“ set hlsearch “或” :set hlsearch “,亦即最前面有没有冒号: 效果都是一样的!
至亍双引号则是批注符号!不要用错批注符号,否则每次使用 vim 时都会发生警告讯息喔! 建立好
这个文件后,当你下次重新以 vim 编辑某个文件时,该文件的预设环境设定就是上头写的啰~ 这样,
是否很方便你的操作啊!多多利用 vim 的环境设定功能呢!^_^

2.5 vim 常用命令示意图

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

3其他 vim 使用注意事项

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

3.1中文编码癿问题

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

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

3.2DOS 不 Linux 的断行字符

我们在第七章里面谈到 cat 这个指令时,曾经提到过 DOS 不 Linux 断行字符的不同。而我们也可以利用
cat -A 来观察以 DOS (Windows 系统) 建立的文件的特殊格式, 也可以发现在 DOS 使用的断行字符为
^M CRLFLinuxLF( ) 这个断行符号。这个断行符号对
于 Linux 的影响很大喔! 为什么呢? 我们说过,在 Linux 底下的指令在开始执行时,他的判断依据是
^M 的符号出来, 在这样的情况下,如果是一个 shell script 的程序文件,呵呵~将可能造成程序无法执行
的状态~ 因为他会误判程序所下达的指令内容啊!这很伤脑筋吧! 那怂么办啊?很简单啊,将格式
转换成为 Linux 即可啊!”废话“,这当然大家都知道,但是, 要以 vi 进入该文件,然后一个一个删除
这里写图片描述
这里写图片描述
因为断行字符以及 DOS 不 Linux 操作系统底下一些字符的定义不同,因此,不建议你在 Windows 系统当
中将文件编辑好之后,才上传到 Linux 系统,会容易发生错误问题。 而且,如果你在不同的系统之间复制
一些纯文本文件时,千万记得要使用 unix2dos 戒 dos2unix 来转换一下断行格式啊!

3.3.语系编码转换

很多朋友都会有的问题,就是想要将语系编码进行转换啦!举例来说,想要将 big5 编码转成 utf8 。 这个
时候怎么办?难不成要每个文件打开会转存成 utf8 吗?不需要这样做啦!使用 iconv 这个指令即可! 鸟哥
将之前的vi 章节做成 big5 编码的文件,你可以照底下的连结来下载先:http://linux.vbird.org/linux_basic/0310vi/vi.big5

在终端机的环境下你可以使用”wget 网址“来下载上述的文件喔!鸟哥将他下载在 /tmp/vitest 目录下。
接下来让我们来使用 iconv 这个指令来玩一玩编码转换吧!
这里写图片描述
这指令支持的语系非常之多,除了正体中文的 big5, utf8 编码之外,也支持简体中文的 gb2312 , 所以
对岸的朋友可以简单的将鸟站的网页数据下载后,利用这个指令来转成简体,就能够轻松的读取文件数据
啰! 不过,不要将转成简体的文件又上传成为您自己的网页啊!这明明是鸟哥写的不是吗? ^_^
不过如果是要将正体中文的utf8 转成简体中文的 utf8 编码时,那就得费些功夫了! 举例来说,如果
要将刚刚那个 vi.utf8 转成简体的 utf8 时,可以这样做:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值