一、概述

        vim(vi improved)编辑器是vi的增强版,主要用来查看文件中的行,以及查找、移动、编辑、替换文本。


        vim有三种操作模式:

              命令模式:刚打开文件时,vim编辑器会进入命令模式,此模式下键盘操作会被理解为编辑命令。

              插入模式:这种模式下,vim会将键盘输入的字符都插入到缓冲区。

              末行模式:此模式下可执行查询操作,而读取和输出文本、大量替换字符、显示行号、保存、离开vim也是在此模式中进行。


         三种模式之间的切换

                命令模式→插入模式:

                       i键:在光标所在处的前方转为插入模式

                       I键:在光标所在行的行首转为插入模式

                       a键:在光标所在处的后方转为插入模式

                       A键:在光标所在行的行尾转为插入模式

                       o键:在光标所在行的下方新建一个空行并转换为插入模式

                       O键:在光标所在行的上方新建一个空行并转换为插入模式

                 命令模式→末行模式:

                         :键:与内容定界、读取或输出文本及保存、退出vim相关

                        /和?键:与查找相关

                 插入模式和末行模式返回命令模式均按ESC键;插入模式和末行模式之间不能直接切换,需经过命令模式。


             

wKiom1YCA2HBro_7AADtBjcCeSc732.jpg



二、vim打开和关闭文件

       1、打开

             vim [option]… [file]…

             vim命令后若不加任何文件名,则直接显示其版本等信息

       2、关闭

             命令模式下:ZZ 

             末行模式下:   :q(未编辑过文件的情况下,直接退出) ,:q!(不保存退出),:wq(保存并退出),:x(保存并退出),:wq!(强制保存并退出)

                    

三、vim常用操作

       1、光标移动  

             在命令模式中,可使用方向键[或h(左)、j(下)、k(上)、l(右)]移动光标。有时一行一行移动会比较麻烦,因此vim还提供了一些命令提高移动速度:

                   单词间移动:

                            w:下一个单词词首   e:当前单词或下一个单词词尾   b:当前单词或上一个单词词首      #{w|e|b}

                    行内移动:

                            ^:行首(第一个非空白字符)  0:绝对行首    $:绝对行尾

                    句子间移动:

                            ):下一个句子句首      (:上一个句子句首

                    段落间移动:

                             },{

                    行间移动:

                           #G:直接跳转至第#行

                           G:跳转至最后一行

                           gg:跳至第一行

                           #{h|j|k|l}:向指定方向跳转#个字符

                           PageUp(或ctrl+f):上翻一屏数据

                           PageDown(或ctrl+b):下翻一屏数据

                           ctrl+d:上翻半屏数据

                           ctrl+u:下翻并屏数据


       2、命令模式中常用的编辑命令                       

                         x/X:x为删除光标所在处的字符,X为删除光标前的一个字符    

                    #{x/X}:x和X命令可结合数字键使用

                    d+光标移动命令:删除跳转范围内的字符或行

                    dd:删除光标所在行

                    #dd:结合数字键使用,表示删除光标所在行后的#行(包含光标所在行)

                    dw:删除当前字符到单词尾(包含空格)的所有字符

                    de:删除当前字符到单词尾(不包括单词尾部的空格)的所有字符

                    d$:删除当前字符到行尾的所有字符,相当于D

                    d^:删除当前字符到行首的所有字符

                    J:删除当前光标所在行的行尾的换行符(拼接行)

                    c+光标移动命令:修改,先删除光标跳转范围内的文本,再转换为插入模式

                    cc或C:删除光标所在处的整行并进入输入模式

                    r char:用char替换当前光标所在字符

                    R text:用text覆盖当前光标所在数据,直到按下ESC键为止

                    u:撤销前一条命令

                    #u:撤销之前的#次操作

                    ctrl+r:撤销前一次的撤销操作

                    .:重复前一条命令


        3、复制与粘贴

             p:paste 粘贴

                   vim会将最后一次删除或复制的数据保存在一个单独的寄存器中,可用p或P命令取回

                         字符级别粘贴:使用p(P)命令会将字符插入到光标所在字符之后(前)

                         行级别粘贴:使用p(P)命令会将行插入到光标所在行之后(前)   

             y:yank 复制

                   可以与y使用与d相同的第二字符(如yw表示复制单词,y$复制到行尾),复制文本后,再使用p(P)命令粘贴

                       

       4、末行模式中的相关操作

                    命令模式中按【:】键进入末行模式,输入:

                            #:跳转到第#行     $:跳转到末行

                    内容定界:格式为startpos,endpos   例如10,$-1

                            #:第#行     .:当前行     $:末行    %:全文,相当于1,$

                            内容定界后:

                                   1)w /path/to/somefile:将选定范围内的内容保存至某文件中

                                   2)r /path/to/somefile:将指定文件中的内容读取到当前文件中的指定位置

                                   3)可结合c,d,y等命令使用,实现区域文本编辑  

                             例如

                                   :5,10y

                                   :10,$-1w /tmp/document                       

                     查找

                            格式:/pattern(从光标所在处向后查找)   ?pattern(从光标所在处向前查找)

                            要继续查找同一文本,按n键(下一个)或N键(上一个)

                            查找模式可使用正则表达式

                      替换

                             替换命令的格式是:

                                    :[%]s/查找模式/要替换成的新内容/gi

                                    g:global,表示全文替换

                                    i:ignore,忽略字符大小写

                           要替换的内容不能使用模式,仅能使用引用                         

                           例1:替换/tem/functions文件中的/etc/sysconfig/init为/var/log

                                    %s/ \ /etc\ /sysconfig\ /init/ \ /var\ /log/gi    (注:因避免要替换的内容中的/与分隔符相混淆,需要用\进行转义;另外,分隔符可自定义,不会混淆则不用转义,因此也可写成%s@/etc/sysconfig/init@/var/log/gi)

                           例2:复制/etc/rc.d/rc.sysinit至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#号

                                    %s@^\([[:space:]]\{1,\}.*\)@#\1@g或者%s@^[[:space:]]\{1,\}.*@#&@g   (引用模式匹配到的所有内容,可使用&符号


