之前我在lofter上发过2篇关于vim的文章,现在我把第二篇迁移过来放在这里作为1,因为那边的第一篇是转自coolshell不是我自己写的,总觉得不太好。

文本编辑器中一个重要功能就是查找与替换了,VIM中也提供了强大的功能。之前使用的时候也用过一些,整理了一些比较使用的技术,它们有的来自Vim的用户手册,有的来自其它人的博客,都列在下面。

单文件搜索

这个还是比较简单的,按 / 键可以键入需要搜索的内容,这里输入的是一个正则表达式 ,例如查找一段文字word

1
/word

光标会自动(向后)定位到含有word的文本处,如果要向前查找,使用?word。

如果需要全字匹配,则使用\<>匹配单词开头与结尾,例如:

1
/\<word\>

输入一次之后,可以按下n键寻找下一个结果,如果已经到了文档结尾,则会从头开始搜索。

另外,如果光标已经处在文件中的一个单词上,则可以使用 * 键直接向后搜索这个词,使用 # 键可以向前搜索这个词。

多文件搜索

最近才会的技术,主要用于在一个工程里搜索对应的项。其实使用ctags也可以做到但有时候ctags并不能提供我们需要找的东西譬如一段字符串之类的。

如果是在shell中,可以使用find配合grep实现,在vim中的话,可以使用vimgrep(简写为vim)

vimgrep /匹配模式/[g][j] 要搜索的文件/范围

g:表示是否把每一行的多个匹配结果都加入

j:表示是否搜索完后定位到第一个匹配位置

1
2
3
4
:vim /pattern/ %              在当前打开文件中查找
:vim /pattern/ * 在当前目录下查找所有
:vim /pattern/ ** 在当前目录及子目录下查找所有
:vim /pattern/ **/*.c 在所有目录下的所有*.c文件中查找

输入上面的命令以后,可以接着使用下面的命令在结果之间切换:

1
2
3
4
5
cn                                          查找下一个 
cp 查找上一个
copen 打开quickfix
cw 打开quickfix
cclose 关闭qucikfix

替换

vim中替换的方法有多种,一种是结合搜索+cw命令的方式,一种是直接使用substitute命令的方式。

(1) 结合搜索功能

首先使用上面的搜索功能找到一个匹配的词,按cw(c是替换命令,w是移动一个word,这是两个vim命令的组合),此时会进入INSERT模式,且这个word已经被删除了,输入需要替换的词,按Esc返回Normal Mode。

好,完成这些动作之后下面就是重复了,按n键搜索下一个匹配项,找到以后按下 . 键(重复上一个改动),就可以直接替换了,不断按下n键和 . 键,能够人工替换文中所有匹配项。

(2) 使用substitute命令

substitute,简称s,专用于替换的命令。

格式如下:

1
2
3
4
5
6
7
8
9
:[range]s/pattern/string/[c,e,g,i]
range:范围,1,7表示第1-7行,1,$表示1-最后一行。常用%表示整篇文章,#表示前一次编辑的文章。
/patter/ :与查找一样,正则表达式
/string/ :需要替换的内容

c : 确认替换,每次替换询问
e : 不显示error
g : 整行替换,不加这个开关只会替换一行最开始的匹配项。
i : 不区分大小写

例如,我需要替换当前文件里所有word为drow,输入下面的命令:

1
:%/word/drow/g

这样就完成了所有的替换,没有提示,全自动。

个人觉得这样还是挺危险的,万一替换的不好就把有用的地方给换错了,觉得没有把握的时候可以加上c参数。实在不行,铭记vim的撤销键——u!还有全都不管强退命令:q!

学习vim最好的方法还是多多实验多多进行实际使用,用多了以后自然能够记住这些常用命令。不实际操作的话光看一遍手册(譬如我),绝大部分的内容根本就记不住。只有想起来要用的时候才会上网搜一下,我实际用的最多的就是查找,替换基本没用过,估计再过一段时间也会再忘掉………..