是否有等效于vim的sed样式替换命令?


14

我从vim中错过的一件事是能够键入将在多行中工作的替换命令,例如:

:/begin/,/end/s/foo/bar/g

上面的命令用“ foo”代替“ bar”,从包含“ begin”的第一行开始,到包含“ end”的第二行结束。

有没有办法在emacs中做类似的事情?

Answers:


7

evil提供的精简版本ex,因此最好假定它不是确切的插件。但是,例如你所提供的作品开箱,只要点之前到第一线(即begin在你的例子线)。


在vim中,搜索也将从该点开始,因此听起来就像我在寻找什么。谢谢!
拉里·科尔曼

8

这是仅使用内置功能的一种实现方法:

  1. 在包含第一个出现的线的点上begin,按C-SPC

  2. 移至下一次出现end

    C-s end RET

  3. 替换foobar

    M-% foo RET bar RET !

这利用了这样一个事实:query-replace它将在活动区域​​而不是整个缓冲区上工作(如果有的话)。


当然,您也可以定义一个自定义命令:

(defun replace-from-to (beg end str repl)
  (interactive "sBegin: \nsEnd: \nsString: \nsReplacement: ")
  (save-excursion
    (goto-char (point-min))
    (let ((start-pos (search-forward beg))
          (end-pos (search-forward end)))
      (replace-string str repl nil start-pos end-pos))))

此命令将始终从缓冲区的开始搜索,所以点之后就可以begin/ foo/ end当你调用它。

通过以下方式为其设置按键绑定:

(global-set-key (kbd "C-c r") 'replace-from-to)

5

通常,这是您要使用的东西narrow-to-region

您将光标移动到(例如,通过搜索)区域的开头并按C-SPC,然后移动到区域的结尾并键入M-x narrow-to-region。现在,您可以发出所需的任何搜索和替换命令,它们仅适用于缓冲区的狭窄部分。完成后,键入M-x widen以恢复缓冲区内容。


4
如果begin/ end是一种编程语言中的分隔符,则您很可能可以使用C-M-Space来运行mark-sexp以在一个命令中选择区域。
dgtized

1
默认绑定:C-x n nnarrow-to-region)和C-x n wwiden)。
itsjeyd 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.