Evil 的替换文本操作

问一个小白的问题,evil 中替换文本可以

:s/word/replacement/g

会将当前行中的word都替换为replacement,然后,如果移动到新行,我只需要

:

然后回车就行,会自动执行上次的替换命令。

问题来了,如果我中间更改了替换命令,比如

:s/another_word/replacement/g

如果我还想回到上次的替换命令,只能将上次的重新输入一遍。对 vi 了解不多,这么做是不是不太对,大家都是怎么做的呢?

1 个赞

没有使用evil来做query-replace的需求, 我自己使用Emacs 自带的query-replace命令: Peek 2018-04-21 11-07

  1. M-% :query-replace hacking RET haha RET
  2. e: haha RET somewhat RET
  3. e: somewhat RET back_to_hacking RET

query-replace过程中用 e 来修改你要replace 的字符串.

2 个赞

我是用 iedit-mode 来做批量文本替换的

e,不知道还有这种玩法,query-replace果然还是比 evil 的 replace 强大吗?

iedit-mode 我也在用,但是只用于批量修改替换 symbol 的时候。

C-p 不会显示上一个替换?

2 个赞

不确定完全理解你的意思。用 ctrl-p 或者 方向键就回到上一条命令了,重新输入一遍是什么意思?

vim 中默认如此,evil 我记得也是可以的。

ctrl-f 打开 所有的历史命令 窗口,编辑完回车执行。这个我当时没在 evil 中找到对应。

1 个赞

q:

(evil-record-macro REGISTER)

Record a keyboard macro into REGISTER.

If REGISTER is :, /, or ?, the corresponding command line window will be opened instead.

1 个赞

刚看了下 vim 中 q: 也打开历史命令窗口。那 evil 就和 vim 行为一致了。我 evil 用的不多。

Peek 2018-04-21 12-04

Emacs 的query-replace 很强大我是可以确定的,但是就是不是比vim 强的问题我就无法确定了.我一般都是用sed 的替代方式来在vim 里面替代文本的.除了我刚刚提到的可以中途修改replace-string 之外,还有一些其他有趣的玩法.

  1. M-%: query-string hacking RET haha RET
  2. ^: back to previous occurrence
  3. N: go to next occurrence
  4. C-r: 进入recursive mode, 可以暂时把query-string 放在一遍,修改一下原文的东西,然后再回来 query-string
  5. C-M-c: back to query-string
  6. e: haha RET somewhat RET
  7. !: 替换所有的匹配字符

Emacs 的文档也是极好的:

3 个赞

感觉没有evil来的直观呀

1 个赞

好吧,我竟然不知道!我一直以为 M-p 上一条,试了一下不行就以为没有 :joy:M-p应该是 emacs 惯例吧?我半路出家,对 vi 真的不熟悉,当然对 emacs 也不敢说熟悉。这很多按键不统一真是折磨了我这种小白了。

我就觉得evil 不够灵活咯 :zipper_mouth_face:

C-p M-p,你还可以试下 :wink:


另外“新一行上再: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 happynormal后面跟任意normal-state按键。在evil里可以简写为nor,vim不行。这样原来有些需要录制macro的地方,只要normal然后开始幻想操作就行了 :beers:
1 个赞

evil为啥不灵活呢?\,可以写elisp

1 个赞

主观感觉,比如evil没有recursive-mode(或者是我孤陋寡闻不知道), 比如不可以选择是否替换匹配的内容(或许我又孤陋寡闻了), 也不可以在替换过程中更换目标字符串(我还是孤陋寡闻?)。

可以用/c,如果需要更换目标字符串,得改一下evil-ex-substitute,也不复杂