我们在上一节当中讲述了正则表达式(BRE, ERE),它们两个的正则表达式元字符书写方式有些不同,以及我们也讲述了grep和egrep和fgrep之间的关系也知道了如何使用,它是根据用户所指定的"PATTERN"来对文本进行逐行匹配进行过滤,将匹配到的行进行输出,之后我们也介绍了其文本查看处理工具,例如:wc、cut、sort、uniq、diff、patch。那么在这一章当中我们来讲述一下vim编辑器。

一、文本编辑器

  vi编辑器是一款纯文本编辑器,所谓的纯文本也就是没有任何的修饰的文本信息,和我们的网页以及办公软件不同的是,后者是有文本标记语言的,例如.html和.xml可以进行修饰,能够更改字体大小、添加下划线以及更改字体的颜色等,这样能够在确保在下次打开之前还能够保留这样的格式。
  而纯文本的编辑器没有标记语言这一说,就是单纯的保留字符信息,即使字体大小更改也是用一种特殊的方式,其选中某个字段更改字体大小也更改的全部字段(例如:Windows记事本)。

1.1 文本编辑器种类

  在Linux当中,文本编辑器的种类一共有两种,一种是行编辑器,另一种是全屏编辑器,在行编辑器中的代表为sed;而在全屏编辑器中,一个是nano,另一个就是vi了,而vi的意思为(Vistual Interface)称之为可视化接口,还有一个是vi的增强版,我们称之为vim(VI IMproved)。

二、vim编辑器

  如果不加说明的话,在这里vi/vim是通用的,vim是一款模式化的编辑器,每种模式的功能是不尽相同的,一般来说,它的基本常用模式有以下几种:

   编辑模式, 命令模式(复制、删除等); 
   输入模式:在原有的文本基础上编辑该文本以及修改输入;
      末行模式:
         内置的命令行接口;

2.1 打开文件

  vim编辑器和之前nano的打开方式相同,如果在本地或指定的路径没有文件时,会自动创建此文件,并将编辑好之后信息保留在此文件中,其基本用法如下:

   # vim [OPTIONS] [FILE...]

  当打开某个文件后,光标默认在最左上角的第一行中的第一列当中,我们可以通过某个选项来可以对光标进行指定,用来定位让光标处于哪一行的行首,选项如下:

   +#:打开文件后,直接让光标处于第#行的行首;
   +/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首位置;

  那么打开文件之后,就默认处于编辑模式,我们如果想要修改该文件时,就要从编辑模式转换到输入模式,有以下几种方式可提供选择:

   编辑模式:默认模式
    编辑模式 --> 输入模式:
        i:insert, 在光标所在处输入;
        a:append, 在光标所在处的后方输入;
        o:在光标所在处的下方插入一个新行;
        I:在光标所在行的行首输入;
        A:在光标所在行的行尾输入;
        O:在光标所在处的上方打开一个新行;

  那么从输入模式回到编辑模式时,使用ESC键就可以回到编辑模式。

   输入模式 --> 编辑模式
     ESC

  当我们从编辑模式转换为末行模式时,要使用":"来进行转换。

   编辑模式 --> 末行模式
     :   (这是个内置命令行接口)

  从末行模式中要是回到编辑模式的话,也要使用ESC键来进行转换;如果末行模式有命令的话,需连按两次ESC键。

   末行模式 --> 编辑模式
     ESC

2.2 关闭文件

  当我们了解完以上几种模式的时候,那么现在了解一下如何关闭文件,在编辑模式下使用快捷键ZZ就能够保存并退出,也可以在末行模式下退出,那么在末行模式下退出的方法有很多种。

   :q  退出;
   :q! 强制退出;
   :wq 保存并退出;
    :w  :q
   :x  保存并退出;
   :w /PATH/TO/SOMEFILE    可理解另存为

