linux7-vim

一、vim/vi快捷键、

    大小写切换:
        shift+字母      强烈推荐
        caps lock+字母  

    vi命令:  功能强大文本编辑器(Unix/Linux)  vim等都是对vi的加强版
    1)关注三种模式:如何切换
                  回车                            i(光标当前位)   a(光杆右边1位)   o(光标下一行)    O(光标上一行)
        底行模式(冒号模式)  ---->   命令模式   --I-->    输入模式
        底行模式(冒号模式)  <--:--   命令模式   <--Esc--  输入模式
          
                    :  /  ?                  Esc 

    2)常用的操作命令:
        操作模式
            命令模式:               ctr+c 或者esc 
            冒号模式(底行模式):       ctr+c+: 或者esc+:
            编辑模式:
                (通常使用i,以下命令执行后,会自动进入编辑模式)               
                                    i,在当前位置前插入;
                                    I,在当前行首插入;
                                    a,在当前位置后插入;
                                    A,在当前行尾插入;
                                    o,在当前行之后插入一行;
                                    O,在当前行之前插入一行;

                                    s   删除当前字符,光标定位当前位置
                                    S  删除当前行,光标定位当前行首

                                    c 无效果
                                    C 删除光标至行尾

                                    r,用新输入的一个字符替换当前一个字符;
                                    R,从当前字符开始往后一个一个字符替换为新输入的字符;

            在输入命令时的操作
                ctr+a       光标移动到 行首
                ctr+e       光标移动到 行尾

                ctr+a+k   删除全部输入



        光标移动
                  O
               i  光标 a
                  o          变为输入模式,光标停留位置不同

              向上  k
              向下  j
              向左  h
              向右  l    用小键盘方向键也可
                以上四个命令可以配合数字使用,比如 20j 就是向下移动20行,5h 就是向左移动 5 个字符;
                在VI中,很多命令都可以配合数字使用,比如删除10个字符10x,在当前位置后插入3个!,3a!,这里的esc是必须的,否则命令不生效;



              0,跳转到行首(跳转到一行开始的第一个字符,[包括前面的空格]);
              ^,跳转到一行的第1个字符,[不包括前面的空格];
              $,跳转到行尾
                1$,跳转到当前行的行尾
                3$,跳转到下面2行的行尾
       

              屏首       H(首列)            跳转到当前可见区域的顶部第一个非空字符;
                屏中央     M  (首列)         跳转到当前可见区域的中间第一个非空字符;
              屏尾       G(首列)/L      跳转到当前可见区域的最后第一个非空字符;
              
              "H" 表示 "Home" (头),
              "M" 表示 "Middle" (中) 而 
              "L" 表示 "Last" (尾)。

        滚屏
            ctrl + f    向前看,正向滚动1屏(forward)(减去两行,方便阅读)
                ctrl + d    向下看,反向滚动0.5屏(down)
            ctrl + b    向后看,反向滚动1屏(backward)
               ctrl + u    向上看,正向滚动0.5屏(up)
            ctrl+e    向上滚动1行
            ctrl+y    向下滚动1行

            zt  置顶当前行,当前行显示在屏幕最上方
            zz  置中当前行,当前行显示在屏幕中间
            zb  置底当前行,当前行显示在屏幕最下方

            50% 移动到文件的中间, 
            90% 移到差不多结尾的位置。

            set scrolloff=999   上下滚动时,光标上下两侧最少保留的屏幕行数,这使你工作时总有一些可见的上下文。            
            set sidescrolloff=999   上左右滚动时,光标上下两侧最少保留的屏幕行数,这使你工作时总有一些可见的上下文。               
                如果你设置此选项为很大的值 (比如 999),光标所在的行将总定位在窗口的中 间位置 
                (除非你非常靠近文件开始或者结束的地方,或者有长行回绕)。

            在含有--More--的页面中滚动方式
                f   向上滚动1屏forward
                u   向上滚动半屏up
                k   向上滚动1行

                b   向下滚动1屏back
                d  向下滚动半屏down
                j   向下滚动1行
                

        定位
            gg  首行(首列,非空字符)   
                5gg 快速跳转到第5行的开头(首列,非空字符)
            G   尾行  (首列,非空字符) 
                5G  快速跳转到第5行的开头(首列,非空字符)
                :5  快速跳转到第5行的开头(首列,非空字符)
            ctr+g  显示当前编辑的文件名+光标位置

            :set nu 或者:set number   显示行号   
            :set nonu 或者:set nonumber 取消显示行号   
            :set ru 或者:set ruler   显示光标位置,行列   
            :set noru 或者:set noruler 取消光标位置,行列   
             
             使用2gg或者2G时,vim会记住你从什么地方跳过去的。这个位置成为一 个标记,
                ctrl+o 回到上1个标记处,
                :jumps   输出一个你可以跳往的位置的列表。最后一个你使用的标记会用 ">" 符号标记出来。

                有名字的标记:
                    m[a-z]  在光标处键入,给标记命名a到z任意字母
                    '[a-z]  ‘单引号这个键+名字                  移到标记所在行的行首                      
                    `[a-z]  `反引号这个键(esc下面的键)+名字  移到标记所在行的行,并同时移到标记所在列上                                    
                    :marks   
                        mamrk标记列表中,你会注意 到有一些特殊的标记,包括:
                            ’ 跳转前的光标位置
                            " 最后编辑的光标位置 
                            [ 最后修改的开始位置 
                            ] 最后修改的结束位置
                    ’‘或者``都可以回到最新的1个标记处
                    如 在某光标处打个开始标记(感觉类似于便签书签一样) ms  在另1外打个结束标记 me
                    想回到ms或者me处的方法,   
                        `s或者`e
                        ’s或才'e只回到行首
                        ''或者``只会在上次标记和当前位置来回切换

              w 移动到下1个单词的词头(光标在词首), 向后移动一个单词(光标停在单词首部),如果已在行尾,则转至下一行行首;
                W  同w,但会忽略非单词部分(可以更快速的移动)
              b  前1个单词,     向前移动一个单词(光标停在单词首部),
                5b 向前移动5个单词;
                B  同b,但会忽略非单词部分(可以更快速的移动)

              e 移动到下1个单词的词尾(光标在词尾),  只是光标停在单词尾部
                E  同e,但会忽略非单词部分(可以更快速的移动)
              ge 上1个单词(光标在词尾),  光标停在单词尾部
                gE  同ge,但会忽略非单词部分(可以更快速的移动)

        head和 tail
            head -n  文件名   前n行
            tail  -n  文件名   后n行

            tail  -f  f5    能够监控日志文件   动态实时刷新


          ggVG或者ggvG    全选高亮显示
          V     进入Visual(可视)模式
    缩进
        >>,当前行增加缩进一个TAB;
            n>>,当前行开始的n行增加缩进一个TAB
        <<,当前行减少一个TAB;
            n<<,当前行开始的n行减少一个TAB
          

          
    选中  
        v   可视模式,   光标所选中处取被选中内容
            This is an examination sample of visual mode
                            velllld
            This is an example of visual mode
        V       可视,列表选择,按行选择
                你会发现在你作任何移动 之前,整行都被高亮显示了。左右移动不会有任何效果。
                而通过上下移动,你可以一次选 择多行。
            Vjj 可以选中三行:
        ctr+v  可视,列表选择  光标所选中处取被选中内容
                在处理表格时非 常有用。
            name            Q1      Q2      Q3
            pierre          123     455     234
            john            0       90      39
            steve           392     63      334
            要删除中间 "Q2" 这一栏,
                把光标移动到 "Q2" 的 "Q" 上面。按 CTRL-V 启动列块可视 模式。
                现在用 "3j" 向下移动三行,
                然后用 "w" 移到下一个单词。你可以看到最后一栏 的第一个字符也被包括进来了。
                要去掉它,用 "h" 命令即可。
                现在按 "d",中间一栏就 被删除了。
        o   移动到另一端(other end)
            注意:
                "o" 和 "O" 在可视模式下与在普通模式下的作用有很大的不同;
                在普通模式下, 它们的作用是在光标后或前加入新的一行。
            普通可视模式下[2个选择点,在对角]:
                如果你在可视模式下选中了一些文字,然后你又发现你需要改变被选择的文字的另一端, 
                o,光标会移动到被选中文字的另一端,
                再按 "o" 光标还会回到另一端。
            列块可视模式下[4个选择点,在4个角]::
                当使用列块可视模式的时候,你会有四个角,
                小o,切对角
                大O,切到同行
        选中1个单词
            aw  文本对象,1个单词(包含单词+后面的空格)[a word]
        选中1个句子(在所有可视模式下)
            as 文本对象,1个句子(包含句子+后面的空格)[a Sentence]
            is 文本对象,内含句子(只包含句子)[Inner Sentence]
    拷贝
        y(yanking,抽出),yanking 是 Vim 中拷贝命令的名字
          y     复制选中内容到0号寄存器
          +y    复制选中内容到+寄存器(也就是系统的剪贴板),供其它程序使用
         
          gg-----yG     全部复制
          gg"+yG    复制到别的地方
          yw    拷贝词
            y2w  拷贝两个单词
            注意 :
                yw  包括单词后面的空白字符。
                ye  不 包括单词后面的空白字符。

          yy    拷贝一整行 (同Y)   
            5yy    拷贝5行 
          yyp   拷贝光标所在行,然后在光标所在行的(下一行)粘贴
            注意:
                "yy" 命令拷贝一整行,就像 "dd" 删除一整行一样。
                出乎意料地是,"D" 删除到行尾而 
                "Y" 却是拷贝一整行。要 注意 这个区别!
                "y$" 拷贝到行尾。           
          :1,2co3  拷贝行1,行2到行3之后

          yy,拷贝当前行;nyy,拷贝当前后开始的n行;等同于Y;
            y^,复制到行首,不包括当前位置;
            y$,复制到行尾,包括当前位置;
            yG,本行复制到文档尾;
            ygg,本行复制到文档头;
    剪切
        :4,5m6   移动行4,行5到行6之后   剪切
    剪切板
        "*yy   拷贝一行到剪贴板中:
        "*p    粘贴回来
    粘贴
        p(put)              粘贴(在光标后粘贴,右侧)(p 在 Vim 中表示 put,放置)
            可将已删除的文本内容置于光标之后,
            如果最后一次删除的是1个整行,那将置于光标所在行的下1行
        P(shift+p)     粘贴(在光标前,左侧粘贴,或光标上一行粘贴)
        xp  交换两个字符
            teh 
            光标移到e上,执行xp命令--》the
                这个工作过程是: "x" 删除一个字 符,保存到寄存器。
                "p" 把这个被保存的字符插入到光标的后面,也就是在 "h" 的后面 了。


        拷贝、剪切、删除、都会存放到寄存器中,都可通过p来粘贴
            dd删除后,可以用p进行粘贴;
                ddp即实现了当前行与下一行的交换;
            dl删除后,也可以用p进行粘贴;(dl等同于x)
                dlp即实现了当前字符与其后的一个字符的交换;
            d相关的命令删除后都可以用p进行粘贴;
    
    插入
        i,在光标之前插入,光标左边插入;
        I,在当前行首插入;

        a,在光标之后插入,光标右边插入;;
        A,在当前行尾插入;
        3a!<Esc>   光标右边插入3个!,最后一定要按esc才有效

        o,       在当前行下方插入一行;
        shift+o   在当前行上方插入一行;
            O,    在当前行上方插入一行;

        :r  file2   在光标所在位置插入另一个文件 (合并)
    删除
        x  删除当前字符比较好用
        dd,删除当前行;(会删除行首的空字符,当前行不保留)
            5dd,删除当前行开始向下的5行;

        J  删除当前行的换行符,将下一行连接到当前行行尾,中间用1个空隔隔开

        dj,删除当前行和下一行;
        dk,删除当前行和上一行;
        d^,删除至行首(不包括当前字符),从当前的位置一直删除到本行行首;等同于d0;
            d0(不包括当前字符),也是
            c0,删除至行首,回到一行的第一个字符,包括最前面的空白字符;
            c^,删除至行首,不会删除行首的空白字符;
        d$,删除至行尾(包括当前字符),从当前的位置一直删除到本行行尾;等同于D,还有C;
            c$ 删除至行尾;等同于D,还有C;

        dw,从当前光标处,直到下1个单词起始处,不包括下1个单词的第1个字符
            d2w  删除从光标处,删除到后面第2个单词词头前
        文本对象
            aw是 文本对象,1个单词
            as是 文本对象,1个句子(包含句子+后面的空格)
            is是 文本对象,内含句子(只包含句子)

            daw  "daw" 就是 "Delete A Word" (删除一个单词),[aw是 文本对象]
                    如果你在一个单词的中间而又想删掉这个单词,可用daw快速删除,该单词后的 空格字符也被删除掉了。
            cis  (change Inner Sentence 修改内含句子)
            das (delete a Sentence 修改内含句子)


        de  从当前光标处,直到下1个单词末尾处,包括下1个单词的最后第1个字符
            d2e  删除从光标处,删除到后面第2个单词词尾处

        df<字符>  从光标处开始删除到<字符处>
            .    重复任何除 "u" (撤销),CTRL-R (重做) 和冒号命令外的修改。
                    这里会重复执行上1次的 df<字符> 命令

        3dw   删除 3 个单词
                删 除1个单词 3 次
        d3w   删除 3 个单词
                删除3个单词1次
        3d2w  删除 6 个单词
                删除2个单词3次

        db,删除光标所在处一个单词的前部分/上1个单词;
        dG,删除光标所在行 至文档结束;
            gg然后dG,  删除全部
        dgg,删除光标所在行 至文档开头;

        :n1,n2d,删除n1 至 n2行;
        :n1,$d,删除n1 至文档结束;
        :1,$d,删除所有行;

        shift + j,合并当前行与下一行;等同于J;
        dl,向后删除光标所在的一个字符;等同于x;
            5dl,删除当前向后的5个字符;
            5x,删除当前向后的5个字符;
        dh,向前删除光标所在的一个字符;等同于X;

        常用到的删除文本命令
            x 删除光标下的字符 ("dl" 的缩写)
            X 删除光标前的字符 ("dh" 的缩写)
            D 从当前位置删除到行尾 ("d$" 的缩写) 
            dw 从当前位置删除到下一个单词开头(=daw会删除空白字符)
            db 从当前位置删除到前一个单词的开头
            diw 删除光标上的单词 (不包括空白字符,iw=inner word) 
            daw 删除光标上的单词 (包括空白字符,aw=a word)
            dG 删除到文件末
            dgg 删除到文件首
            以上用 "c" 代替 "d",这会变成修改命令;
                而改用 "y",则变成拷贝命令,等等等 等。

    替换、修改
        c(change)
             cw   从光标处开始,替换一个单词,
                ce   同cw
             c^   从光标处开始,替换直行首
                c0 
             c$   从光标处开始,替换直行尾
                C     替换从光标到行尾
             c  修改,change。它的作用方式与 "d" 操作符相似,只是 完成后会切换到插入模式。
                ce 删除,修改一个词,更精确的说,它删除一个词,并切换到插入模式。
                cw 同ce
                    c2wbe<Esc>
                        c 修改操作符
                        2w 移动两个单词的距离 (与操作符合起来,它删除两个单词并进入插入模式)
                        be 插入 be 这个单词
                        <Esc> 切换回普通模式
                c$  修改至行尾,
                    这相当于先用 "d$" 删除一行再用 "a" 启动插 入模式,以便加入新的文字。
                cl  修改光标处1个字符
            cc,修改当前一整行,并进入编辑模式;等价于S(大写);
                但它会保留这一行的缩进 (前导空格)。
                5cc,删除,修改当前行开始向下的5行;
        r(replace)
            r,替换单个字符,  用新输入的一个字符替换当前一个字符;[一直在命令模式下]
                cl
                s

                5rx         将光标处[含光标处]向右总共5个字符,替换成x
                5r<Enter>    将光标处[含光标处]向右总共5个字符,替换成1个回车换行符

            R,连续替换多个字符,在当前光标处连续替换,[一直在替换的编辑模式下]
                This is text.
                        Rinteresting.<Esc> 
                This is interesting.
                你可能会 注意 到,这是用十二个字符替换一行中的五个字符。
                如果超出行的范围,"R" 命 令自动进行行扩展,而不是替换到下一行。

                在替换过程中,当你使用 <BS> (退格键) 进行修正时,你会发现原来被替换的字符又回来了。这就好像一个 "撤消" 命令一样。
        s()
            s    修改光标处1个字符
             :10,20 s/^/——/g,从第10行至第20行每行行首插入四个中横杠( - );
                :10,20 s/$/——/g,从第10行至第20行每行行尾插入四个中横杠( - );
                :s/old/new/,在当前行中用 old 替换 new,替换第一个匹配到的;没提示
                :s/old/new/c,在当前行中用 old 替换 new,替换第一个匹配到的;有提示
                :s/old/new/g,在当前行中用 old 替换 new,替换当前行的所有匹配;没提示
                :s/old/new/gc,在当前行中用 old 替换 new,替换当前行的所有匹配;有提示
                :%s/old/new/g,全文将 old 替换为 new,不提示;
                :%s/old/new/c,全文将 old 替换为 new,提示是否替换;
            
            :s/old/new          只改变光标所在行的  第1个匹配串
            :s/old/new/g        匹配光标所在行    所有的匹配串
            
            :n1,n2s/old/new/g    匹配从n1行到n2行中[包括n1和n2行本身]    所有的匹配串 

            :%s/old/new/g        匹配全文中    所有的匹配串 
            :%s/old/new/gc        匹配全文中    所有的匹配串 ,并逐一询问是否替换

        ~    大小写切换(命令模式下,光标所在处的字母自动切换大小写) 
              按住shift   大写字母,
              松开shift   小写字母
              修改光标下字符的大小写,并移动到下一个字符。这不是一个操作符 (除非设置了 ’tildeop’),所以你不能连接一个动作命令。
                这个命令在 可视模式下也有效,它会改变被选中的所有文本的大小写。
        I  移到当前行的第一个非空字符并启动插入模式。[i/I在光标左侧插入]
        A  移动到行尾并启动插入模式。       [a/A在光标右侧插入]

        x 表示 dl (删除当前光标下的字符) 
        X 表示 dh (删除光标左边的字符)
        D 从当前位置删除到行尾 ("d$" 的缩写)

        C 表示 c$ (修改到行尾)
        s 表示 cl (修改一个字符),修改当前字符,光标定位当前位置 
        S 表示 cc (修改一整行)  修改当前行,光标定位当前行首


    查找
        /text    查找text,从当前行往下查找(/从光标处,往下找)
        ?text    查找text,从当前行往上查找(/从光标处,往上找)
          n          继续向正(如果前面是/,正向就是,向下)查找下一个
          N         反方向(如果前面是/,反向就是,向上)继续查找下一个
            3n  移动到第三个匹配点
            注意 , "/" 不支持计数前缀。
         注意:如果查找已经到达文件末尾,查找会自动从文件头部继续查找,除非‘wrapscan’被复位
                字符 .*[]^%/\?~$ 有特殊含义。如果你要查找它们,需要在前面加上一个 "\"。
         查找很长的词,键入太麻烦,这时候可以将光标移动到该词上,(其它也可以包括中文符号等)
            * 相当于 / 搜索;向下查找[正向查找,匹配整个单词]
                3*   查找光标下单词第三次出现的地方。
                g*  [正向查找,部分匹配]
            # 键即可以该单词进行搜索, 相当于 ? 搜索,向上查找[反向查找,匹配整个单词]
                #*  [反向查找,部分匹配]

         

         /the$     在行尾匹配[完整单词]the, 查找以 "The" 结尾的一行
         /^the     在行首匹配[完整单词]the, 查找以 "The" 开头的一行
         /^the$    匹配仅包含 [完整单词]the的行

         /ter.   匹配ter+任意字符
         /ter\.  匹配ter+.


         /the\>     匹配以the结尾的单词
         /\<the     匹配以the开头的单词
         /\<the\>   匹配以完整的单词the



        :set xxx  可以设置xxx选项,常用的选项如下
            'ic' 'ignorecase'       查找时忽略字母大小写
                'noic' 'noignorecase'       查找时 不忽略字母大小写
                如果想要仅在一次查找时忽略字母大小写,可以使用 \c:/ignore\c <回国>   没弄明白怎么实现?

            'is' 'incsearch'        输入搜索命令时,显示目前输入的模式的匹配位置。匹配的字符串被高亮。
                                    如果 该模式不合法或者没有匹配,不显示任何东西。屏幕会经常刷新,
                                    所以只有 对快速终端,这才有意义。
                'nois' 'noincsearch'        查找短语时 不显示部分匹配
            'hls' 'hlsearch'        高亮显示所有的匹配短语
                'nohls' 'nohlsearch'        高亮   不显示所有的匹配短语

        :nohls                      关闭当前的高亮显示,如果再次搜索或按下 n 或 N 键,则会再次高亮;[临时关掉高亮显示]
            比较常用,vim会记录上一次查找,在当前vim中在次打开其它文件,还没查找就高亮显示上一次的记录,用这命令可以很方便
                :nohlsearch         关闭当前的高亮显示,如果再次搜索或按下 n 或 N 键,则会再次高亮;

        :set wrap        长行自动回绕,Vim 通常会对长行自动回绕,以便你可以看见所有的文字。但有时最好还是能让文字在一行中显示完。
                            这样,你需要左右移动才能看到一整行。
            :set nowrap   关闭长行自动回绕

        :set wrapscan       重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启;

        配对括号的查找
            %   可以查找配对的 )、]、}
                将光标放在任何1个以上括号上,在按下%,就会自动配对到对应的另1半配对的括号上
                不将光标放到括号上,也能自动正向(向右)匹配到第1个括号,

        行内查找字符(在当前行移动)
                  fx   光标右侧查找x字符(光标定位到x上)
                    Fx     光标左侧查找x字符(光标定位到x上)

                 tx   光标右侧查找x字符(光标定位到x左侧)
                    Tx     光标左侧查找x字符(光标定位到x左侧)
                  ;   正向重复 
                  ,   反向重复

                  个人常用f<字符> ;/,来提高本行中定位单个字符速度,不喜欢用大写,都要切换大小写

    重做
          u 撤销 undo
          U 行撤消,行撤销命令撤销所有在最近编辑的行上的操作。 输入该命令两次取消前一个 "U":
          ctr+R  重做,
                如果你撤销得太多,你可以输入 CTRL-R (redo) 回退前一个命令。换句话说,它撤销一个撤销。
    重复修改
        .    重复任何除 "u" (撤销),CTRL-R (重做) 和冒号命令外的修改。
            行内重复修改
                To <B>generate</B> a table of <B>contents
                    f<      找第一个 < 
                    df>     删除到 >
                    f<      找下一个 < 
                    .       重复df>
                    f<      找下一个 < 
                    .       重复df>
                            如此类推
            全文重复修改
                你想把 "four" 修改成 "five"。有好几个地方都要作这种修改
                    /four<Enter>    找到第一个 "four"
                    cwfive<Esc>     修改成 "five"
                    n               找下一个 "four"
                    .               重复 cwfive<Esc>
                    n               找下一个 "four"
                    .               重复 cwfive<Esc>
                                    如此类推.....   
    注释:
        vim编辑器---批量注释与反注释

            方法一 块选择模式
                插入注释:
                    用v进入virtual模式
                    用上下键选中需要注释的行数
                    按Control+v(win下面ctrl+q)进入列模式
                    按大些“I”进入插入模式,输入注释符“#”或者是"//",然后立刻按下ESC(两下)

                取消注释:
                    Ctrl + v 进入块选择模式,选中你要删除的行首的注释符号,注意// 要选中两个,选好之后按d即可删除注释


            方法二 替换命令
                批量注释:
                使用下面命令在指定的行首添加注释:
                    :起始行号,结束行号s/^/注释符/g
                取消注释:
                    :起始行号,结束行号s/^注释符//g

                实例演示:
                    在27 - 30行添加 // 注释
                    :27,30s#^#//#g

                    在27 - 30行删除 // 注释
                    :27,30s#^//##g

                    在10 - 20行添加 # 注释
                    :10,20s/^/#/g

                    在10 - 20行删除 # 注释
                    :10,20s/^/#/g

            注意例子中正则的分割符使用的是相反的符号,如果匹配// 那么使用 #作分隔符这样不需要对/作转义处理,节省输入次数。


    保存
        从正在编辑的vim中,将文本内容定入到文件,文件一定不能存在(否则写入不了)
        保存文件的更多信息
            在打开的vim文件中执行以下:
                :!ls 
                使用1个当前目前不存在的文件名,如test(test在此之前不存在)
                :w test      将当前正在编辑的文件保存到test文件中
                :!ls        发现当前目录多了个tset文件,就是保存的文件
        选择性保存
            :n1,n2 w test10   从n1行到n2行中内容 定稿到test10文件中(test10在此之前不存在)
            或者
                移动光标到所在行
                v或者ctr+v-->进入可视模式
                移动光标到指定行,
                按下:字符,确认看到屏幕底部看到 :'<,'>
                在接着输入w test10  <回车>

      :w               存盘 write  (类似Windows中 ctrl + s)
      :w  新文件名    另存为新文件(新文件名,之前不能存在)
      :wq              退出保存 或:x
      :q!              退出不保存,放弃修改
        :e!                 重新装载原来放弃修改的文件,
                            放弃修改后,还想重新编辑(在未保存前操作,不常用)

      ZZ        退出保存,不会自动建立1个备份文件,修改立即生效,并且不能恢复,可以配置vim让它产生1个备份文件
                用shift+z+z方便

     提取和合并文件
        :r newfilename   将在光标处,插入,
                        通过:n1,n2 w newfilename
                        或者:'<,'> w newfilename创建的newfilename
            如 :r test10
        :r !ls        也可提取外部命令的输出


    vim内执行外部命令
        :!+外部命令+回车
            :!ls 回车       在vim中执行外部的shell命令,列出当前目录的内容
        
    获取帮助信息
        :help <回车>
            :help w     查询和w相关的帮助
            :help c_CTRL-D
            :help insert-index
            :help user-manual

            当你阅读帮助的时候,你会发现有一些文字被一对竖线括起来了 (例如 |help|或者[xxx])。这表示 一个超级链接。
                CTRL-]   如果你把光标移到这两个竖线之间并按 CTRL-] (标签跳转命令),帮助系 统会把你引向这个超级链接指向的主题。
                CTRL-T   (标签退栈) 把你送回前一个跳转点
                CTRL-O    (跳转到前一个位置) 也能完成相同的功能。
            退出帮助窗口(光标要在帮助窗口,否则退出的不是帮助窗口):
                :q <回车>
                    或ZZ退出
            帮助窗口与当前vim编辑窗口间的切换
                ctr+w

        按下<HELP>键(如果键盘上有的话)
        按下<F1>键(如果键盘上有的话)
        
    配置vim,创建启动脚本
        1、开始编辑 vimrc文件
            :edit ~/.vimrc      unix中
            :edit $VIM/_vimrc      ms-win中
        2、接着读取vimrc示例文件的内容
            :r $VIMRUNTIME/vimrc_example.vim
        3、保存文件,命令为
            :write
        下次启动vim时,编辑器应有了语法高亮的功能
        可以将喜欢的设置添加到这个vimrc文件中
    补全功能
        ctr+d 和tab

        确保vim不在兼容模式下,set nocp
            查看vim是否在兼容模式,
                set compatible?
                    显示nocompatible   非兼容模式
                    显示nocompatible  兼容模式

        :!ls    可以查看当前目录下,所有目录和文件
        :e
        ctr+d  会列出当前目录中所有以e开头的目录
        tab自动补全

    ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序。 
    ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程。 
        fg命令重新启动前台被中断的任务,
        bg命令把被中断的任务放在后台执行.
    ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。 
    ctrl-/ 发送 SIGQUIT 信号给前台进程组中的所有进程,终止前台进程并生成 core 文件。

