类似于搜索/替换的功能,用于交换文本


12

我经常发现自己试图取代如foobarbarfoo在缓冲区中。

我通常的方式是:

  • 3查询-替换:aaa -> @@@bbb -> aaa@@@ -> bbb
  • 放弃自动化,只需要手工更换

我想可以使用,语法query-replace-regexp来测试匹配的字符串是否为aaabbb。但是产生的语法太麻烦了,所以我从来没有真正尝试过。

问题是,考虑到任务的普遍性,我认为必须有更好的单步执行方式,无论是内置的还是现有的程序包。在那儿?


可能有一个单一步骤,但是您的第一个方法还不错。而且,如果您选择正确的替换字符串,则可以对第二遍进行无查询替换。
德鲁

@Drew对于Regular query-replace,我知道通常M-% str1 str2比移动点并手动进行更改要快。很好,因为我不必浪费时间思考最快的是什么,即使仅发生一次str1。理想情况下,我希望文本反转同样快,这样我就可以使用它而无需考虑它。
T. Verron

有人会提供一个简单的答案。毫无疑问,您可以按照自己的要求进行操作,例如,使用Lisp表达式进行替换,引用要替换的文本。例如,使用类似于swap惯用语的东西(setq a (prog1 b (setq b a)))。甚至可能有一种更简单的方法。
提请2016年

2
我觉得不是\,(if \1 "b" "a")特别难看(针对的正则表达式\(a\)\|b),但是如果打扰您,这些单词仍然必须键入两次。
politza

2
为什么不\(aaa\)\|bbb呢?
politza '16

Answers:


8

这是一个小命令,它将执行此操作:

(defun query-swap-strings (from-string to-string &optional delimited start end)
  "Swap occurrences of FROM-STRING and TO-STRING."
  (interactive
   (let ((common
          (query-replace-read-args
           (concat "Query swap"
                   (if current-prefix-arg
                       (if (eq current-prefix-arg '-) " backward" " word")
                     "")
                   (if (use-region-p) " in region" ""))
           nil)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
           (if (use-region-p) (region-beginning))
           (if (use-region-p) (region-end)))))
  (perform-replace
   (concat "\\(" (regexp-quote from-string) "\\)\\|" (regexp-quote to-string))
   `(replace-eval-replacement replace-quote (if (match-string 1) ,to-string ,from-string))
   t t delimited nil nil start end))

谢谢,这比我自己写的东西还要复杂!也许您可以详细介绍已实现的功能?我看到带有前缀参数的您可以向后看,如果需要的话,它仅在区域中执行替换...还是只是query-replace对反转进行重写,以便保留其所有功能?它与我的emacs中的100%定义不匹配,但是我仍然使用24.5 ...
T. Verron

@ T.Verron这只是query-replace最新版本功能家族的一个标准主体,因此保留了所有功能。在函数的结尾,我添加了我推荐的交换字符串的方法,该方法在Emacs手册中提到。
link0ff

我可能接受得太快了。仅当我注释掉backwardregion-noncontiguous-p从调用时,此功能才在这里起作用(emacs 24.3)perform-replace。这是一个普遍的问题,还是意味着perform-replace版本之间的接口已更改?
T. Verron

是的,接口已更改,在最新版本中添加了这两个参数,因此在较早的版本中不存在,
link0ff 16-10-14,7

2
现在,这种解决方案似乎还不错。
名称为

9

安装plur

并运行命令 plur-query-replace

和输入{foo,bar}及其替换{bar,foo}

点击y以替换所需的出现。

此命令也有非交互式且类似于isearch的变体。


谢谢!plur的目的有时也是我一直在寻找的东西,我一定会看看的。我唯一的犹豫是来自上述软件包作者的评论……;)
T. Verron

1
plur要求emacs 24.4
T. Verron
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.