[已解决]VIM怎么实现快速替换?

Vim、Emacs配置和使用
回复
iny
帖子: 142
注册时间: 2008-05-22 9:43

[已解决]VIM怎么实现快速替换?

#1

帖子 iny » 2009-05-16 20:49

快速查找我会了,但是快速替换不知道怎么弄,每次都是在命令行里面输入:%s
很麻烦,我想实现替换的2种常用功能:
1、全部替换
2、查找和替换,先查找,由用户决定是否替换

最近一直在找这方面的资料,一直没找到,麻烦高手帮下,非常感谢!
上次由 iny 在 2009-05-19 11:06,总共编辑 1 次。
头像
petrele.chen
帖子: 261
注册时间: 2008-09-11 17:41

Re: VIM怎么实现快速替换?

#2

帖子 petrele.chen » 2009-05-16 20:53

占座,同问
头像
Strange
帖子: 1824
注册时间: 2006-05-19 9:54
来自: Shanghai

Re: VIM怎么实现快速替换?

#3

帖子 Strange » 2009-05-16 21:15

替换当然要用%s不然用vim还有什么意义

全部替换就是%s/xxx/yyy/g
决定替换只是%s/xxx/yyy/gc
先好好看看%s的帮助文件吧
ニンニク入れますか?
x60 with gentoo
iny
帖子: 142
注册时间: 2008-05-22 9:43

Re: VIM怎么实现快速替换?

#4

帖子 iny » 2009-05-16 21:18

Strange 写了:替换当然要用%s不然用vim还有什么意义

全部替换就是%s/xxx/yyy/g
决定替换只是%s/xxx/yyy/gc
先好好看看%s的帮助文件吧
这个我知道,太麻烦了,很多时候替换只是复制和粘贴,不需要重复的输入替换的内容
starwing
帖子: 100
注册时间: 2008-09-19 1:03

Re: VIM怎么实现快速替换?

#5

帖子 starwing » 2009-05-17 10:23

给LZ一些建议吧。

如果使用上次的搜索串(就是你在:g, :s, /, ?里面使用的),可以直接忽略掉第一个参数,比如,先查找再替换:
/foobar
:%s//blabla/g

按#和*可以向上或者向下查找当前光标处的关键字,这时的效果等同/和?,所以可以这样:
当光标在“foobar”上的时候,按*
:%s//blabla/g

如果要提示,在最后的flags里面加入c标记,如下:
:%s//blabla/gc

如果你要直接删掉替换的文本,可以:
:%s/foobar//g
当然配合上面的使用:
当光标在“foobar”上时,按*
:%s///g

最后介绍两个常用命令。一个是&:
:&
它相当于你上次输入的s的内容。你还可以附加标志位。比如,第一次可以只替换一个,
甚至只是确认一下:
:%s/foobar/blabla/gn
第二次就可以真的替换了:
:%&g
是不是简单很多呢?
:&命令是不会保持跟上次一样的标志位的,当然这也是你期望的行为,那么如果有标志位
呢?
:&&
这样就可以了。
如果要使用最近的搜索来做替换,那么直接:&r就可以了。参看:s_flags

第二个命令是:~,它相当于:&r,使用最近的模式,和最近的substitute的替代串。同样
可以带标记。

如果你想使用:&,不带任何标记(就是说,替换掉当前行的第一个匹配),可以直接输入
&,它是一个命令作用就相当于:&不过我不常用的说,我很少用&不改变标志位的= =

所以呢,我常用的是g&,它相当于:&g

提醒一句,别瞎用“~”命令,那可不代表:~,那个的意思是改变当前字符的大小写……
starwing
帖子: 100
注册时间: 2008-09-19 1:03

Re: VIM怎么实现快速替换?

#6

帖子 starwing » 2009-05-17 10:29

最后,LZ可能觉得要替换任意内容(而不是一个单词)可能会很麻烦。这里还有一个窍门。你可以用v命令选择你要替换的内容,然后按y复制。输入:%s/,这时按<C-R>",你刚才抽取的内容就会被放在这里。这样就不需要自己输入搜索的文本了。别的地方也是可以这样的。

另外呢,y命令可以带寄存器。比如我要把foo foo换成bar bar,我用v命令选中foo foo,然后"ay把它抽取到a寄存器里面,然后把bar bar抽取到s寄存器里面,接着就可以直接:%s/<C-R>a/<C-R>s/g了。

上面的<C-R>是指Ctrl+R
iny
帖子: 142
注册时间: 2008-05-22 9:43

Re: VIM怎么实现快速替换?

#7

帖子 iny » 2009-05-17 12:46

starwing 写了:最后,LZ可能觉得要替换任意内容(而不是一个单词)可能会很麻烦。这里还有一个窍门。你可以用v命令选择你要替换的内容,然后按y复制。输入:%s/,这时按<C-R>",你刚才抽取的内容就会被放在这里。这样就不需要自己输入搜索的文本了。别的地方也是可以这样的。

另外呢,y命令可以带寄存器。比如我要把foo foo换成bar bar,我用v命令选中foo foo,然后"ay把它抽取到a寄存器里面,然后把bar bar抽取到s寄存器里面,接着就可以直接:%s/<C-R>a/<C-R>s/g了。

上面的<C-R>是指Ctrl+R
很感谢,不过命令太多了,感觉还是比较复杂,收藏慢慢学习了
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: VIM怎么实现快速替换?

#8

帖子 lilydjwg » 2009-05-18 16:13

加一点:在命令行里可以用<C-R><C-W>取得光标处的词。详请 :h c_Ctrl-R
iny
帖子: 142
注册时间: 2008-05-22 9:43

Re: VIM怎么实现快速替换?

#9

帖子 iny » 2009-05-19 1:35

还有一个问题请教,比如我用n查找到下一个内容,并且已经高亮,请问怎么快速替换这个被查找的内容?(不用再进入命令行,这样太麻烦)
头像
roylez
帖子: 1928
注册时间: 2005-10-04 10:59
来自: 上海

Re: VIM怎么实现快速替换?

#10

帖子 roylez » 2009-05-19 6:22

cw呗。
弄个dropbox空间来备份文件或者做私人代码服务器
配置:[url]git://github.com/roylez/dotfiles.git[/url]
主页:http://roylez.heroku.com
各种稀奇玩意儿:http://dooloo.info
starwing
帖子: 100
注册时间: 2008-09-19 1:03

Re: VIM怎么实现快速替换?

#11

帖子 starwing » 2009-05-19 8:50

iny 写了:还有一个问题请教,比如我用n查找到下一个内容,并且已经高亮,请问怎么快速替换这个被查找的内容?(不用再进入命令行,这样太麻烦)
为啥不直接:%s/.../.../gc呢?非要n?

如果n到了,按&替换。详见:h &
iny
帖子: 142
注册时间: 2008-05-22 9:43

Re: VIM怎么实现快速替换?

#12

帖子 iny » 2009-05-19 10:07

starwing 写了:
iny 写了:还有一个问题请教,比如我用n查找到下一个内容,并且已经高亮,请问怎么快速替换这个被查找的内容?(不用再进入命令行,这样太麻烦)
为啥不直接:%s/.../.../gc呢?非要n?

如果n到了,按&替换。详见:h &
谢谢,我现在用的是/gc,非常好用,我是个懒人,使用工具的目的就是让工具帮我做很多事情 :em06

那个&我还没看懂,我要好好的看你的文章先
回复