Emacs的搜索能否根据模式匹配来做替换?

举个例子:

假如我的代码里有用到这样的结构体:

...
(MyStruct a b)
....

现在我想重构一下,把a b换一下位置:把所有(MyStruct a b)都换成(MyStruct b a),用Elisp有没有什么好办法能做到?

感觉搜索+模式匹配 应该能做到这个功能,就是不知道怎么做。。。

求教。。。

注意:a b 并不是固定的,他们可能是复合表达式,如:

(MyStruct a b) => (MyStruct b a)

(MyStruct (foo bar) (baz)) ==> (MyStruct (baz) (foo bar))

假如是搜索对象是 Emacs Lisp 代码的话,可以用 GNU Elpa 上的 El-search,如:

M-x el-search-query-replace `(MyStruct ,x ,y) -> `(MyStruct ,y ,x)

El-search 里的「模式匹配」指的是 Pcase。

1 个赞

可以用正则式吧

多谢。

刚才测试了一下,很不错。可惜的是,它只能对Elisp代码使用,不能对其他Lisp代码使用(比如:racket)。

说起来也奇怪,都是对s-exp表达式(看成数据)进行模式匹配,换个语言就不行了。

因爲el-search底層用的是read函數來讀入sexp。對付racket那種可以圓括號方括號混用的當然就不行咯