第三部分 学习shell与shell scipt---第九章 vim程序编辑器

9.1 vi与vim

为何要学vim

1.所有的UNIX-like 系统都会内置vi文本编辑器,其他的文本编辑器则不一定会存在;

2.很多软件的编辑接口都会主动调用vi(例如未来会谈到的crontab、visudo、edquota等命令);

3.vim具有程序编辑的能力,可以主动地以字体颜色辨别语法的正确性,方便程序设计;

4.因为程序简单,编辑速度相当快速;

vi的使用

vi共分为3种模式

1.一般命令模式

2.编辑模式

3.命令行模式

三种模式的作用分别是:

一般命令模式(command mode):

    以vi打开一个文件就直接进入一般命令模式了(这是默认的模式,也简称为一般模式),在这个模式中,你可以使用【上下左右】按键来移动光标,你可以使用【删除字符】或【删除整行】来处理文件内容,也可以使用【复制粘贴】来处理你的文件内容。

编辑模式(insert mode):

    在一般命令模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容,要等到你按下【i、o、a、r】等任何一个字母之后才会进入编辑模式。注意了,通常在linux中,按下这些按键时,在界面的左下方会出现【INSERT】或【REPLACE】的字样,此时才可以进行编辑,而如果要回到一般命令模式时,则必须要按下【ESC】这个按键即可退出编辑模式。

命令行模式(command-line mode):

    在一般模式当中,输入【:/ ?】三个钟的任何一个按钮,就可以将光标移动到最下面那一行。在这个模式当中,可以提供你【查找数据】的操作,而读取、保存、批量替换字符、退出vi、显示行号等的操作则是在此模式中完成。

简单的说,你会发现一般命令模式可与编辑模式及命令行模式切换,但编辑模式与命令行模式之间不可相互切换,这非常重要。

9.2.2按键说明     

vim常用的内置命令

 一般命令模式可用的功能按键,光标移动、复制粘贴、查找替换等 

     移动光标的方法:

            【ctrl】 + f  :屏幕向下移动一页

            【ctrl】 + b :屏幕向上移动一页

            【ctrl】 + d :屏幕向下移动半页

            【ctrl】 + u :屏幕向上移动半页

              0 :移动到这一行的最前面字符处(数字0)

              $ :移动到这一行的最后一个字符

              G :移动到这个文件的最后一行

              gg :移动到这个文件的第一行,相当去1G

              n<Enter> :n为数字,光标向下移动n行

     查找与替换:

            /word :向光标之下寻找一个名称为word的字符串。例如要在文件内查找vbird这个字符串,就输入/vbird

            ?word:向光标之上寻找一个字符串名称为word的字符串

            n:代表重复前一个查找的操作。举例来说,如果刚刚我们执行/vbird去向下查找vbird这个字符串,则按下n后,会向下继续查找下一个名称为vbird的字符串,如果是?vibird的话,那么按下n则会向上继续查找名称为vibird的字符串

            N:与n刚好相反,为反向进行前一个查找操作,例如/vbird后,按下N则表示向上查找vbird

            :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)是否需要替换

      删除、复制与粘贴:

            x与X :在一行当中,x为向后删除一个字符(相当于del按键),X为向前删除一个字符(相当于Backspace按键)

            dd :删除(剪切)光标所在的那一整行

            ndd :n为数字,删除(剪切)光标所在的向下n行,列入20dd则是删除(剪切)20行

            yy :复制光标所在的那一行

                   nyy :n为数字,复制光标所在的向下n行

            p与P :p为将已复制的数据在光标下一行粘贴,P则为贴在光标上一行

            u :恢复前一个操作

            Ctrl + r :重做上一个操作

            . :不要怀疑,这就是小数点,意思是重复前一个操作的意思。如果你想要重复删除、重复粘贴

一般命令模式切换到编辑模式的可用的按键说明:

      进入插入或替换的编辑模式:

            i与l :进入插入模式,i为从目前光标所在处插入,l为在目前所在行的第一个非空格符处开始插入

            a与A :a为从目前光标所在的下一个字符处开始插入,A为从光标所在行的最后一个字符处开始插入

            o与O :这是英文字母o的大小写,o为在目前光标所在的下一行处插入新的一行,O为在目前光标所在处的上一行插入新的一行

               r与R :r只会替换光标所在的那一个字符一次,R会一直替换光标所在的文字,知道按下Esc为止

            上面这些按键中,在vi界面的左下角处会出现--INSERT--或--REPLACE--的字样。由名称就知道该操作了吧!你想要在文件里面输入字符时,一定要在左下角处看到INSERT或REPLACE才能输入

            Esc :退出编辑模式,回到一般命令模式中

