MultipleCursors vs IEdit vs KMacro vs QueryReplace

5 个赞

刚看完,这就去抄狗哥的 kmacro 代码 :smirk:

啥都被抄走了。要不给 Meow 一个机会。

俺也折腾了下 Kmacro, 跟狗哥不同的是,我选择的是先记录再选择的逻辑,好处是选择时更加灵活(比如可以先应用两行,换个位置,再应用两行),复用也会更加方便。效果看下图:

ezgif.com-gif-maker

具体逻辑是: 开始录制 macro 时,如果有 region, 会把 region 里的字符串记录下来,在每次 call-macro 时先向前搜索这个词,搜索到了再开始执行,否则结束。如果没有 region,则记录当时光标与行首的距离,在每次 call-macro 时先向下一行并也走相同的距离,然后执行,如果是最后一行则结束。

在结束录制后,会自动跳出 hydra,以便执行 macro。dwim 这个函数会从 region-beginning 开始执行,直到执行失败,(也就是没有搜索到这个词,或到了最后一行),原理就是先 narrow-to-region,再 (call-last-kbd-macro 0 #'func-before-kmacro)。另外还加上了 0-9 这十个数字键,意思就是执行多少次,也即搜索多少次词或向下多少行。其实可以学狗哥给数字加个 overlay,不过人懒,靠 relative line numbers 凑合凑合得了。

日常用iedit的多, 只用到它的两个基本功能. 这东西的工作逻辑跟yasnippet类的东西有冲突, 无法支持嵌套的snippet, 都过于依赖modification hook, 导致很难一起配合. 好像无解.

以前也用iedit,操作小文件还是很快的。Multi-cursor 发现需要使用的时候并不多。现在常用anzu-query-replace 和 Kmacro

广义上来说,我所用的基本都是 query replace:包括内置的 query-replace 和 evil 查找替换,再辅以 narrow 和 helm-ag 之类的方法来圈定应用范围。

总之,比较习惯先确定输入&输出,再把它应用到指定范围/位置

multiple-cursors.el 跟我的习惯有点相左,它需要先进行一次 query 查找位置(输入),回答了 y/n 之后,得到一堆的位置,然后开始编辑(输出&应用),并且要保持这些位置在编辑过程中不丢失,这是一件很困难的事。

对 iedit 没啥印象。

尝试过 keyboard macro ,但由于我录制过程总是磕磕绊绊,很难一键到底。稍微复杂一点的操作,对于它能否正确应用到下个位置没信心。而且不像 query 表达式可修改,感觉是个黑箱。宁愿用 (execute-kbd-macro ...) 代替。

1 个赞