2.3 光标跳转

  光标跳转实际上可以理解为man手册的翻页,或者为单词之间的跳转等,根据跳转范围,我们大致能分为以下几种:

   光标跳转:
    
    字符间跳转:
        h:左
        j:下
        k:上
        l:右
        
        # COMMAND:跳转由#指定个数的字符;
        
    单词间跳转:
        w:下一个单词的词首;
        e:当前或后一个单词的词尾;
        b:当前或前一个单词的词首;
        
        # COMAND:跳转由#指定个数的单词;
        
    行首行尾跳转:
        ^:跳转至行首的第一个非空白字符;
        0:跳转至行首;
        $:跳转至行尾;
        
    行间跳转:
        #G:跳转至由#指定的行;
        1G, gg:跳转至第一行;
        G:最后一行;
        
    句间跳转:
        )
        (
        
    段间跳转:
        }
        {

2.4 翻屏

  我们在man命令中,如果要翻到下一屏,要使用f键,向上翻一屏要使用b键,但在vim中翻屏操作要比man命令有所区别:

   翻屏:
    Ctrl+f:向文件尾部翻一屏;
    Ctrl+b:向文件首部翻一屏;
    Ctrl+d:向文件尾部翻半屏;
    Ctrl+u:向文件首部翻半屏;
    Enter:按行向后翻;

三、vim的编辑命令

  用vim的编辑命令,我们可以对该文件进行大规模的操作,通常编辑命令包含以下编辑操作:

   字符编辑:
    x:删除光标所在处的字符;
    #x:删除光标所在处起始的#个字符;
    
    xp:交换光标所在处的字符与其后面的字符位置
    
   替换命令(replace):
    r:替换光标所在处的字符;
        rCHAR
        
   删除命令:
    d:删除命令,可结合光标跳转字符,实现范围删除;
        d$:删除从当前字符到行尾的内容;
        d^:删除从当前字符到行首的内容;
        dw:删除从当前字符到下一个单词的词首;
        de:删除从当前字符到下一个单词的次卫;
        db:当前或前一个单词的词首;
            # COMMAND
        dd:删除光标当前所在的行;
            #dd:删除光标所在处的行起始共#行;
            
   粘贴命令(p, put, patse):
    p:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的下方;否则,则粘贴至当前光标所在处的后方;
    P:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的上方;否则,则粘贴至当前光标所在处的前方;
    
   复制(yank,y):
    y:复制,工作行为相似于d命令;
    y^:
    y0:
    
    ye:
    yw:
    ya:
        #COMMAND
    
    yy:复制一整行
        #yy:复制#行;

3.1 改变命令

  改变命令功能是能从编辑模式转换为输入模式,因为改变什么是需要用户的介入,其次它也能实现删除的操作。

   改变命令(change, c)
    编辑模式 --> 输入模式,实现删除操作;
        c$
        c^
        c0
        
        cb
        ce
        cw
            #COMMAND
            
        cc:删除光标所在的行,并转换为输出模式;
            #cc:

四、其它编辑操作

  以上就是对行进行操作,在windows中,点击鼠标左键我们就能划过某个字段来进行编辑操作,在vim编辑器中也可以实现,我们可以称之为可视化模式。

   可视化模式:
    v:按字符选定;
    V:按行选定;
    
    结合编辑命令使用:d, c, y

  接下来是撤销操作,如果说在文件中我们编辑错误或者删除错误时,可以进行撤销操作来进行还原,需要注意的是,如果进行了保存并退出的话,则撤销不回原点。

   撤销(undo)操作:
    u:撤销此前的操作;
        #u:撤销此前的#个操作

  如果撤销错误的话,我们可以撤销此前撤销的操作,也可以称作为向前还原。

   撤销此前的撤销操作:
    Ctrl+r

  如果某一个操作能够执行多次,也可以重复执行前一个编辑操作:

   重复执行前一个编辑操作:
    .

  如果还想学习更多关于vim的其它操作,在Linux中自带有vim教程,该教程的命令为:vimtutor