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

加了一个 Case 7 来描述 secondary-region 的用法, 再次感谢大佬的强力补丁!

case7

我觉得 rect mark 的定位有点尴尬?像 readme 里面的 case 4 和 case 5 完全可以用 mark-lines 来实现,其他矩形操作也可以用 emacs 自带的 rect 命令 + secondary region 替换

还是不一样的, mark-lines 的开始是行首, 但是 rect mark 的开始是列, 细微场景还是不一样的。

@manateelazycat 所以可以交给 secondary-region 来做,因为两者都是先选定一个区域再操作,功能上感觉有重叠。而且选择矩形区域有内置的 rectangle-mark-mode,选择后设为 secondary region,然后就可以用其他操作了,这样更通用。

比如

Peek 2022-11-26 12-22

不一样的, markmacro-rect-set 设置好以后, markmacro-rect-mark-symbols 是标记不同行当前列的符号(这里的符号不一定是同样名字的, 只要光标范围够到就算)。 这个场景主要是快速标记一些列位置特征的符号或者矩形范围。

而 secondary-region 和 markmacro-secondary-region-mark-cursors 是基于 search-forward 去找的相同对象。 这个场景主要是针对选中区域进行内相同的字符串进行二次标记。

1 个赞

看来还是代码写少了,想法不够成熟 :joy:

矩形范围和 region (secondary-region 其实和 region 范围一样, 只是方便二次标记)的区域和场景还是有细微的差别的。

没事, 现在多重模式是不冲突的, markmacro 本质是解决数据清理场景下的效率问题(没有这种标记后宏展开的操作, 很多时候都要各种按 query-replace, 操作复杂)。

至于以后什么是最佳实践, 交给时间慢慢进化吧。

猫大我想了下还是觉得可以用 secondary region 来做,您有空的话帮我看看有没有问题:

我对 mark-lines 稍微做了点修改,让它可以识别 secondary-region

下面是 secondary-region + mark-lines 的效果 (高亮一行和高亮当前列的符号是没有区别的,因为是宏编辑)

Peek 2022-11-26 13-50

这样场景就和 rect mark 一样了,按键数也差不多。

而如果想要选择矩形范围内的同名符号的话,就可以用 scondary-region-set + secondary-region-mark-cursors 。

Peek 2022-11-26 12-22

同时 markmacro-rect-deletemarkmacro-rect-replacemarkmacro-rect-insert 等操作也可以用上述基本操作完成,这样就进一步降低了心智负担,而因为都是宏编辑,markmacro-rect-mark-columnsmarkmacro-rect-mark-symbols 其实是一样的

大佬上补丁吧,更少的命令实现更多的功能,强烈支持啊。

已提 PR,试了下,markmacro-rect- 相关命令全部可以用基本操作完成,按键数也没有太大变化。

也就是说不需要 mark-macro-rect-mark-set 这样的命令了?

markmacro-rect-set + markmacro-rect-delete => rectangle-mark-mode + DEL

markmacro-rect-set + markmacro-rect-replace => mark region + markmacro-mark-lines

markmacro-rect-set + markmacro-rect-insert => mark-region + markmacro-mark-lines

markmacro-rect-set + markmacro-rect-mark-columns => mark-region + markmacro-secondary-region-set + markmacro-mark-lines

mark-region 可以是任何 region mark 命令。

猫大可以试试。

补丁已经合并了, 但是 markmacro-rect-set 和矩形操作的命令, 我觉得你没有理解。

体验一下这个插件 lazycat-emacs/rect-mark.el at 060ecf0986867c0e691fc2ed2844451856316e4e · manateelazycat/lazycat-emacs · GitHub 的命令吧。

矩形操作的替换和删除都是针对矩形选中区域的, 不能等同于 markmacro-mark-lines 操作。

补丁里面,在有矩形选中区域的时候, markmacro-mark-lines 就限定了矩形区域。

Peek 2022-11-26 16-19

矩形操作的关键是, mark 操作以后, mark 的区域是一个矩形, 而不仅仅是行数的范围限定。

你先操作一下矩形操作, 对比一下就知道我说的意思了。

你 gif 这个操作我无法复现, 我每次执行 markmacro-mark-lines 都只是 secondary-region 函数范围内的行选择, 没法变成你 gif 这种矩形选择。

  1. rectangle-mark-mode (C-x spc) 进行矩形选区
  2. markmacro-secondary-region-set
  3. markmacro-mark-lines

这个补丁有个 bug , markmacro-secondary-region-set 后默认是矩形操作,我刚准备提交 fix。

我的意思是, 你都 rectangle-mark-mode 标记了, 为啥又要 markmacro-secondary-region-set 然后在 markmacro-mark-lines?

原来的操作是: markmacro-rect-set 后, 直接 markmacro-rect-mark-columns 就好了。

为啥还要引入 secondary-region-set ?

markmacro-secondary-region-set 其实只对 markmacro-secondary-region-mark-cursors 有用啊, secondary-region 叠加 rect 只会让事情更加复杂啊?

因为可以做这个或其他操作,不过 markmacro-secondary-region-set 可以融入 markmacro-mark-lines,这样在用户层面操作是一致的。

可能是我的理解不对,先提前抱歉。