Loading...

当前位置:资讯中心主页 >Linux >文章内容

  • [vim和gvim技巧]vim&gvim技巧大全(1)
  • 来源: ChinaUnix博客  作者: ChinaUnix博客   发布时间:2007-01-02 06:25:00
    • 域名注册

    • 域名惊喜价格 cn域名1元注册
    • com域名39.9

      虚拟主机

    • 主机按月支付,低至19元/月
    • 超大流量,可开子站点

      VPS主机

    • 特惠VPS168元/月,4-8M独享带宽保证
    • 独立操作系统,无限开站点

      d0              表示删除从当前光标到光标所在行首的内容.
      y$              表示拷贝从当前光标到光标所在行尾的内容.
      d$              表示删除从当前光标到光标所在行尾的内容.
      yfa             表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
      dfa             表示删除从当前光标到光标后面的第一个a字符之间的内容.
      特别地:
      yy              表示拷贝光标所在行.
      dd              表示删除光标所在行.
      D               表示删除从当前光标到光标所在行尾的内容.
      关于拷贝, 删除和粘贴的复杂用法和寄存器有关, 能自行查询.
    4. 数字和命令
       在 vi 中数字和命令结合往往表示重复进行此命令, 若在扩展模式的开头出现则表示行
    号定位. 如:
      5fx             表示查找光标后第 5 个 x 字符.
      5w(e)           移动光标到下五个单词.
      5yy             表示拷贝光标以下 5 行.
      5dd             表示删除光标以下 5 行.
      y2fa            表示拷贝从当前光标到光标后面的第二个a字符之间的内容.
      :12,24y         表示拷贝第12行到第24行之间的内容.
      :12,y           表示拷贝第12行到光标所在行之间的内容.
      :,24y           表示拷贝光标所在行到第24行之间的内容. 删除类似.
    5. 快速输入字符
       在 vi 中, 不需求你输入每一个字符, 能有非常多种方法快速输入一些字符.
       使用 linux/unix 的同学一定有一个经验, 在命令行下输入命令时敲入头几个字符再按
    TAB 系统就会自动将剩下的字符补齐, 如果有多个匹配则会打印出来. 这就是著名的命令
    补齐(其实windows中也有文件名补齐功能). vi 中有许多的字符串补齐命令, 非常方便.
      c-p(c-n)        在编辑模式中, 输入几个字符后再输入此命令则 vi 开始向上(下)搜
                      索开头和其匹配的单词并补齐, 不断输入此命令则循环查找. 此命令
                      会在所有在这个 vim 程式中打开的文件中进行匹配.
      c-x-l           在编辑模式中, 此命令快速补齐整行内容, 不过仅在本窗口中出现的
                      文件中进行匹配.
      c-x-f           在编辑模式中, 这个命令表示补齐文件名. 如输入:
                      /usr/local/tom 后再输入此命令则他会自动匹配出:
                      /usr/local/tomcat/
      abbr            即缩写. 这是个宏操作, 能在编辑模式中用一个缩写代替另一个
                      字符串. 比如编写java文件的常常输入 System.out.println, 这非常
                      是麻烦, 所以应该用缩写来减少敲字. 能这么做:
                      :abbr sprt System.out.println
                      以后在输入sprt后再输入其他非字母符号, 他就会自动扩展为System.
                      out.println
    6. 替换
       替换是 vi 的强项, 因为能用正规表达式来匹配字符串.以下提供几个例子.
      :s/aa/bb/g      将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
      :s/\/bb/g  将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词
      :%s/aa/bb/g     将文件中出现的所有包含 aa 的字符串中的 aa 替换为 bb
      :12,23s/aa/bb/g 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
      :12,23s/^/#/    将从12行到23行的行首加入 # 字符
      :%s= *$==       将所有行尾多余的空格删除
      :g/^s*$/d       将所有不包含字符(空格也不包含)的空行删除.
    7. 多文件编辑
       在一个 vim 程式中打开非常多文件进行编辑是挺方便的.
      :sp(:vsp) 文件名    vim 将分割出一个横(纵)向窗口, 并在该窗口中打开新文件.
                          从 vim6.0 开始, 文件名能是个目录的名称, 这样, vim 会
                          把该目录打开并显示文件列表, 在文件名上按回车则在本窗口打
                          开该文件, 若输入 O 则在新窗口中打开该文件, 输入 ? 能看
                          到帮助信息.
      :e 文件名           vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会需求保存.
      c-w-w               vim 分割了好几个窗口怎么办? 输入此命令能将光标循环定位
                          到各个窗口之中.
      :ls                 此命令查看本 vim 程式已打开了多少个文件, 在屏幕的最下方
                          会显示出如下数据:
                          1   %a      "usevim.html"         行 162
                          2   #       "xxxxxx.html"         行 0
                          其中:
                          1               表示打开的文件序号, 这个序号非常有用处.
                          %a              表示文件代号, % 表示当前编辑的文件,
                                          # 表示上次编辑的文件
                          "usevim.html"   表示文件名.
                          行 162          表示光标位置.
      :b 序号(代号)       此命令将指定序号(代号)的文件在本窗口打开, 其中的序号(代号)
                          就是用 :ls 命令看到的.
      :set diff           此命令用于比较两个文件, 能用
                          :vsp filename
                          命令打开另一个文件, 然后在每个文件窗口中输入此命令,就能看
                          到效果了.
    8. 宏替换
       vi 不仅能用 abbr 来替换文字, 也能进行命令的宏定义. 有些命令输起来非常费劲,
    因此我把他们定义到 - 上, 这样就非常方便了.这些设置能预先写到 ~/.vimrc
    (windows 下为 $VIM/_vimrc) 中, 写进去的时候不用写前面的冒号.
      :nmap  :nohls              取消被搜索字串的高亮
      :nmap  w                  命令模式下转移光标到不同窗口
      :imap                 输入模式下运行
      :nmap  :%s= *$==          删除所有行尾多余的空格.
      :imap               同上
      :java 中: (注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文
                会说到怎么实现这一点)
      :nmap  :comp javac:mak -d . %
           此命令用 javac 编译 java 文件, 他会自动将光标定位到出错点. 不过这需要定
           义一个 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有两行字:
              setlocal makeprg=javac
              setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
      :nmap  :comp ant:mak
           此命令用 ant 编译 java 文件, 他会自动将光标定位到出错点. 一般来说, 安装
           vim 后已有了compiler/ant.vim文件, 因此这个命令能直接使用. 不过需要
           在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行.
      :nmap  :cl                 此命令用于查看所有的编译错误.
      :imap  
      :nmap  :cc                 此命令用于查看当前的编译错误.
      :imap  
      :nmap  :cn                 此命令用于跳到下一个出错位置.
      :imap  
      :nmap  :cp                 此命令用于跳到上一个出错位置.
      :imap  
      :nmap  :JavaBrowser
           此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括
           本文件中出现的类, 类的成员变量及成员方法, 就似乎 JCreator 表现的那样.
           在这个窗口中输入 ? 会看到帮助. 嘿嘿, 非常好用, 不过需要 ctags 支持.
      :imap  
    9. TAB
       TAB 就是制表符, 独立拿出来做一节是因为这个东西确实非常有用.
       >                  输入此命令则光标所在行向右移动一个 tab.
       5>>                 输入此命令则光标后 5 行向右移动一个 tab.
       :12,24>             此命令将12行到14行的数据都向右移动一个 tab.
       :12,24>>            此命令将12行到14行的数据都向右移动两个 tab.
       那么怎么定义 tab 的大小呢? 有人愿意使用 8 个空格位, 有人用4个, 有的用2个.
       有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 没关系, vim 能
       帮助你.以下的设置一般也都先写入设置文件中, 免得老敲.
       :set shiftwidth=4   设置自动缩进 4 个空格, 当然要设自动缩进先.
       :set sts=4          即设置 softtabstop 为 4. 输入 tab 后就跳了 4 格.
       :set tabstop=4      实际的 tab 即为 4 个空格, 而不是缺省的 8 个.
       :set expandtab      在输入 tab 后, vim 用恰当的空格来填充这个 tab.
    10. autocmd
        这个命令十分的强大, 能用这个命令实现对不同的文件格式应用不同的设置; 能
    在新建文件时自动添加上版权声明等等. 这些命令一般定义在 ~/.vimrc 这样的设置文件
    里面. 由于他非常强大, 所以我不能给出非常具体的说明, 只能举几个例子, 周详的请看帮助.
      :autocmd!               删除所有之前的自动命令.
      autocmd FileType        java  source ~/.vim/files/java.vim
      autocmd FileType        java  source ~/.vim/files/jcommenter.vim
        以上两条命令让我在打开 java 文件时才应用后面提到的两个设置文件.
      autocmd BufNewFile      *.java  0r ~/.vim/files/skeletons/java.skel
        以上这条命令让我在新建 java 文件时自动加入 java.skel 文件的内容.
      autocmd BufNewFile      *.java  normal gnp
        以上这条命令让我在新建 java 文件时自动运行 gnp 命令, 这个命令进行一些特别化
        处理, 比如将新 java 文件中的 __date__ 替换成今天的日期什么的.
    11. 常用脚本
        在 vim.sf.net 你能发现非常多脚本(script), 这些脚本常常有让你意想不到的作用.
    我常用的有:
        jcommenter.vim        自动加入 javadoc 风格的注释.
        JBrowser.vim          类资源浏览. C, C++ 等能用 Tlist
        更有许多有用的, 比如 checkstyle.vim 能检验你的编程风格, jad.vim 能直接
        反编译 .class 文件等等.
    12. 常用设置
        在~/.vimrc 设置文件中你常常需要一些个性化设置. 比如上面写的一些宏定义, 一些
    autocmd 定义等等. 比如:
        set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
            这样在vim中打开文件时, 按 tab 键补齐文件名时他会忽略上述文件.
        set nu          显示行号
        set ai          设置自动缩进
        map Y y$        让 Y 和 D 相同, 要不然 Y 的本意和 yy 相同.
    13. 其他
        更有许多有意思的命令, 记录在这里免得忘记.
        .                                               重复上次编辑命令.
        :g/^/exec "s/^/".strpart(line(".")." ", 0, 4)   在行首插入行号
        :runtime! syntax/2html.vim                      转换 txt 成 html, 会按照你的
                                                        颜色设置来转
    VI高级命令集锦及VIM应用实例
    作者:  转自:
    http://linux-down.kmip.net/
      本文已被阅读:5 次
    *****************************************************************************
    本文由正泰linux
    http://linux-down.kmip.net
    搜集,整理,如需转载,请注明出处!
    本站有大量的linux电子教程,软件,技术文件,欢迎大家访问!站长阿泰qq:253222170
    ******************************************************************************
    VI高级命令集锦及VIM应用实例
    javalee 写到:
    1.交换两个字符位置
    xp
    2.上下两行调换
    ddp
    3.把文件内容反转
    :g/^/m0/ (未通过)
    4.上下两行合并
    J
    5.删除所有行
    dG
    6.从当前位置删除到行尾
    d$
    7.从当前位置复制到行尾
    y$ 如果要粘贴到其他地方 p 就能了
    由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态
    8.
    :ab string strings
    例如 ":ab usa United States of America" ,
    当你在文见里插入 usa 时
    United States of America 就蹦出来了
    9.
    :map keys new_seq
    定义你当前 键盘命令
    10.
    :set [all]
    vi or ex 的编辑状态
    如 显示每行 :set nu
    11.
    在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的
    下面。
    12.
    单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S
    13.
    :%s/old_word/new_word/g
    这个指令是于在整个文件中替换特定字符串
    14.光标控制
    k:上移 nk 上移n行
    j:下移 nj 下移n行
    将光标移到第n行,按下 mk
    将光标移到第m行,按下 "ay’k
    即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等
    这样就能将你常用的需要复用的内容粘贴到不同的寄存器中以备用
    想粘贴到某处,直接将光标移到某地,按下 ’ap 即可,以此类推,b,c........寄存器等
    在当前屏幕中
    H 跳到第一行
    M 跳到中间一行
    L 跳到最后一行
    15.
    表8-2 删除命令
    删除命令操作
    d l 删除当前字符(和x命令功能相同)
    d 0 删除到某一行的开始位置
    d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
    d w 删除到某个单词的结尾位置
    d 3 w 删除到第三个单词的结尾位置
    d b 删除到某个单词的开始位置
    d W 删除到某个以空格作为分隔符的单词的结尾位置
    d B 删除到某个以空格作为分隔符的单词的开始位置
    d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
    d) 删除到某个语句的结尾位置
    d 4) 删除到第四个语句的结尾位置
    d( 删除到某个语句的开始位置
    d } 删除到某个段落的结尾位置
    d { 删除到某个段落的开始位置
    d 7 { 删除到当前段落起始位置之前的第7个段落位置
    d d 删除当前行
    d /t e x t 删除从文本中出现" t e x t"中所指定字样的位置,一直向前直到下一个该字样所出现的
    位置(但不包括该字样)之间的内容
    d fc 删除从文本中出现字符"c"的位置,一直向前直到下一个该字符所出现的位置(包括
    该字符)之间的内容
    d tc 删除当前行直到下一个字符" c"所出现位置之间的内容
    D 删除到某一行的结尾
    d $ 删除到某一行的结尾
    5 d d 删除从当前行所开始的5行内容
    d L 删除直到屏幕上最后一行的内容
    d H 删除直到屏幕上第一行的内容
    d G 删除直到工作缓存区结尾的内容
    d 1 G 删除直到工作缓存区开始的内容
    修改命令操作
    c l 更改当前字符
    c w 修改到某个单词的结尾位置
    c 3 w 修改到第三个单词的结尾位置
    c b 修改到某个单词的开始位置
    c W 修改到某个以空格作为分隔符的单词的结尾位置
    c B 修改到某个以空格作为分隔符的单词的开始位置
    c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
    c 0 修改到某行的结尾位置
    c) 修改到某个语句的结尾位置
    c 4) 修改到第四个语句的结尾位置
    c( 修改到某个语句的开始位置
    c } 修改到某个段落的结尾位置
    c { 修改到某个段落的开始位置
    c 7 { 修改到当前段落起始位置之前的第7个段落位置
    c tc 修改当前行直到下一个字符c所出现位置之间的内容
    C 修改到某一行的结尾
    c c 修改当前行
    5 c c 修改从当前行所开始的5行内容
    .重复上一次修改!
    表8-4 替换命令
    替换命令操作
    G的开头处
        "         移至当前行上一次所在位置(在光标移动之后)――一个双引号
        ’’        移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号
    19.
    同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间转换。
    不过我发现一个BUG:在用CTRL-SHIFT-6转换到上一个文件后,用:args查看多文件vi状态时,
    屏幕底部仍然显示目前vi的是刚才的文件。
    (在HP-UX,Solaris,AIX上通过)
    也能使用:
    :e#
    进行转换
    20.
    sco 下VI 要在文本前同样的字符加用
    %s/^/要加的内容/g 要在文本后同样的字符加
    %s/$/要加的内容/g
    21.
    怎么去掉文本中的 ^M 硬回车?不必用binary传回去再ascii传回来的方式,用shell或unix语句实现。
    cat filename |tr -d ’\015’ >newfile
    不同的unix系统还存在一些其他不同的命令,如:doscp
    sed 也能实现这个功能.
    dos2unix filename filename2
    反之
    unix2dos filename filename2
    在vi 中用:$s/^M//g
    ^是crtl-V crtl-M
    22.怎么在"unix命令行"下将一个文件的某字符串用另一个串换掉
    sed ’s/string1/string2/gp’ file1 > file2
    23.将/etc/hosts下所有的地址都ping 2次
    1 #/usr/bin/sh
    2 #grad /etc/hosts and ping each address
    3 cat /etc/hosts|grep -v ’^#’ | while read LINE
    4 do
    5 ADDR=`awk ’{print $1}’`
    6 for MACHINE in $ADDR
    7 do
    8 ping $MACHINE -n 2
    9 done
    10 done
    24
    到前一个函数[[ ,到下一个函数]] ,括号配对% ,交叉参考Ctrl_] (事先用ctags做索引),回来用e# ` 编辑一个函数:vi -t 函数名 ,编辑加密文本vi -X
    25
    在插入模式下ctrl+p,自动补齐剩余单词,以赖规则:tags,以有的单词等等
    *****************************************************************************
    本文由正泰linux
    http://linux-down.kmip.net
    搜集,整理,如需转载,请注明出处!
    本站有大量的linux电子教程,软件,技术文件,欢迎大家访问!站长阿泰qq:253222170
    ******************************************************************************
    当今世界,文本编辑器种类繁多,大有"乱花渐欲迷人眼"之势。中国有句古语:手巧不如家什妙,作为IT业的专业人士,选择一款优秀的编辑软件至关重要。笔者认为:LINUX下的VIM※以其强大的功能和无穷的魅力将使你终生受益。
    作者:闫石 (
    iloveibm@163.com
    )
    来自:http://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip15/index.shtml
    由于被广泛移植,无论是PC机的DOS和WINDOWS,还是RISC/6000的AIX,乃至于IBM的大型机S/390,都能见到VIM的身
    影。然而,对于初学者,VIM的用户界面和使用方法非常不符合常规,甚至认为他比较混乱,无所适从。事实上,VIM编辑器是专门为经验丰富的用户设计的,
    他的界面和使用方法提供了更快的速度和更强的功能。对于熟知他的用户,VIM的许多特性节省了时间和击键次数,并能完成一些其他编辑器无法完成的功能。
    学习的最佳方法是实践,唯有如此,才能真正掌控其中的精髓。文中列举的实例,都是笔者在实际工作中遇见的,具有一定的代表性,请大家在阅读的过程中仔细体会。
    好了,目前让我们一起畅游神奇的VIM的世界!
    例一、两个常用的指令序列
    xp 左右交换光标处两字符的位置。
    ddp 上下交换光标处两行的位置。
    例二、重复输入同一字符
    有时,我们可能想多次输入同一字符,VIM的插入功能能非常好的完成这项工作
    命令 80i=^ESC 一次能输入80个字符= ,当然,80a=^ESC 也能完成上述功能。
    请注意:此处的^ESC表示键盘左上方上的ESC键。
    例三、将两个文本数据文件按行逐条合并,并给出标尺
    数据文件1内容如下:
    1-----
    2-----
    3-----
    数据文件2内容如下:
    1=====
    2=====
    3=====
    需求的结果如下:
    |--------1---------2---------3---------4---------5
    1-----
    1=====
    |--------1---------2---------3---------4---------5
    2-----
    2=====
    |--------1---------2---------3---------4---------5
    3-----
    3=====
    也许你会说,这还不简单,无非是反复拷贝、粘贴,所有一款文本编辑器都能完成上述功能。可是,如果这两个文件都非常大,每个文件都成千上万行,恐怕简
    单的拷贝、粘贴就难以胜任了。因此,我们所关心的,是找到一种行之有效的方法,把枯燥乏味的工作留给计算机,我们只需发布指令。为达到此目的,请按以下步
    骤执行:
    ㈠、将两文件合并,结果如下
    1-----
    2-----
    3-----
    1=====
    2=====
    3=====
    ㈡、在两文件头尾相接的地方插入标志行,用以区分两个文件,本文采用的是一整行!字符
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    1=====
    2=====
    3=====
    ㈢、在标志行的下方输入标尺
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====
    ㈣、执行宏命令脚本merge_2r.vim,即在VIM编辑器中按如下键 :so merge_2r.vim 回车
    ㈤、按下键盘上的=键,执行的结果如下
    |--------1---------2---------3---------4---------5
    1-----
    1=====
    |--------1---------2---------3---------4---------5
    2-----
    2=====
    |--------1---------2---------3---------4---------5
    3-----
    3=====
    |--------1---------2---------3---------4---------5
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    ㈥、将最后三行删除,即可得到我们需要的结果
    |--------1---------2---------3---------4---------5
    1-----
    1=====
    |--------1---------2---------3---------4---------5
    2-----
    2=====
    |--------1---------2---------3---------4---------5
    3-----
    3=====
    怎么样,简单吗?请大家自己实际尝试一下。下面,我来周详讲解宏命令脚本merge_2r.vim 。
    该脚本内容如下:
    "--------------------------------------------------------------------
    "Macro Function : Merge File1 And File2,Have Ruler in every record
    " Date : 2001/12/01
    " Author : Yan Shi
    "--------------------------------------------------------------------
    "1-----
    "2----- } Sample File1
    "3-----
    "!!!!!!!!!!!!!!!!!!!!!!!! Flag Row
    "|--------1---------2---------3---------4---------5 Ruler
    "1=====
    "2===== } Sample File2
    "3=====
    "--------------------------------------------------------------------
    :1
    :map = ma/!!!!!^M+:.co ’a-1^M/!!!!!^M2+:.m’a^M+=
    前14行每行都以"开始,表明该行是注释行,实际并不执行,只是方便读者阅读,只有最后两行才是真正的代码行。请注意:本例中的^M表示键盘上的回车键,并非^和M两个字符。为了讲述清晰,我把命令行分解开,逐一说明。
    首先将第一行置为当前行,然后执行map命令,将一大串VIM指令映像给字符=。这一大串VIM指令共分9步执行:
    ma 将数据文件一的第一行标记为a
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====
    /!!!!!^M 找到标志行,置为当前行
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====
    + 光标下移一行,即把标尺行置为当前行
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====
    :.co ’a-1^M 把标尺行复制到标记行(数据文件一的第一行)的上方
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====
    /!!!!!^M 再次找到标志行,置为当前行
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====
    2+ 光标下移2行,即数据文件二的第一行置为当前行
    |--------1---------2---------3---------4---------5
    1-----
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    1=====
    2=====
    3=====
    :.m’a^M 把数据文件二的第一行移至标记行的下方
    |--------1---------2---------3---------4---------5
    1-----
    1=====
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    2=====
    3=====
    + 光标下移一行,即数据文件一的第二行置为当前行
    |--------1---------2---------3---------4---------5
    1-----
    1=====
    2-----
    3-----
    !!!!!!!!!!!!!!!!!!!!!!!!
    |--------1---------2---------3---------4---------5
    2=====
    3=====
    = 这一步非常关键,是典型的递归调用,重复完成以上步骤
    例四、在文件中置入行号
    工作中,我们有时希望把行号置入文件中,而VIM提供的功能 :set nu 只能显示行号,不能编辑或将其置入文件当中,下面的宏命令脚本row_num.vim能完成此项功能。
    "------------------------------------------
    "Macro Function : Source File Add Row_Num
    " Date : 2001/12/01
    " Author : Yan Shi
    "------------------------------------------
    :%s/^/^I/
    :$
    :let end=line(".")
    :1
    "------------------------------------------
    :let num=1
    :while num<=end
    :let line=getline(".")
    :let temp=substitute(line,$,num,"")
    :call setline(".",temp)
    :+
    :let num=num+1
    :endwhile
    "------------------------------------------
    请注意:本例中的^I表示键盘上的TAB键,并非^和I两个字符。下面,我针对该宏命令脚本逐一讲解。
    :%s/^/^I/ 每一行的行首添加一个TAB字符
    :$ 到文件的末行
    :let end=line(".") 末行的行号 ==〉变量 END,函数line的功能是取得指定行的行号,此处参数"."表示当前行
    :1 到文件的首行
    "------------------------------------------
    :let num=1 1 ==〉计数器
    :while num<=end
    :let line=getline(".") 取当前行的内容 ==〉变量 LINE
    :let line=substitute(line,$,num,"") 在变量 LINE 的前面置入行号
    :call setline(".",line) 将变量 LINE 的内容写回当前行
    :+ 下移一行
    :let num=num+1 计数器加一
    :endwhile 循环执行,直到文件结束
    "------------------------------------------
    有关正则表达式的使用
    UNIX/LINUX下的非常多工具之所以强大、灵活,关键是因为有了正则文法和元字符,这也是VIM乃至UNIX/LINUX系统的精华所在。正因
    为使用灵活,因此掌控起来比较吃力,如果不是真正理解,实际运用中会出现千奇百怪的错误。因此,有必要对这部分知识多花些气力。下面结合具体实例讲解。
    例五、有一文件,包含某外企的中国员工的资料,首先是姓名,然后是两个空格,其次是15位身份证号码。
    zhang.fei 430759701022003
    diao.chan 651302801225012
    guan.yu 342869680413001
    xi.shi 120638780214006
    liu.bei 210324650708001
    目前,有以下问题需要解决:
    按照国外人的习惯,应该是名在前,姓在后。因此,文件中的姓名字段需要修改。
    姓和名的首字母应该大写。
    根据身份证号码,还能判断出生年月日,将其作为一个新字段添加。
    根据身份证号码,能判断出性别。若为男性,添加male,若为女性,添加female 。
    将男女员工分开,男员工在前,女员工在后。
    将各字段数据左对齐
    最终结果如下:
    Fei.Zhang 430759701022003 1970/10/22 male
    Yu.Guan 342869680413001 1968/04/13 male
    Bei.Liu 210324650708001 1965/07/08 male
    -----------------------------------------------
    Chan.Diao 651302801225012 1980/12/25 female
    Shi.Xi 120638780214006 1978/02/14 female
    为了完成上述功能,只需执行脚本employee.vim ,使用方法为 :so employee.vim 回车即可。
    脚本内容如下:
    :%s/ / /
    :%s/\(............\)\( *\)/\1/
    :%s/\([A-Za-z][A-Za-z]*\)\(\.\)\([A-Za-z][A-Za-z]*\)/\u\3\2\u\1/
    :%s/$/ xxxxxx/
    :%s/\([0-9]\{6}\)\([0-9]\{6}\)\([0-9]\{3}\) \(xxxxxx\)/\1\2\3 \2/
    :%s/\(..\)\(..\)\(..\)$/19\1\/\2\/\3
    :%s/$/ xxxxxx/
    :%s/\([0-9]\{14}[13579]\)\(.*\)\(xxxxxx\)/\1\2male /
    :%s/\([0-9]\{14}[02468]\)\(.*\)\(xxxxxx\)/\1\2female/
    :$
    :s/.*/&^M-----------------------------------------------
    :g/female/.m$
    在这个脚本中,使用了大量的正则表达式,这里仅对涉及到的正则表达式做一简要介绍。有关正则表达式的内容相当多,本文不可能占用大量篇幅叙述,请大家谅解。
    % 地址范围符号,代表文件中的所有行,作用等同于地址范围 1,$
    . 和任意单字符(换行符除外)匹配,例如 y.s 能匹配 yas y.s 或 y s 等等。
    * 和前一字符的0次或多次出现匹配,例如 y*s 能匹配 yys yyyyys 或 s 等等。
    $ 和行尾匹配。
    & 代表模式匹配中出现的字符串,例如 s/abc/&def 是把当前行的abc替换成abcdef 。
    [] 匹配[]中出现的字符,例如[abc]匹配字符 a,b 或 c ,[a-zA-Z]匹配所有的英文字符。
    \( \) \(和\)之间出现的内容能由\num来替代。
    \1\2\3 替代\(和\)之间出现的内容。
    \u 将后续字符串的首字母大写。
    \{num} 和前一字符的num次出现匹配。
    目前,我们对脚本逐条讲解,希望能帮助大家理解正则文法。
    ⑴:%s/ / /
    将文件中每行出现的2个空格替换为10个空格。
    zhang.fei 430759701022003
    diao.chan 651302801225012
    guan.yu 342869680413001
    xi.shi 120638780214006
    liu.bei 210324650708001
    ⑵:%s/\(............\)\( *\)/\1/
    保留行首的12个字符,将其余的空格删除,这样,前两个字段就对齐了。
    zhang.fei 430759701022003
    diao.chan 651302801225012
    guan.yu 342869680413001
    xi.shi 120638780214006
    liu.bei 210324650708001
    ⑶:%s/\([A-Za-z][A-Za-z]*\)\(\.\)\([A-Za-z][A-Za-z]*\)/\u\3\2\u\1/
    将文件中每行出现的雇员姓名互换,并将首字母大写。
    Fei.Zhang 430759701022003
    Chan.Diao 651302801225012
    Yu.Guan 342869680413001
    Shi.Xi 120638780214006
    Bei.Liu 210324650708001
    ⑷:%s/$/ xxxxxx/
    在每一行的行尾添加2个空格和6个x
    Fei.Zhang 430759701022003 xxxxxx
    Chan.Diao 651302801225012 xxxxxx
    Yu.Guan 342869680413001 xxxxxx
    Shi.Xi 120638780214006 xxxxxx
    Bei.Liu 210324650708001 xxxxxx
    ⑸:%s/\([0-9]\{6}\)\([0-9]\{6}\)\([0-9]\{3}\) \(xxxxxx\)/\1\2\3 \2/
    将xxxxxx替换成出生年月日。
    Fei.Zhang 430759701022003 701022
    Chan.Diao 651302801225012 801225
    Yu.Guan 342869680413001 680413
    Shi.Xi 120638780214006 780214
    Bei.Liu 210324650708001 650708
    ⑹:%s/\(..\)\(..\)\(..\)$/19\1\/\2\/\3
    将年月日用/字符分隔,并在年前添加19。
    Fei.Zhang 430759701022003 1970/10/22
    Chan.Diao 651302801225012 1980/12/25
    Yu.Guan 342869680413001 1968/04/13
    Shi.Xi 120638780214006 1978/02/14
    Bei.Liu 210324650708001 1965/07/08
    ⑺:%s/$/ xxxxxx/
    在每一行的行尾添加2个空格和6个x
    Fei.Zhang 430759701022003 1970/10/22 xxxxxx
    Chan.Diao 651302801225012 1980/12/25 xxxxxx
    Yu.Guan 342869680413001 1968/04/13 xxxxxx
    Shi.Xi 120638780214006 1978/02/14 xxxxxx
    Bei.Liu 210324650708001 1965/07/08 xxxxxx
    ⑻:%s/\([0-9]\{14}[13579]\)\(.*\)\(xxxxxx\)/\1\2male /
    身份证号码末位是奇数的,将xxxxxx替换成male
    Fei.Zhang 430759701022003 1970/10/22 male
    Chan.Diao 651302801225012 1980/12/25 xxxxxx
    Yu.Guan 342869680413001 1968/04/13 male
    Shi.Xi 120638780214006 1978/02/14 xxxxxx
    Bei.Liu 210324650708001 1965/07/08 male
    ⑼:%s/\([0-9]\{14}[02468]\)\(.*\)\(xxxxxx\)/\1\2female/
    身份证号码末位是偶数的,将xxxxxx替换成female
    Fei.Zhang 430759701022003 1970/10/22 male
    Chan.Diao 651302801225012 1980/12/25 female
    Yu.Guan 342869680413001 1968/04/13 male
    Shi.Xi 120638780214006 1978/02/14 female
    Bei.Liu 210324650708001 1965/07/08 male
    ⑽:$ 到文件的最后一行
    ⑾:s/.*/&^M-----------------------------------------------
    在文件的最末行插入一行 "-" 字符。
    Fei.Zhang 430759701022003 1970/10/22 male
    Chan.Diao 651302801225012 1980/12/25 female
                   
                   
                   


  • 以上内容由 华夏名网 搜集整理,如转载请注明原文出处,并保留这一部分内容。

      “华夏名网” http://www.sudu.cn 和 http://www.bigwww.com 是成都飞数科技有限公司的网络服务品牌,专业经营虚拟主机,域名注册,VPS,服务器租用业务。公司创建于2002年,经过6年的高速发展,“华夏名网”已经成为我国一家知名的互联网服务提供商,被国外权威机构webhosting.info评价为25大IDC服务商之一。

    华夏名网网址导航: 虚拟主机 双线主机 主机 域名注册 cn域名 域名 服务器租用 酷睿服务器 vps vps主机

  • (阅读次数:764)
  • 上一篇: [vim与gvim技巧]vim&gvim技巧大全(0)    下一篇: [vim与gvim技巧]vim&gvim技巧大全(2)
  • [收藏] [推荐] [评论] [打印本页] [返回上一页][关闭窗口]
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。