基于标记对象的键盘宏展开插件

我是前天晚上看了一下 Meow 的文档描述, 前天睡觉之前想了想, 昨天下午自己重新写了一个, 没有参考 Meow 的源码。

grab 那个我觉得就是 mark-symbols 或者 mark-word 的概念, 如果只从 Meow gif 展示的效果, markmacro 已经覆盖到功能了。

两个 case: 1.

return_type_t function_a(type1 arg1, ...) {
  blabla..
}
loooooong_return_type_t function_b(type2 arg2) {
 ...
}
=>
return_type_t function_a(common_type arg, type1 arg1, ...) {
  blabla..
}
loooooong_return_type_t function_b(common_type arg, type2 arg2) {
 ...
}
enum op_type_t {
  IO_PROCESS,
  TRIM_PROCESS,
  CLEAN_PROCESS,
  IO_RESERVE,
  TRIM_RESERVE,
  CLEAN_RESERE
};
=>
enum op_type_t {
  PROCESS_IO,
  PROCESS_TRIM,
  PROCESS_CLEAN,
  RESERVE_IO,
  RESERVE_TRIM,
  RESERVE_CLEAN
}

这两个是我在实际编码中遇到的情况,肯定不算高频场景,但是恰好遇到了用 meow 的 beacon 解决起来还是十分顺畅的 :rofl:

第二个 markmacro 的操作很简单:

  1. 选中中间大写的符号
  2. markmacro-rect-set 选中行
  3. markmacro-rect-mark-symbols 标记所有符号
  4. forward-word, transpose-words
  5. markmacro-apply-all

搞定

第一个如果要加 common_type arg , Meow 要怎么操作啊? 没有看懂。

其实是个 work around

loooooong_return_type_t function_b(type2 arg2) {
 ... 2. 两次 backward-sexp 到这里  ^
} <- 1. 搜索 "\n}\n" 让 cursor 落在函数定义的右括号后

恰恰是在这种场景下用骚操作达到了目的之后就能心情愉快好一阵 :joy:

屏幕录制2022-11-25 20.41.01

简单录了个 gif。


批量编辑的重点是将光标快速定位到想编辑的地方,然后录制 kmacro 并应用。

单纯这个例子来说并不通用,因为给不同函数加上相同的参数本身就不那么符合直觉。

只是在思路并不清晰的情况下快速糊一个实现时才会用到。

你这个标记的对象单位是中括号?

不是,我标记的是第三行和第六行的 }

因为只有函数定义的右括号能准确地定义到函数体,然后才能结构化地跳转到参数列表。

有 tree sitter 的话应该就能直接选中函数定义了。

你是按啥按键一次标记两处的?

是meow-search。

当处于 beacon 状态时使用搜索会自动标记搜索命中的地方。

初始状态下高亮部分是我要执行 mult edit 的区域。

搜索 `success` 选择要编辑的地方:

进入 insert 状态,编辑并退出 insert 就能应用到搜索结果了

在添加函数参数的例子中我搜索的是 }

这个高级啊,那你应该搜索 ( 呀

不能保证函数体内没有 ( 啊,所以单独处在一行的 } 适合用来定位。

嗯,感觉有更精准的玩法。

我可能对 markmacro-rect-mark-symbols 这个名字有什么误解,我以为它是 mark 矩形选框中所有同名 symbols ,但实际是这样的

Peek 2022-11-25 21-24

我想要的是下面的效果(参考 Meow 糊的)

Peek 2022-11-25 21-24-2

那是对矩形列周围的symbol做标记,一直没明白meow那种标记有啥用?

我的理解是更方便高效的 mc/mark-all-in-region,在一个 region 里面可视化地宏编辑。

我的意思是 Meow 这种两行选中, 标记其中相同的单词进行宏这个我能够理解。

但是实际的应用场景是啥呢? 我不明白这样设计有啥用, 能否举一个实际上的例子呢?

只对一个区域内某个名字重命名的时候就很方便,我以前用的是 mc/mark-all-in-region ,慢不说,匹配还要自己输入。

但是, 你要刚好单词在光标处才能够的着啊, 如果要重命名的单词在矩形里面呢?

跳过去啊,区域用的 secondary-selection-from-region ,一直保留的。

上面的 gif 中光标就不在 foo 上。