如何在emacs中交换单词(通过互相替换)

时间:2013-04-02 04:09:14

标签: emacs

说我有一些文字:

First one is good, so I used first one.Second one is bad, so I drop it.

我想切换'first'和'second',并且像replace-string一样,将大写留给与原始单词相同的大小写。

是否有内置函数来处理这种情况?

编辑: 让我进一步解释一下这个问题。如果我使用普通的replace-string两次,有时会导致不必要的结果。在上面的例子中,如果先使用replace-string,那么RET第二个RET,那么替换第二个RET第一个RET,它就会出来把:第一个是好的。所以我用了第一个。第一个是坏的,所以我放弃它。在某些情况下,这也是一个问题,如“clientFolder => serverFolder和server => client”

3 个答案:

答案 0 :(得分:3)

@huaiyuan在这里回答了同样的问题:

How can I swap or replace multiple strings in code at the same time?

他的代码允许您输入任意对的列表以进行并行替换。

很明显,如果你想阅读一些很酷的lisp代码,请点击@huaiyuan并阅读他的答案。

答案 1 :(得分:1)

这是一个很好的技巧,由Mickey的Mastering Emacs博客提供(见http://www.masteringemacs.org/articles/2013/01/25/evaluating-lisp-forms-regular-expressions/标题下的“交换元素”)

C-M - % \(first\)\|second RET \,(if \1 "second" "first") RET

编辑,这是elisp版本:

(defun my-swap-text (a b)
  "Swap two pieces of text wherever they appear, using `query-replace-regexp'."
  (interactive "sSwap: \nswith: ")
  (let ((use-region (and transient-mark-mode mark-active)))
    (query-replace-regexp
     (rx (or (group (eval a)) (eval b)))
     (quote (replace-eval-replacement replace-quote (if (match-string 1) b a)))
     nil
     (when use-region (region-beginning))
     (when use-region (region-end)))))

答案 2 :(得分:-1)

你在谷歌搜索这个吗?

http://kb.iu.edu/data/abdp.html