一般命令模式切换到命令行模式的可用按键说明:

            :w :将编辑的数据写入硬盘文件中

            :q :退出vi

            :wq :保存后退出,若为:wq!则为强制保存后退出

            :set nu :显示行号,设置之后,会在每一行的前缀显示该行的行号

            :set nonu :与set nu相反,为取消行号

特别注意,在vi中,数字是很有意义的,数字通常代表重复做几次的意思,也有可能是代表去到第几个什么什么的意思。

9.2.4 vim的缓存、恢复与打开时的警告信息

    目前文本编辑软件都会有恢复的功能,当你系统因为某些原因而导致类似的宕机的情况时,还可以通过某些特别的机制来让你将之前未保存的数据救回来,vim是通过缓存来恢复。当我们在使用vim编辑室,vim会在与被编辑的文件的目录下,再建立一个名为.filename.swp的文件,这个文件就是缓存文件,你对正在编辑的文件所做的操作就会被记录到这个swp缓存文件中。

    由于vim的工作被不正常地中断,导致缓存无法借由正常流程来结束,所以缓存就不会消失,而继续保留下来。

此时你在继续编辑中断的那个文件会出现错误代码的状态,由于缓存存在的关系,因此vim会主动地判断你的这个文件可能有些问题。会提示两点主要的问题与解决方案,分别是这样:

    问题一:可能有其他人或程序同时在编辑这个文件: 

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

    问题二:在前一个vim的环境中,可能某些原因导致vim中断,这就是常见的不正常结束vim产生的后果,解决方案依据不同的情况而不同,常见的处理方法为:1.如果你之前的vim处理操作尚未保存,此时你应该要按下R,亦即使用(R)ecover的选项,此时vim会加载.filename,swp的内容,让你自己来决定要不要保存,这样就能够救回来你之前未保存的信息。不过这个filename.swp并不会在你结束vim后自动删除,所以退出vim后还得要自行删除.filename.swp这个缓存文件才能避免每次打开这个文件都会出现这样的警告。如果你确定这个缓存是没有用的,那么按下D删除这个缓存就可以了,此时vim会加载filename文件,并自行将旧的.filename.swp删除,并且删除这个swap缓存之后,建立这次会使用新的.filename.swp缓存。

至于这个发现缓存警告信息的界面中,有出现六个按键,各按键说明如下:

      O:打开此文件成文只读文件,可以用在只是想要看该文件内容不想要进行编辑操作时,一般来说,当你登录到某台计算机去看它的配置文件,结果发现其实同学它自己也在编辑时,可以使用这个模式。

      E:还是用正常的方式打开你要编辑的那个文件,并不会加载缓存的内容,不过很容易出现两个用户互相改变对方的文件等问题。

      R:就是加载缓存的内容,用在你要救回之前未保存的工作,不过当你救回来并且保存退出vim后,还是要手动自行删除那个缓存。

      D:你确定那个缓存是无用的,那么打开文件前会先将这个缓存删除,这个操作其实是比较常做,因为你可能不确定这个缓存是怎么来的,所以就删除掉它把!

      Q:按下q就退出vim,不会进行任何操作回到命令提示符。

      A:忽略这个操作,感觉上与quit非常类似,也会送你回到命令提示符。

