快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

神奇的VIM


  作者:闫石
  
  当今世界,文本编辑器种类繁多,大有"乱花渐欲迷人眼"之势。中国有句古语:手巧不如家什妙,作为IT业的专业人士,选择一款优秀的编辑软件至关重要。笔者认为:LINUX下的VIM※以其强大的功能和无穷的魅力将使您终生受益。
  由于被广泛移植,无论是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
顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论