二、配置.vimrc文件

1、vimrc 文件
    保存你个人初始化的地方是:
        Unix            $HOME/.vimrc 或 $HOME/.vim/vimrc
        OS/2            $HOME/.vimrc、$HOME/vimfiles/vimrc 或$VIM/.vimrc (或 _vimrc)
        MS-Windows      $HOME/_vimrc、$HOME/vimfiles/vimrc 或$VIM/_vimrc
        Amiga           s:.vimrc、home:.vimrc、home:vimfiles:vimrc或 $VIM/.vimrc
    vim自带vimrc模版文体
        $VIMRUNTIME/vimrc_example.vim
        在vim中查看$VIMRUNTIME变量的值
            :echo $VIMRUNTIME
            /usr/share/vim/vim74
                注意:如果想查看外部变量,非vim内部变量,要在命令前加!,会切换出vim中显示,按回车,可继续回到vim中操作
                    如:  :!ls -l

    在vim中编辑
        :edit $MYVIMRC
    在shell中编辑
        vim ~/.vimrc

2、vimrc 示例解释
3、简单键盘映射
    假设你要用一个大括号将一个特 定的单词括起来
        例如,把 "amount" 变成 "{amount}"。用 ":map" 命令,就可以让 F5 来完成这个工作。命令如下:
        :map <F5> i{<Esc>ea}<Esc>
            备注 :
                在输入这个命令时,<F5> 要用四个字符表示。相似地,输入 <Esc> 不是直接按 <Esc> 键,而是输入五个字符。
            <F5>        F5 功能键。这是命令的触发器。当这个键被按下时,相应的命令即被 执行。
            i{<Esc>     插入 { 字符。<Esc> 键用于退出插入模式。
            e           移动到词尾。
            a}<Esc>   在光标右侧插入 } 到单词尾。
        注意:执行 ":map" 命令后,要在单词两端加上 {},
            只需要移到单词的第一个字符上并按 F5。
    键盘映射 (Map)
        map <F5> <Esc>bi{<Esc>ea}<Esc>   [在.vimrc中最后一行添加]
            <Esc> 切换命令行状态
            i{将插入字符{,
            <Esc> 切换命令行状态
            接着用e移到单词结尾,
            a}在词尾右边增加字符},
            <Esc> 切换命令行状态

            光标定位在一个单词上(例如amount)[注意:如果光标在a上,会定位到上1个单词处,此处要做判断,待后续深入学习]
            ,按下F5键,这时字符就会变成{amount}的形式。 
        不同模式下的键盘映射
            Command  Normal  Visual  Operator Pending  Insert Only  Command Line
            vim中命令 常规模式 可视化模式  运算符模式         插入模式    命令行模式
                     命令模式  选择模式
            :map        y       y           y       
            :nmap       y               
            :vmap               y           
            :omap                           y       
            :map!                                               y           y
            :imap                                               y   
            :cmap                                                           y

            标记                      模式
            <space>     常规模式,可视化模式,运算符模式
            n                       常规模式
            v                       可视化模式
            o                       运算符模式
            !                       插入模式,命令行模式
            i                       插入模式
            c                       命令模式
            查看键盘映射
                :map命令,可以列出(nvo模式下的)所有键盘映射。其中第一列标明了映射在哪种模式下工作:
                :map!命令,则只列出(ic模式下的)插入和命令行模式的映射
                :imap,:vmap,:omap,:nmap命令则只是列出相应模式下的映射。
            取消键盘映射
                :unmap <F10>

                :iunmap    取消插入模式下的键盘映射
                :nunmap    取消常规模式下的键盘映射
                :mapclear   取消所有映射,会移除所有用户定义和系统默认的键盘映射。
        key-notation  按键符号
            下面这些按键的名称文档里会用到。它们也可以用在 ":map" 命令里 (按下 CTRL-K 再按 下你想输入的键就可以输入该键的键名)。
            notation        meaning             equivalent      decimal  value(s)
            标识符         含义                  等价于         十进制   值
            -----------------------------------------------------------------------
            <Nul>           零                  CTRL-@           0           (stored as 10) <Nul>
            <BS>            退格键               CTRL-H            8           backspace
            <Tab>           制表符               CTRL-I            9           tab Tab
                                                                            linefeed
            <NL>            换行符                CTRL-J           10          (used for <Nul>)
            <FF>            换页符                CTRL-L           12          formfeed
            <CR>            回车符                  CTRL-M         13          carriage-return
            <Return>        同<CR>                                           <Return>
            <Enter>         同<CR>                                           <Enter>
            <Esc>           转义                  CTRL-[          27          escape <Esc>
            <Space>         空格                                  32          space
            <lt>            小于号                <                60          <lt>
            <Bslash>        反斜杠                \                92          backslash <Bslash>
            <Bar>           坚杠                   |              124         <Bar>
            <Del>           删除                                  127
            <CSI>           命令序列引入          ALT-Esc         155         <CSI>
            <xCSI>          图形界面的 CSI                                       <xCSI>

            <EOL>           行尾 (可以是 <CR>、<LF> 或 <CR><LF>, 
                            根据不同的系统和 ’fileformat’ 而定)               <EOL>

            <Up>            cursor-up                                       cursor-up cursor_up
            <Down>          cursor-down                                     cursor-down cursor_down         
            <Left>          cursor-left                                     cursor-left cursor_left
            <Right>         cursor-right                                    cursor-right cursor_right
            <S-Up>          shift-cursor-up
            <S-Down>        shift-cursor-down
            <S-Left>        shift-cursor-left
            <S-Right>       shift-cursor-right

       <C-Left>     Control+光标左移键 
            <C-Right>       
            <F1> - <F12>
            <S-F1> - <S-F12> Shift+功能键 1 到 12
            <Help>              帮助键
            <Undo>              撤销键
            <Insert>            Insert 键
            <Home>              
            <End> 
            <PageUp>            Page-up
            <PageDown>          Page-down
            <kHome>             小键盘 Home (左上)
            <kEnd>              小键盘 End (左下)
            <kPageUp>           小键盘 Page-up (右上)
            <kPageDown>         小键盘 Page-down (右下)
            <kPlus>             小键盘 +
            <kMinus>            小键盘 -
            <kMultiply>         小键盘 *
            <kDivide>           小键盘 /
            <kEnter>            小键盘 enter
            <kPoint>            小键盘 小数点
            <k0> - <k9>         小键盘 0 到 9
            <S-...>             Shift+键
            <C-...>             Control+键
            <M-...>             Alt+键 或 meta+键
            <A-...>             同 <m-...>
            <D-...>             Command+键 (只用于苹果机)
            <t_xx>              termcap 里的 "xx" 入口键
4、添加插件
    插件其实是一个当 Vim 启动的时候能被自动执行的脚本。
         简单地把插件放到你 Vim 的 plugin 目录中就可以使它生效。
        {仅当 Vim 编译时加入 |+eval| 特性时才有效}

    Vim 中有两种插件:
        全局插件: 用于所有类型的文件
            添加一个全局插 件只要两步:
                1. 获得一个插件的拷贝
                    在什么地方可以找到插件?
                        - 有一些与 Vim 一起发布,你可以在 $VIMRUNTIME/macros 目录或其子目录中找到。 
                        - 从网上下载,http://www.vim.org 收集了很多。
                        - 在 Vim 的邮件列表中找: |maillist|。
                        - 自己写一个,参见 |write-plugin|。
                2. 把它塞进合适的目录
            使用一个全局插件
                系统                  插件目录
                Unix                    ~/.vim/plugin/
                PC 和 OS/2               $HOME/vimfiles/plugin 或 $VIM/vimfiles/plugin
                Amiga                   s:vimfiles/plugin
                Macintosh               $VIM:vimfiles:plugin
                RISC-OS                 Choices:vimfiles.plugin

                以 Unix 系统为例 (假设你还没有 plugin 目录):
                    mkdir ~/.vim
                    mkdir ~/.vim/plugin
                    cp /usr/local/share/vim/vim60/macros/justify.vim  ~/.vim/plugin   
                            注意:/usr/local/share/vim/vim60为$VIMRUNTIME,
                                具体路径要进入vim中,用:echo $VIMRUNTIME查看,
                                    目前在下用的centos7对应$VIMRUNTIME=/usr/shar/vim/vim74

                    建议:除了把这些插件直接放进 plugin/ 目录以外,还可以更好地组织一下,把它们放进 plugin 的单独的子目录中。
                            例如,可以考虑把所有 Perl 插件放置在 "~/.vim/plugin/perl/*.vim"
        文件类型插件: 仅用于特定类型的文件
            Vim 的发布中包括一套针对不同文件类型的插件。你可以用如下命令启用它们:
                :filetype plugin on
            如果你缺少某种文件类型的插件,或者你找到一个更好的,你可以自行添加一个。这也只 需两步:
                1. 获取一个插件的拷贝
                2. 塞到合适的目录。
            取得文件类型插件
                你可以在找全局插件的相同地方找到文件类型插件
                 注意 
                    插件有没有注明文件类型, 据此你可以知道这个插件是全局的还是文件类型相关的。
                    在 $VIMRUNTIME/macros 中的是 全局插件;
                    在 $VIMRUNTIME/ftplugin 中的是 文件类型插件。
            使用文件类型插件
                你可以通过把插件文件放到合适的目录中来增加一个插件。目录的名字与前面提过的全局 插件的位置一样,
                但最后一级目录是 "ftplugin"。
                    假设你找到一个用于 "stuff" 文件类 型的插件,而且你的系统是 Unix。那么,你可以把这个文件用如下命令移入 ftplugin 目录:
                        mv thefile ~/.vim/ftplugin/stuff.vim   [thefile具体文件类型插件的路径]
                    如果这个文件已经存在,你可以检查一下两个插件有没有冲突。如果没有,你可以用另一 个名字:
                            mv thefile ~/.vim/ftplugin/stuff_too.vim
                    注意:
                        这里,下划线用来分开文件类型和其它部分 (这些部分可以由任意字符组成)。
                        但如果你 用 "otherstuff.vim" 就不行了。那是用于 "otherstuff" 类型的文件的。
            文件类型插件名称格式
                一个文件类型相关的插件的名称是:
                    ftplugin/<filetype>.vim 
                    ftplugin/<filetype>_<name>.vim 
                    ftplugin/<filetype>/<name>.vim

                        <name> 可以是任何你喜欢的名字。例如,在 Unix 上,"stuff" 文件类型的插件 可以是:
                            ~/.vim/ftplugin/stuff.vim
                            ~/.vim/ftplugin/stuff_def.vim
                            ~/.vim/ftplugin/stuff/header.vim
                        <filetype> 部分是相应文件类型的名称。只有对应文件类型的文件才会用这个插 件内的设置。
                            插件的 <name> 部分则不重要,你可以对同一个文件类型使用多个插件。
                        注意 插件必须以 ".vim" 结尾。
5、添加帮助
    以 "matchit.vim" 插件为例 (包括在 Vim 中)。
        这个插件使 "%" 命令可以在两个对 应的 HTML 标记间,Vim 脚本的 if/else/endif 间等匹配点间跳转。这非常有用,但它 不向后兼容 (这也是为什么默认的情况下它不会被激活)。
        这个插件有一个文档: "matchit.txt"。

        1、我们先来把该插件拷贝到合适的位置。这 次,我们在 Vim 内完成这个工作,以便利用 $VIMRUNTIME。(如果某些目录已经存在你可 以省略一些 "mkdir" 命令)
            :!mkdir ~/.vim
            :!mkdir ~/.vim/plugin
            :!cp $VIMRUNTIME/macros/matchit.vim ~/.vim/plugin
                "cp" 命令是基于 Unix 的,MS-DOS 上你可以用 "copy"。 
        2、现在在某个 ’runtimepath’ 目录中建立一个 doc 目录。
            :!mkdir ~/.vim/doc
        3、再把帮助文件拷贝进去:
            :!cp $VIMRUNTIME/macros/matchit.txt ~/.vim/doc
        4、现在开始玩技巧了,怎样使 Vim 允许你跳转到新的主题上?用 |:helptags| 命令产生一 个本地的 tags 文件即可:
            :helptags ~/.vim/doc
        5、现在,你可以用这个命令 
            :help g%        来获得 "g%" 的帮助了。在使用如下命令的时候,可以看见一个新的条目: 
            :help local-additions
                        本地帮助的标题行被自动的加入到该节了。在那里你可以看到 Vim 添加了那些本地的帮 助文件。你还可以从这里跳转到新的帮助中。
        6、要写一个本地帮助文件,请参考 |write-local-help|。
6、选项窗口
    如果要找一个选项,你可以在这里寻找帮助: |options|。
    另一个方法是用如下命令:[只是临时有效,重新打开文件,失效,在.vimrc中设置,长期有效]
        :options
            这会打开一个新窗口,其中给出一个选项的列表,并对每个选项提供一行解释。这些选项 根据种类分组。
            将光标移到一个主题上然后按 <Enter> 就可以跳转到那里。再按一下 <Enter> 或者 CTRL-O 就可以跳回来。

            你可以通过这个窗口改变一个选项的值。
                例如,移到 "displaying text" 主题。
                然后把 光标下移到这一行:
                set wrap        nowrap
                当你在上面键入回车,这行会改变为: set nowrap wrap
                    现在,这个选项被关闭了。 这行的上方是对这个选项的简要描述。
                将光标向上移动一行,然后按 <Enter>,你可以跳转到 ’wrap’ 的完整帮助,再用 CTRL-O 可以跳回来。 
                对于那些值为数值或者字符串的选项,你可以编辑它的值,然后按 <Enter> 来启用该值。
                    例如,把光标移动到下面这行: set so=0
                    用 $ 移到行尾,
                    再用 "r5" 命令修改为五,然后按 <Enter> 使修改生效。

                    现在如果你移 动一下光标,你会发现在你的光标移到窗口边界前,你的文字就开始滚动了。这就是选项 ’scrolloff’ 完成的功能: 它指定在距离边界多远的地方开始滚动文字。
7、常用选项
    Vim 中有很多选项。大部分你很少用得上。我们在这个介绍一些常用的。别忘了你可以通过 ":help" 命令获得更多的帮助。方法是在选项命令前后加上单引号,例如:        :help ’wrap’
        查看当前选项的值的方法
            :set 选项?
            如:set wrap?   
                显示wrap表示打开了长行回绕
                显示nowrap表示关闭了长行回绕
        如果你搞乱了一个选项,你可以通过在选项后加上一个 & 号把它恢复到默认值。例如: :set iskeyword&
    1、禁止回绕行[nowrap]
        Vim 通常会对长行自动回绕,以便你可以看见所有的文字。但有时最好还是能让文字在一行中显示完。这样你需要左右移动才能看到一整行。
        以下命令可以关闭行的回绕: 
            :set nowrap
        当你移动到那些不能显示的文字上,Vim 会自动向右滚动让你看到后面的文字,
        要一次滚 动十个字符(左边滚动时,离左右边界有10个字符长度),这样就行了:
            :set sidescroll=10
            这个命令不改变文件中的文本,只改变显示方式。
    2、移动命令换行[whichwrap]
        很多命令只能在一行中移动。你可以通过 ’whichwrap’ 选项改变它。如下命令把这个选 项设为默认值:
            :set whichwrap=b,s
            这样,当光标处于行首时用 <BS> 键可以回到前一行的结尾;当处于行尾时用 <Space> 键可以移动到下一行的行首。
        要允许 <Left> 和 <Right> 键也能这样,可以用这个命令
            :set whichwrap=b,s,<,>
        这只在普通模式中有效,要在插入模式中使 <Left> 和 <Right> 也有效,可以: 
            :set whichwrap=b,s,<,>,[,]
                使指定的左右移动光标的键在行首或行尾可以移到前一行或者后一行。连接以下这些 字符,可以让所有指定的键都有此功能:
                字符 键            模式
                b   <BS>        普通和可视 
                s   <Space>     普通和可视
                <   <Left>      普通和可视
                >   <Right>     普通和可视
                ~   "~"         普通
                [   <Left>      插入和替换
                ]   <Right>     插入和替换

        还有一些可以用的标志位,参见 ’whichwrap’。
    3、显 示 TAB 键
        文件中有 TAB 键的时候,你是看不见的。要把它显示出来:
            :set list
            现在 TAB 键显示为 ^I,而 $显示在每行的结尾,以便你能找到可能会被你忽略的空白字 符在哪里。
        这样做的一个缺点是在有很多 TAB 的时候看起来很丑。如果你使用一个有颜色的终 端,或者使用 GUI 模式,Vim 可以用高亮显示空格和 TAB。使用 ’listchars’ 选项:
            :set listchars=tab:>-,trail:*
            现在,TAB 会被显示成 ">---" ("-" 的个数不定) 而行尾多余的空白字符显示成 "*"。看起来好多了,是吧?
    4、关键字
    5、显示消息的空间

三、正则

    1、正则匹配
        ^ 行首匹配
        $ 行尾匹配
        ^$ 整行匹配
        . 匹配任何单个字符
        \特殊字符   匹配 特殊字符
     2、vim中有个magic的设定。设定方法为:
            :set magic      " 设置magic 
            :set nomagic    " 取消magic 
            :h magic        " 查看帮助

         vim毕竟是个编辑器,正则表达式中包含的大量元字符如果原封不动地引用(像perl 那样), 势必会给不懂正则表达式的人造成麻烦,
         比如 /foo(1) 命令, 大多数人都用它来查找foo(1)这个字符串, 
            但如果按照正则表达式来解释,被查找的对象就成了 foo1 了。
            于是,vim就规定,正则表达式的元字符必须用反斜杠进行转义才行, 如上面的例子,
            如果确实要用正则表达式,就应当写成 /foo\(1\) 
        magic (\m):除了 $ . * ^ 之外其他元字符都要加反斜杠。
        nomagic (\M):除了 $ ^ 之外其他元字符都要加反斜杠。
    原文作者:lvvl
    原文地址: https://www.jianshu.com/p/f24d9bedfd99
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