可视区块(Visual Block

                                                        可视区块的按键意义:

v 字符选择,会将光标经过的地方反白选择
V 行选择,会将光标经过的行反白选择
[Ctrl] + v 可视区块,可以用矩形的方式选择数据
y 将反白的地方复制起来
d 将反白的地方删除
p 将刚刚复制的区块,在光标所在处粘贴

                 多文件编辑: 多文件编辑按键功能                          

                        使用vim同时打开多个文件的命令使用命令 : vim filename  filename

:n 编辑下一个文件
:N 编辑上一个文件
:files 列出目前这个额vim开启的所有文件

                  多窗口功能:多功能窗口功能按键

sp [filename] 打开一个新窗口,如果有加filename,表示在新窗口创建一个新文件,否则表示两个窗口为同一个文件内容(同步显示)
[Ctrl] + w + j(j或者pgdn) 按键的方法是:先按下[Ctrl] 不放,再按下w后放开所有的按键,之后按j或者下箭头键,则光标可移动到下方的窗口
[Ctrl] + w + k(k或者pgup) 同上,不过光标移动到上面的窗口
[Ctrl] + w + q 其实就是:q结束退出,举例来说,如果我想要结束下方的窗口,那么利用[Ctrl] + w + j(j或者pgdn)移动到下方窗口后,输入:q即可退出,也可以按下[Ctrl] + w + q,此外也可是输入:close关闭所有的窗口

vim的关键词补全功能:

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

 vim环境设置与记录:~/.vimrc、~/.viminfo:

                    当我们以vim软件来查找一个文件内部的某个字符串时,这个字符串会被反白,而下次我们再次以vim编辑这个文件时,该查找的字符串反白情况还是存在。甚至于在编辑其他文件时,如果其他文件内也存在这个字符串,哇,竟然还是主动反白,真神奇。另外,当我们重复编辑同一个文件时,当第二次进入该文件时,光标竟然就在上次退出的那一行上面。真是方便,但是,怎么会这样呢?

                    这是因为我们的vim会主动地将你曾经做过的操作记录下来,好让你下次可以轻松作业,这个记录操作的文件就是:~/.viminfo。如果你曾经使用过vim,那你的根目录应该会存在这个文件才对(书上是这么说的,但实际操作是在家目录),这个文件是自动产生的,你不必自行建立。而你在vim里面所做过的操作,就可以在这个文件内部查询得到。

                    此外,每个linux发行版对vim的默认环境都不太相同,举例来说,某些版本在查询找到关键词时并不会高亮度反白,有些版本则会主动帮你进行缩进的操作(所谓缩进,就是当你按下Enter编辑新的一行时,光标不会在行首,而是在与上一行的第一个非空格符处对齐)。但是这些操作其实都可以自行设置的,那就是vim的环境设置,vim的环境设置参数有很多,如果你想要知道目前的设置值,可以在一般命令模式时输入【:set all】 来查看,不过,设置选项实在太多了,下面仅列出一些平时比较常用的一些简单的设置值,提供参考。

: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 进入编辑模式后,可以利用退格键来删除任意字符。但是,某些linux发行版则不许如此。此时,我们就可以通过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这个文件(默认不存在,请你自行手动建立)将你所希望的设置值写入。举例来说,可以是这样的一个文件:

 1 [root@self-discipline ~]# vim ~/.vimrc
 2 "这个文件的双引号(")是注释
 3 set hlsearch       "高亮度反白
 4 set backspace=2    "可随时用退格键删除
 5 set autoindent     "自动缩进
 6 set ruler          "可显示最后一行的状态
 7 set showmode       "左下角那一行的状态
 8 set nu             "可以在每一行的最前面显示行号
 9 set bg=dark        "显示不同的底色色调
10 syntax on          "进行依法检验,颜色显示

 在这个文件中,使用【set hlsearcj】 或【:set hlserarch】,即最前面有没有冒号【:】效果都是一样的。至于双引号则是注释号,不要用错注释符号,否则每次使用vim时都会发生警告信息。建立好这个文件后,当下次再次使用vim编辑文件时,该文件的默认环境设置就是上面写的。

9.4.2  DOS(Windows系统)与Linux的换行符

    DOS与linux换行符的不同,而我们也可以利用cat -A来观察DOS建立的文件的特殊格式,也可以发现在DOS使用的换行符号为 ^M$,我们成为CR与LF两个字符,而在linux下面,则是仅有LF($)这个换行符,这个换行符对于linux的影响很大,为什么呢?

我们说过,在Linux下面的命令在开始执行时,它的判断依据是回车,而linux的回车为LF符号,不过,由于DOS的换行符是CRLF,也就是多了一个 ^M的符号出来,在这样的情况下,如果是一个shell脚本的程序文件,呵呵,将可能造成程序无法执行的状态,因为它会误判程序所执行的命令内容,这很伤脑筋吧!

     那怎么办?很简单,将格式转换成linux即可。这当然大家都知道,但是,要以vi进入该文件,然后一个一个删除每一行的CR吗?当然没有那么麻烦,我们可以通过简单的命令来进行格式的转换。

                  命令 dos2unix与unix2dos

     命令格式:dos2unix   [-kn]   file  [newfile]

          unix2dos   [-kn]   file  [newfile]

     选项与参数:

          -k:保留该文件原本的mtime时间格式(不更新文件上次内容经过自定义的时间)

          -n:保留原本的旧文件,将转换后的内容输出到新文件,如:dos2unix  -n  old  new

