9.3 vim 的额外功能

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

如果你在文字模式下,输入 alias 时,出现这样的画面:

[dmtsai@study ~]$ alias
....其他省略....
alias vi='vim'  <==重点在这列啊!

这表示当你使用 vi 这个指令时,其实就是执行 vim 啦!如果你没有这一列,那么你就必须要使用 vim filename 来启动 vim 啰!基本上, vim 的一般用法与 vi 完全一模一样~没有不同啦!那么我们就来看看 vim 的画面是怎样啰!假设我想要编辑 /etc/services ,则输入“vim /etc/services”看看吧:

使用 vim 编辑系统配置文件的示范图9.3.1、使用 vim 编辑系统配置文件的示范

上面是 vim 的画面示意图,在这个画面中有几点特色要说明喔:

  1. 由于 /etc/services 是系统规划的配置文件,因此 vim 会进行语法检验,所以你会看到画面中内部主要为深蓝色, 且深蓝色那一列是以注解符号 (#) 为开头;
  2. 画面中的最下面一列,在左边显示该文件的属性,包括只读文件、内容共有 11176 列与 670293 个字符;
  3. 最下面一列的右边出现的 1,1 表示光标所在为第一列, 第一个字符位置之意(请看上图中的光标所在);

所以,如果你向下移动到其他位置时,出现的非注解的数据就会有点像这样:

使用 vim 编辑系统配置文件的示范图9.3.2、使用 vim 编辑系统配置文件的示范

看到了喔!除了注解之外,其他的列就会有特别的颜色显示呢!可以避免你打错字啊!而且, 最右下角的 1% 代表目前这个画面占整体文件的 1% 之意!这样瞭乎?

9.3.1 区块选择(Visual Block)

刚刚我们提到的简单的 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
.....中间省略......

这个文件我将他放置到 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 将反白的地方删除掉
p 将刚刚复制的区块,在光标所在处贴上!

来实际进行我们需要的动作吧!就是将 host 再加到每一列的最后面,你可以这样做:

  1. 使用 vim hosts 来打开该文件,记得该文件请由上述的链接下载先!
  2. 将光标移动到第一列的 host 那个 h 上头,然后按下 [ctrl]-v ,左下角出现区块示意字样:

    vim 的区块选择、复制、贴上等操作功能图9.3.3、vim 的区块选择、复制、贴上等功能操作

  3. 将光标移动到最底部,此时光标移动过的区域会反白!如下图所示:

    vim 的区块选择、复制、贴上等操作功能图9.3.4、vim 的区块选择、复制、贴上等功能操作

  4. 此时你可以按下“ y ”来进行复制,当你按下 y 之后,反白的区块就会消失不见啰!
  5. 最后,将光标移动到第一列的最右边,并且再用编辑模式向右按两个空白键,回到一般指令模式后, 再按下“ p ”后,你会发现很有趣!如下图所示:

    vim 的区块选择、复制、贴上等操作功能图9.3.5、vim 的区块选择、复制、贴上等功能操作

通过上述的功能,你可以复制一个区块,并且是贴在某个“区块的范围”内,而不是以列为单位来处理你的整份文件喔! 鸟哥个人是觉得这玩意儿非常的有帮助啦!至少在进行排列整齐的文字文件中复制/删除区块时,会是一个非常棒的功能!

9.3.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 文件内,那可以怎么进行呢?可以这样啊:

  1. 通过“ vim hosts /etc/hosts ”指令来使用一个 vim 打开两个文件;
  2. 在 vim 中先使用“ :files ”察看一下编辑的文件数据有啥?结果如下所示。 至于下图的最后一列显示的是“按下任意键”就会回到 vim 的一般指令模式中!

    vim 的多文件编辑中,查看同时编辑的文件数据图9.3.6、vim 的多文件编辑中,查看同时编辑的文件数据

  3. 在第一列输入“ 4yy ”复制四列;
  4. 在 vim 的环境下输入“ :n ”会来到第二个编辑的文件,亦即 /etc/hosts 内;
  5. 在 /etc/hosts 下按“ G ”到最后一列,再输入“ p ”贴上;
  6. 按下多次的“ u ”来还原原本的文件数据;
  7. 最终按下“ :q ”来离开 vim 的多文件编辑吧!

看到了吧?利用多文件编辑的功能,可以让你很快速的就将需要的数据复制到正确的文件内。 当然啰,这个功能也可以利用窗口接口来达到,那就是下面要提到的多窗口功能。

9.3.3 多窗口功能

在开始这个小节前,先来想像两个情况:

  • 当我有一个文件非常的大,我查阅到后面的数据时,想要“对照”前面的数据, 是否需要使用 [ctrl]+f 与 [ctrl]+b (或 pageup, pagedown 功能键) 来跑前跑后查阅?

  • 我有两个需要对照着看的文件,不想使用前一小节提到的多文件编辑功能;

在一般窗口接口下的编辑软件大多有“分区窗口”或者是“冻结窗口”的功能来将一个文件分区成多个窗口的展现, 那么 vim 能不能达到这个功能啊?可以啊!但是如何分区窗口并放入文件呢? 很简单啊!在命令行界面输入“:sp {filename}”即可!那个 filename 可有可无, 如果想要在新窗口启动另一个文件,就加入文件名,否则仅输入 :sp 时, 出现的则是同一个文件在两个窗口间!

让我们来测试一下,你先使用“ vim /etc/man_db.conf ”打开这个文件,然后“ 1G ”去到第一列,之后输入“ :sp ” 再次的打开这个文件一次,然后再输入“ G ”,结果会变成下面这样喔:

vim 的窗口分区示意图图9.3.7、vim 的窗口分区示意图

万一你再输入“ :sp /etc/hosts ”时,就会变成下图这样喔:

vim 的窗口分区示意图图9.3.8、vim 的窗口分区示意图

怎样?帅吧!两个文件同时在一个屏幕上面显示,你还可以利用“[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 的分区窗口时,真是很高兴啊!竟然有这种功能!太棒了! ^_^

9.3.4 vim 的挑字补全功能

我们知道 bash 的环境下面可以按下 [tab] 按钮来达成指令/参数/文件名的补全功能,而我们也知道很多的程序编辑器,例如鸟哥用来在 windows 系统上面教网页设计、java script 等很好用的 notepad++ (https://notepad-plus-plus.org/) 这种类的程序编辑器,都会有 (1)可以进行语法检验及 (2)可以根据扩展名来挑字的功能!这两个功能对于程序设计者来说, 是很有帮助的!毕竟偶尔某些特定的关键字老是背不起来...

在语法检验方面,vim 已经使用颜色来达成了!这部份不用伤脑筋的!比较伤脑筋的应该是在挑字补全上面!就是上面谈到的可以根据语法来挑选可能的关键字, 包括程序语言的语法以及特定的语法关键字等等。既然 notepad ++ 都有支持了,没道理 vim 不支持吧?呵呵!没错! 是有支持的~只是你可能要多背两个组合按钮就是了!

鸟哥建议可以记忆的主要 vim 补齐功能,大致有下面几个:

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

在鸟哥的认知中,比较有用的是第1, 3 这两个组合键,第一个组合按键中,你可能会在同一个文件里面重复出现许多相同的关键字, 那么就能够通过这个补全的功能来处理。如果你是想要使用 vim 内置的语法检验功能来处理取得关键字的补全,那么第三个项目就很有用了。 不过要注意,如果你想要使用第三个功能,就得要注意你编辑的文件的扩展名。我们下面来做个简单测试好了。

假设你想要编写网页,正要使用到 CSS 的美化功能时,突然想到有个背景的东西要处理,但是突然忘记掉背景的 CSS 关键语法,那可以使用如下的模样来处置! 请注意,一定要使用 .html 或 .php 的扩展名,否则 vim 不会调用正确的语法检验功能喔!因此下面我们创建的文件名为 html.html 啰!

vim 的挑字补全功能图9.3.9、vim 的挑字补全功能

由于网页通常会支持 CSS 的语法,而 CSS 的美化语法使用的是 style 这个关键字,这个关键字后面接的就是 CSS 的元素与元素值。 若想要取得可能的元素有哪些,例如背景 (background) 的语法中,想要了解有哪些跟它有关的内置元素,如上图, 直接输入 b 然后按下 [crtl]+x 再按下 [crtl]+o 就会出现如上的相关字词可以选择,此时你就能够使用上下按钮来挑选所需要的关键元素! 这样使用上当然方便很多啊!只是要注意,一定要使用正确的扩展名,否则会无法出现任何关键字词喔!

9.3.5 vim 环境设置与记录: ~/.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 :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 这个文件 (默认不存在,请你自行手动创建!),将你所希望的设置值写入! 举例来说,可以是这样的一个文件:

[dmtsai@study ~]$ 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 的环境设置功能呢!^_^

9.3.6 vim 常用指令示意图

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

vim 常用指令示意图图9.3.10、vim 常用指令示意图