四、vim的可视化模式

       有时执行复制操作时,没法看清到底复制了什么,而可视模式会在移动光标时高亮显示文本。在复制的起始位置按下v(V)键进入可视模式,然后移动光标覆盖需要复制的文本,光标移动过程中,vim会高亮显示复制区域的文本,覆盖完需要复制的内容之后,按y键激活复制命令。(注:v键为字符选择;V键为行选择


五、vim窗口属性定义       

             :set nu(显示行号)   :set nonu(取消显示行号)  

             :set ai(自动缩进)     :set noai       

             :set ic(忽略字符大小写)    :set noic      

             :set sm (显示匹配的扩号的另外半边)  

             :syntax off(关闭语法高亮)   :syntax on    

             :set nohlsearch(关闭搜索高亮)

        默认只对当前进程有效,若需持久有效,应修改vim的配置文件


六、vim的多文件模式

       vim可同时编辑多个文件,直接将文件名列于vim命令后即可,如vim /etc/inittab /etc/passwd

       多文件模式中文件之前的切换:

              :next(或:n)    :previous(或:N)   :last    :first    :files(列出此vim目前开启的所有文件)   :wqall(全部保存并退出)


七、vim的多窗口模式

       1、多窗口单文件模式

             打开文件后,按ctrl+w,再按s(v)为水平(垂直)分割 的多个窗口,并且可以对子窗口以同样的方式再次执行分割            

       2、多窗口多文件模式

             vim  -o :水平分割      vim  -O:垂直分割

       3、补充:在一个窗口中,可使用:sp [filename]水平开启一个新窗口,如果有加filename,表示在新窗口开启一个新文件,否则表示两个窗口为同一文件内容。

       4、窗口之间的切换

             先按ctrl+w,再按方向键

wKioL1YCBsHDhOP4AAMxpsvBuS8596.jpg



八、vim的配置文件

       全局级:/etc/vimrc

       用户级:~/.vimrc(若不存在,可手动创建) 


九、补充说明

       1、多个编辑器不能同时编辑一个文件

       2、vim +# file:打开文件后光标直接处于第#行 


十、vim使用示例

       1、复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符;

             %s/^[[:space:]]\+//gi

       2、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留;

             %s/^[[:space:]]/#&/gi

       3、替换/tmp/functions文件中的/etc/sysconfig/init为/var/log;

             %s@/etc/sysconfig/init@/var/log@gi

       4、删除/tmp/functions文件中所有以#开头,且#后面至少跟了一个空白字符的行的行首#;

             %s/^#[[:space:]]/[[:space:]]/gi或%s/^#\([[:space:]]\)/\1/gi