范例一:将/etc/man_db.conf重新复制到/tmp/vitest/下面,并将其修改成为dos换行。

 1 [root@self-discipline ~]# cp /etc/man_db.conf /tmp/vitest/
 2 #将/etc/man_db.conf复制到/tmp/vitest/下
 3 [root@self-discipline vitest]# unix2dos -k man_db.conf
 4 unix2dos: converting file man_db.conf to DOS format ...
 5 #屏幕上会显示上述的信息,说明换行转为DOS格式
 6 [root@self-discipline vitest]# ll
 7 总用量 8
 8 -rw-r--r--. 1 root root 5171 12月  9 20:09 man_db.conf
 9 转换之前容量为5171
10 [root@self-discipline vitest]# ll
11 总用量 8
12 -rw-r--r--. 1 root root 5302 12月  9 20:09 man_db.conf
13 [root@self-discipline vitest]#
14 转换之后容量为5302,因为换行符多了^M,所以容量增加了

范例二:将上述的man_db.conf转成linux换行符,并保留旧文件,新文件放于man_db.conf.linux

 1 [root@self-discipline vitest]# dos2unix -k -n man_db.conf man_db.conf.linux
 2 dos2unix: converting file man_db.conf to file man_db.conf.linux in Unix format .                                              ..
 3 [root@self-discipline vitest]# ll
 4 总用量 16
 5 -rw-r--r--. 1 root root 5302 12月  9 20:09 man_db.conf
 6 -rw-r--r--. 1 root root 5171 12月  9 20:09 man_db.conf.linux
 7 [root@self-discipline vitest]# file man_db.conf*
 8 man_db.conf:       ASCII text, with CRLF line terminators
 9 #上边一条很清楚说明是CRLE换行
10 man_db.conf.linux: ASCII text

因为换行符以及DOS与linux操作系统下面一些字符的定义不同,因此,不建议你在Windows系统当中将文件编辑好之后,才上传到linux系统,会容易发生错误问题。而且,如果你在不同的系统之间复制一些纯文本文件时,千万记得要使用unix2dos或dos2unix来转换一下换行格式。

9.4.3 语系编码转换

  如果想要将语系编码进行转换。举例来说,想要将Big5编码转成UTF-8,这个时候怎么办?难不成要每个文件打开会转存成UTF-8吗?不需要这样做,使用iconv这个命令即可。

  命令iconv

  命令格式:iconv  -f  原本编码  -t  新编码  filename  [-o  newfile]

  选项与参数:

    --list:列出iconv支持的语系数据

    -f:from,亦即来源之意,后接原本的编码格式

    -t:to,亦即后来的新编码要是什么格式

    -o file:如果要保留原本的文件,把么使用-o新文件名,可以建立新编码文件

范例一:将/tmp/vitest/vi.big5转成UTF-8编码

1 [root@self-discipline vitest]# iconv -f big5 -t utf8 vi.big5 -o vi.utf8
2 [root@self-discipline vitest]# file vi*
3 vi.big5: ISO-8859 text, with CRLF line terminators
4 vi.utf8: UTF-8 Unicode text, with CRLF line terminators
5 #是吧,有明显的不同吧!

这个命令支持的语系非常之多,除了繁体中文的big5,UTF-8编码之外,也支持简体中文的GB2312,不过如果要将繁体中文的UTF-8转成简体中文的UTF-8编码时,那就得费些功夫了。首先要将big5语系编码转换成gb2312语系编码再由gc2312语系编码转换成UTF-8语系编码。举例来说:

 1 [root@self-discipline vitest]# iconv -f big5 -t gb2312 vi.big5 |

iconv -f gb2312 -t utf8 -o vi.gb.utf8 

9.5 重点回顾

linux 下面的配置文件多为文本文件,故使用vim即可进行设置编辑

vim 可视为程序编辑器,可以以编辑shell脚本,配置文件等,避免打错字

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元素数据。可通过 [Ctrl] + x、[Ctrl] + o 这两个连续组合键来取得关键词

vim的环境设置可以写入在~/.vimrc文件中

可以使用 iconv 进行文件语系编码的转换

使用dos2unix及unix2dos可以变更文件每一行的行尾行符

简答题案例:

我在vi这个程序中,不想退出vi,但想执行ls /home这个命令,vi有什么额外的功能可以达到这个目的?

:!ls/home

在vi下面做了很多的编辑操作之后,却想还原成原来的文件内容,应该怎么进行?

:e !

在vi的环境中,如何将目前正在编辑的文件另存新文件名为newfilename?

:w newfilename

vi的一般命令模式情况下,按下“r”有什么功能?

取代光标所在的那个字符

原文地址:https://www.cnblogs.com/self-discipline-xxc/p/10057976.html