• 03
  • 8月

命令行内容说明

如前所述,所谓的命令行或命令模式,就是在最下面一行没有显示 『–INSERT–』或者『–REPLACE–』 字样的时候。通常在命令行中的指令有下面几种:(注意,当按下 『:』 时,光标会自动移动到屏幕的最下面一行!)

一般模式:
移动光标的方法


特别注意,在 vi 中,『数字』是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前~那我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。

OK!会这些指令就已经很厉害了,因为常用到的指令也只有不到一半!通常 vi 的指令除了上面鸟哥注明的常用的几个外,其他是不用背的,你可以做一张简单的指令表在你的屏幕墙上, 一有疑问可以马上的查询呦!

一个案例练习

来来来!测试一下您是否已经熟悉 vi 这个指令呢?请依照底下的需求进行您的指令动作。 (底下的操作为使用 FC4 的预设档案来进行练习的。您可以在这里下载: 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,并且一个一个挑选是否需要修改,如何下达指令?
  9. 修改完之后,突然反悔了,要全部复原,有哪些方法?
  10. 我要复制 51 到 60 行这十行的内容,并且贴到最后一行之后;
  11. 删除 11 到 30 行之间的 20 行;
  12. 将这个档案另存成一个 man.test.config 的檔名;
  13. 去到第 29 行,并且删除 15 个字符;
  14. 储存后离开吧!

整个步骤可以如下显示:

  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』,则会去到第 116 行才对!
  8. 直接下达『 :50,100s/man/MAN/gc 』即可!
  9. (1)简单的方法可以一直按『 u 』回复到原始状态,(2)使用不储存离开『 :q! 』之后,再重新读取一次该档案;
  10. 51G
    然后再『 10yy 』之后按下『 G 』到最后一行,再给他『 p 』贴上十行!
  11. 11G
    之后,再给他『 20dd 』即可删除 20 行了;
  12. :w man.test.config
  13. 29G
    之后,再给他『 15x 』即可删除 15 个字符;
  14. :wq!

如果您的结果都可以查的到,那么 vi 的使用上面应该没有太大的问题啦!剩下的问题会是在…..打字练习…。

关于档案的回复与暂存盘

另外,其实 vi 是具有『可回复』功能的呢!那么 vi 凭什么帮我们进行回复的功能呢? 很简单啊!凭暂存档啊!举例来说,当我们编辑一个档案时,假设名称为 /tmp/passwd , 那么在这个 /tmp 底下就会有一个临时文件,档名为『 /tmp/.passwd.swp 』,这是一个隐藏档, 我们所进行的一些修改都会暂时存在这个档案当中,万一在档案修改过程中, 系统挂了,那么下次你再重新 vi /tmp/passwd 时,系统就会告诉您,是否需要回复『Recovery』成修改过程中的模样? 如果您按下 (R) ,嘿嘿!就可以将数据回复到修改过程的样子,而不是源文件啰! 这是个很有用的功能喔! ^_^

这也就是说,如果有一天,您去 /tmp 底下,执行 ls -al 时,发现到底下有两个档案, 档名分别为 passwd 与 .passwd.swp 的话,那么 (1) 可能有人在编辑这个档案; (2) 之前您在编辑这个档案时,因为某些不知名的因素导致 vi 程序中断,则该暂存档就会存在。 如果是状态 (2) ,则此时您可以将该 .passwd.swp 档案删除,或者是,直接 vi /tmp/passwd , 在 vi 出现是否回复时,选择回复,然后储存更新 /tmp/passwd ,之后再将这个 /tmp/.passwd.swp 档案删除即可! 如果不删除的话,那么每次编辑这个档案,都会告知您该档案有问题啊! @_@

vim 的额外功能

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

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

[root@linux ~]# alias
alias vi=’vim’

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

#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.5p
#
# For more information about this file, see the man pages man(1)
# and man.conf(5).
“man.config” 138L, 4506C 1,1 Top


上面的图示是 vim 一画面一角~他有几个特色要讲:

  1. 最底下一行说明这个档案的特色,包括 138 行,共 4506 字符等等。
  2. 那个 1,1 代表目前光标在第一行的第一个字符上。您可以看到第一行有个光标的存在啊!
  3. 那个 Top 则表示,这个画面是整个档案的最上方!

至少就有这些信息。而在您移动光标时,那个 1,1 的游标定位也会跟着变动,是否很方便啊! 好了,底下我们就来谈一谈其他 vim 的用法吧!

区块选择(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 ,您可以自行下载来看一看这个档案啊! 如果我想要复制的只是前面的 IP 数字部分,后面的主机名部分就不给他复制,那怎么办? 这个时候就得需要使用区块选择(Visual Block)的功能了。当我们按下 v 或者 V 或者 [Ctrl]+v 时, 这个时候光标移动过的地方就会开始反白,这三个按键的意义分别是:

区块选择的按键意义


我们以上面的 IP 对应主机名为范例,如果想要复制的是 IP 的话,而且仅想要前面四行, 那么我可以:

  1. 将光标移动到第一行的第一个字符 ( 1G );
  2. 然后按下 [Ctrl]+v (按着 [ctrl] 不放,再按下 v );
  3. 然后移动箭头键,向下向右移动数格,让整个反白区域涵盖 191.168.1.1 到 192.168.1.4 ;
  4. 按下 y 复制 (此时反白会自动的不见) ;
  5. 移动到任何想要插入的区域,按下 p 就可以插入刚刚复制的区块内容!举例来说,移动到第 1 行的第 13 个字符处按下小写的 p ,看看会怎样?

这个区块选择在已经格式的档案中,就会显的很有帮助喔!尤其是我们想要大量复制其中一个区块, 而不是整行复制的场合中,就会很有用的啦!

多档案编辑

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

多档案编辑的按键


这个功能也很棒啊!现在您可以做一下练习看看说!假设您要将刚刚鸟哥提供的 hosts 内的 IP 复制到您的 /etc/hosts 档案内,那可以怎么进行呢?可以这样啊:

[root@linux ~]# vi hosts /etc/hosts
# 在这个档案中利用上个小节提到的区块选择,按下 [ctrl]+v 来进行区块选择,并复制。
# 然后按下 :n 在指令列的地方输入这玩意儿,就会转到下一个档案去,这个时候,
# 就可以按下 p 将刚刚复制的 IP 给贴到您的档案中啰!如果您按下 :files ,则:

192.168.1.4 host4.class.net
192.168.1.5 host5.class.net
~
~

:files
1 %a “hosts” line 1
2 # “/etc/hosts” line 1
Hit ENTER or type command to continue


# 看到否?在指令列输入 :files 就可以显示目前所编辑的档案信息啰!


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

多窗口功能

想象两个情况:

  • 当我有一个档案非常的大,我查阅到后面的数据时,想要『对照』前面的数据, 是否需要使用 [ctrl]+f 与 [ctrl]+b 来跑前跑后查阅?
  • 我有两个需要对照着看的档案,不想使用前一小节提到的多档案编辑功能;

这样的情况下,开一个 vim 里头有两个窗口的环境,就有需要啦!那么如何开启新窗口呢? 很简单啊!在指令列模式输入:『:sp {filename}』,那个 filename 可有可无, 如果想要在新窗口启动另一个档案,就加入档名,否则仅输入 :sp 时, 出现的则是同一个档案在两个窗口间!例如鸟哥使用 vim hosts 后,再以 :sp /etc/hosts , 结果出现如下图示:

# Do not remove the following line, or various programs
# that require network functionality will fail.

127.0.0.1 localhost.localdomain localhost
192.168.1.11 vbird-work
192.168.1.2 vbird-server
~
/etc/hosts 5,1 All
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
192.168.1.5 host5.class.net
hosts 1,1 Top

怎样?帅吧!两个档案同时在一个屏幕上面显示,您还可以利用『[ctrl]+w+j』及『[ctrl]+w+k』 在两个窗口之间移动呢!这样的话,复制啊、查阅啊等等的,就变的很简单啰~ 指令的功能有很多,不过,您只要记得这几个就好了:

多窗口情况下的按键功能

vim 环境设定

有没有发现,如果我们以 vim 软件来搜寻一个档案内部的某个字符串时,这个字符串会被反白, 而下次我们再次以 vim 编辑这个档案时,该搜寻的字符串还是存在呢!甚至于, 编辑其他档案时,如果其他档案也存在这个字符串,哇!!竟然还是主动反白耶! 另外,当我们重复编辑同一个档案时,当第二次进入该档案时, 光标竟然就在上次离开的那一行上头呢!真是好方便啊~但是,怎么会这样呢?

这是因为我们的 vim 会主动的将您曾经做过的行为登录下来,好让您下次可以轻松的作业啊! 那个记录动作的档案就是: ~/.viminfo 这个档案啦!每个人的家目录都应该会存在这个档案才对~这个档案是自动产生的, 您不必自行建立。而你在 vim 里头所做过的动作,就可以在这个档案内部查询到啰~ ^_^

此外,某些 distributions 的 vim 当中,利用搜寻时,他并不会显示反白, 有些 distributions 则会主动的帮您进行缩排的行为 (所谓的缩排, 就是当您按下 Enter 编辑新的一行时,光标不会在行首,而是在与上一行的第一个非空格符处对齐!)。 这些其实都可以进行设定的,那就是 vim 的环境设定啰~ vim 的环境设定参数有很多,如果您想要知道目前的设定值,可以在一般模式时输入:『 :set all 』 来查阅,不过…..设定项目实在太多了~所以,鸟哥在这里仅列出一些平时比较常用的一些简单的设定值, 提供给您参考啊:

vim 的环境设定参数


总之,这些设定值很有用处的啦!但是……我是否每次使用 vim 都要重新设定一次各个参数值? 这不太合理吧?!没错啊!所以,我们可以透过配置文件来直接规定我们习惯的 vim 操作环境呢! 整体 vim 的设定值一般是放置在 /etc/vimrc 这个档案,不过,不建议您修改他! 你可以修改 ~/.vimrc 这个档案 (预设不存在,请您自行手动建立!),将您所希望的设定值写入! 举例来说,可以是这样的一个档案:

[root@linux ~]# vi ~/.vimrc
:set hlsearch
:set backspace=2
:set autoindent
:set rulet
:set showmode
:syntax on

等等,这样,当您下次重新以 vim 编辑某个档案时,该档案的预设环境设定就是上头写的啰~ 这样,是否很方便您的操作啊!多多利用 vim 的环境设定功能呢!^_^

标签:

您可以对这篇文章发表一条评论,或者在您自己的网站中引用 (Trackback) 它

发表一条评论

所有标签:.net Ajax Java javascript Linux map MySQL RSS TD-SCDMA Ubuntu vim web Win7 乱码 基础知识 备份 奥运会 希望泉 性能 缓存 编程