Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1255572
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: Python/Ruby

2012-11-22 16:23:44

1. 搜索热身
       %可以搜索与之匹配的对应的()[]{}。这个功能对于书写程序特别有用。
       在命令行输入:set ignorecase可以设置搜索以忽略大小写的方式进行。输入:set noignorecase可以设置搜索以匹配大小写的方式进行。默认的,将匹配大小写。这个默认设置可以在.vimrc中修改。
       大小写智能匹配模式。输入命令:set ignorecase smartcase可以设置为智能大小写匹配模式。在这种模式下,如果你输入的字符串中至少包含一个大写字母,那么就会以大小写敏感模式进行搜索,否则以忽略大小写模式进行搜索。

2. 全文的搜索
       键入/后,光标进入VIM底部的命令行,这时就可以输入以/为开始的/搜索命令了。
     1)最简单的查找。输入/string就可以查找string字符串。
     2)继续查找。在第一次搜索后输入n将会继续进行上一次搜索,如果输入3n那么会找到后面第三个
        符合的字符串。大写的N会在反方向,也就是向上进行搜索。
     3)向上搜索。输入?可以向上搜索。随后的n命令将会继续向上搜索,N向下搜索,其他和/一样。

3. 对大小写的匹配。
     1)在命令行输入:set ignorecase可以设置搜索以忽略大小写的方式进行。
        输入:set noignorecase可以设置搜索以匹配大小写的方式进行。默认的,将匹配大小写。
        这个默认设置可以在.vimrc中修改。
     2)大小写智能匹配模式。输入命令:set ignorecase smartcase可以设置为智能大小写匹配
        模式。在这种模式下,如果你输入的字符串中至少包含一个大写字母,那么就会以大小写敏感模式
        进行搜索,否则以忽略大小写模式进行搜索。
     3)在搜索命令中指定大小写。在几种大小写搜索模式中进行转换总要输入长长的一串指令,如果
        需要不断地转换模式,确实有些麻烦。所以你可以直接在搜索命令中指定大小写匹配模式。\c表示
        忽略大小写,而\C表示对大小写敏感。

4. 查找当前词。
        一个简单的方法可以让你查找下一个和当前词一样的词,你不比输入/currentword,
      你可以直接按下*就可以查找下一个currentword。#可以让你向上查找同一个单词。

6. 调整查找后的光标位置。
      1)使用/string/3会使在光标转到找到string字符串的行下面的第3行。第1行从包含string的行算
         起。同样可以使用/string/-2来使光标停留在包含string的行的前面2行。
      2)使用/string/e可以使光标停留在string字符串的末尾而不是默认的第一个字符位置。/string/b
         则表示停留在string第一个字符的位 置,不过默认就是如此,我们不比多此一举。但是/string
         /b+2却可以使光标停留在string字符串的第二个字符的位置,这里是r。在e或者b的 后面+或者-
         数字,可以进一步调整光标的位置。

7. 特殊字符。
      在搜索命令中,  .*[]^%/?~$这10个字符有着特殊意义,所以在使用这些字符的时候要在前面加上一个反斜杠/。而\e表示;\t表示;\r表示;\b表示

8. 匹配换行或空格。
      使用\n可以表示一个换行;而\s表示匹配空白,注意是空白不是空格。
      \_s表示匹配换行或者空格;\_a表示匹配换行或者一个字母。
      比 如:
         /the\nword查找以the结束并且下一行以word开始的行的位置。
         /the\_sword查找the和word之间以空白或者换行分割的位 置。
         /the\_s\+word表示the和word之间可以有多个空白。\+的含义可以在后面找到。

9. 限定词首或者词尾。
      \<可以限定找到是以指定字符串开始的单词。
      比如:
          /\          而\>则是限定必须是以指定字符串结尾的单词。

10. 行首和行尾。
      输入/^string查找以string开始的行,并且光标停留在这个string的第一个字符。
      输入/string$则查找以string结束的行,并将光标停留在这个string的第一个字符。
      这个模式不会忽略前导或者后置的空格。

11. 匹配任何一个字符。
      句号.可以匹配任何一个字符。例如/t.e可以找到the或者tae或者tue。

12. 更加复杂的匹配模式。
      实际上,/搜索可以使用非常复杂的匹配模式。下面列出了其中一些复杂的匹配模式。

        可重复的字符。
          1)使用*表示它前面的字符可以重复多次或者0次。比如/be*可以匹配b,be,bee,beee等等。
             但是这也会包含b,因为e重复0后是空。如果要匹配诸如be,bebe,bebebe的字符串可以
             使用\(和\)把他们包括起来,形如:/\(be\)*。
          2)使用\+来限定为重复至少一次到无数次。如:/be\+可以匹配be,bee,bee等等。
          3)重复0次或者一次。\=可以指定重复0次或者一次。/strings\=表示匹配string或者
             strings。这在查找单词的复数形式特别有用.
          4)指定重复的次数。\{n,m}可以指定重复n到m次。比如:/be\{2,4}将会匹配
             bee,beee,beeee。同样可以使用\{,4}表示匹配0到4次;\{4,}表示4次到无数次;
             \{4}表示重复4次。

        匹配列表中的一个。
             使用一个以\|分割的列表,可以表示匹配列表中任何一项。比如/one\|two表示查找one或者
           two;/one\|two\|three表示查找one或者two或者three。
            1)一个复杂的实例:/end\(if\|while\|for\)将会查找endif,endwhile以及endfor。
            2)字符列表。使用[0-9]可以表示一个0到9范围的字符。比如/string[1-5]表示查找
               string1,string2,string3,string4,string5。当然也可以使用[a-z]表示字符a到z中间
               的一个。

