问一个小白的问题,evil 中替换文本可以
:s/word/replacement/g
会将当前行中的word
都替换为replacement
,然后,如果移动到新行,我只需要
:
然后回车就行,会自动执行上次的替换命令。
问题来了,如果我中间更改了替换命令,比如
:s/another_word/replacement/g
如果我还想回到上次的替换命令,只能将上次的重新输入一遍。对 vi 了解不多,这么做是不是不太对,大家都是怎么做的呢?
问一个小白的问题,evil 中替换文本可以
:s/word/replacement/g
会将当前行中的word
都替换为replacement
,然后,如果移动到新行,我只需要
:
然后回车就行,会自动执行上次的替换命令。
问题来了,如果我中间更改了替换命令,比如
:s/another_word/replacement/g
如果我还想回到上次的替换命令,只能将上次的重新输入一遍。对 vi 了解不多,这么做是不是不太对,大家都是怎么做的呢?
没有使用evil来做query-replace
的需求, 我自己使用Emacs 自带的query-replace
命令:
M-% :query-replace hacking RET haha RET
e: haha RET somewhat RET
e: somewhat RET back_to_hacking RET
在query-replace
过程中用 e
来修改你要replace 的字符串.
我是用 iedit-mode 来做批量文本替换的
赞e
,不知道还有这种玩法,query-replace
果然还是比 evil 的 replace 强大吗?
iedit-mode 我也在用,但是只用于批量修改替换 symbol 的时候。
C-p 不会显示上一个替换?
不确定完全理解你的意思。用 ctrl-p 或者 方向键就回到上一条命令了,重新输入一遍是什么意思?
vim 中默认如此,evil 我记得也是可以的。
ctrl-f 打开 所有的历史命令 窗口,编辑完回车执行。这个我当时没在 evil 中找到对应。
q:
(evil-record-macro REGISTER)
Record a keyboard macro into REGISTER.
If REGISTER is :, /, or ?, the corresponding command line window will be opened instead.
刚看了下 vim 中 q:
也打开历史命令窗口。那 evil 就和 vim 行为一致了。我 evil 用的不多。
Emacs 的query-replace
很强大我是可以确定的,但是就是不是比vim 强的问题我就无法确定了.我一般都是用sed
的替代方式来在vim 里面替代文本的.除了我刚刚提到的可以中途修改replace-string
之外,还有一些其他有趣的玩法.
M-%: query-string hacking RET haha RET
^: back to previous occurrence
N: go to next occurrence
C-r: 进入recursive mode, 可以暂时把query-string 放在一遍,修改一下原文的东西,然后再回来 query-string
C-M-c: back to query-string
e: haha RET somewhat RET
!: 替换所有的匹配字符
Emacs 的文档也是极好的:
好吧,我竟然不知道!我一直以为 M-p
上一条,试了一下不行就以为没有 ,M-p
应该是 emacs 惯例吧?我半路出家,对 vi 真的不熟悉,当然对 emacs 也不敢说熟悉。这很多按键不统一真是折磨了我这种小白了。
我就觉得evil 不够灵活咯
C-p
M-p
,你还可以试下↑
另外“新一行上再:s
”这个需求有点奇怪,:s
可以多行的,
:.,$s/foo/bar/g
此行到最后执行替换:.,.+3s/foo/bar/g
此行到n+3行内替换v
/V
选中一部分后再:
会自动:'<,'>
,在选中的部分执行替换或其他操作甚至还有稍微不那么常用的:
%g/re/
可以(在%
即全buffer内)搜索re
,所以我刚刚试了下这个,竟然是可以用的:%g/re/s/foo/bar/g
。在有re
的行上把foo
替换为bar
%v/re/
是搜索不含有re
的行,于是%v/re/s/foo/bar/g
你懂的……不是替换但是我也很推荐的,同样不常用但是关键时刻非常好用:
%g/re/d
删除有re
的行"ayy
来清空register a(不知道有没有更好的方法清空register),%g/re/d A
删除有re
的行,把它们添加(大写A
)到register a,这时到另一个地方"ap
,就可以贴出删除的那些行(开头多了一个空行)"ayy
%g/re/yank A
类似(复制而不删除匹配的行)%v/haha/normal A//This line is not happy
给所有没有haha
的行在末尾加上//This line is not happy
。normal
后面跟任意normal-state按键。在evil里可以简写为nor
,vim不行。这样原来有些需要录制macro的地方,只要normal
然后开始evil为啥不灵活呢?\,
可以写elisp
主观感觉,比如evil没有recursive-mode
(或者是我孤陋寡闻不知道), 比如不可以选择是否替换匹配的内容(或许我又孤陋寡闻了), 也不可以在替换过程中更换目标字符串(我还是孤陋寡闻?)。
可以用/c
,如果需要更换目标字符串,得改一下evil-ex-substitute
,也不复杂