13. 搜索并替换。
        输入: [range]s/from/to/[flags]命令可以搜索匹配的字符串并且替换为指定的字符串。这是一
     个稍微复杂的命令。其中[range]是一个 可选项,用来指定搜索替换的范围。[flags]也是一个可选
     项,用来指定搜索替换的处理方式。所以这个命令的简单形式是:s/from/to/。
      1)搜索替换的范围。如果没有指定范围,则只在当前行进行搜索替换。
         在所有行进行搜索替换。范围符号%表示在所有行进行搜索替换。:%s/from/to/就是在全文查找
      from并替换为to。
         在指定的行上进行搜索替换。:1,50s/from/to/表示在第1行和第50行之间(包括1和50行)进行
      搜索和替换。:45s/from/to/表示仅仅在第45行进行搜索和替换。而"1,$"行号范围和“%“是等价。
      2)处理方式。
          我现在使用的VIM默认的方式是无须确认。不过好像不同版本的默认的处理方式是不同的。
      3)无须确认。
          方式符号g表示直接替换无须进行确认。:%s/from/to/g表示在全文中查找from并且直接全部替换为to。
      4)列印。
          处理方式符号p表示在替换时列出每个被改变的行。手册中这么说,但是实际效果却让我很迷惑。

       5)确认后处理。
           处理方式符号c表示在进行替换前需要用户进行确认。这时你可以选择(y/n/a/q/1/^E/^Y):y
         表示同意当前替换;n表示不同意当前 替换;a表示替换当前和后面的并且不再确认;q表示立即结
         束替换操作;1表示把当前的替换后结束替换操作;^E向上滚屏^Y向下滚屏,用来帮助查看前后内
         容以决定进行操作。
14. 替换高级技巧
    1)替换变量
       在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 \( 和 \) 中的内容。
            example:
           ·将 data1 data2 修改为 data2 data1
           -----------------------------------
           :s/\(\w\+\)\s\+\(\w\+\)/\2\t\1
           -----------------------------------
           ·将 Doe, John 修改为 John Doe
           -----------------------------------
           :%s/\(\w\+\), \(\w\+\)/\2 \1/  
           -----------------------------------
     2)利用函数替换
用法:
---------------------------
:s/替换字符串/\=函数式
---------------------------
说明:
·函数式可以有多个,返回值可以用字符串连接符.连接起来,如line(".")返回匹配行号
  (:help line()   ),submatch(n)可以引用\1、\2的内容,其中submatch(0)引用匹配的整个内容;
·函数式也可以是字符串常量,用双引号引起来。函数式也可以是任意表达式,需要用小括号引起来,
  如(3+2*6);
·函数式还可以是寄存器中的内容,通过"@寄存器名"访问,如@a(不需要加引号,但是还是需要用.来连
  接);
example:
·要将下列8行的data0依次变成data0~7(前面的数字是行号)
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;

现在只用vim我们就可以完成这样的事情:
首先将光标移到125行(line(".")返回当前匹配行的行号,line("'a")返回mark a的行号):
---------------------------------------------------------------------------
ma
:%s/^\(double\s\+data\)\d\(;\)/\=submatch(1).(line(".")-line("'a")+1).submatch(2)/g
---------------------------------------------------------------------------
再或者
首先将光标移到125行(line("'V7j
:%s/^\(double\s\+data\)\d\(;\)/\=submatch(1).(line(".")-line("'
---------------------------------------------------------------------------
   3) 匹配开始与结束
\zs和\ze可以用于替换操作中指明替换的开始与结束,如上例中可以以更短的操作来实现:
---------------------------------------------------------------------------
ma
:%s#^double\s\+data\zs\d\ze#\=(line(".")-line("'a")+1)#g
---------------------------------------------------------------------------
另外,还可以使用vim表达式来实现上述功能:
---------------------------------------------------------------------------
:let n=0 | g/^double\s\+data\zs\d/s//\=n/ | let n+=1
---------------------------------------------------------------------------
其中 ·|      用来分割不用的命令;
·g      在匹配后面模式的行中执行指定的ex命令
·\zs    指明匹配由此开始
·s//\=n 对匹配模式进行替换,匹配模式为空,表示以上一次匹配成功的模式,
并且指明替换是一个表达式;
阅读(1294) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~