Emacs是否可以支持多行编辑?

Emacs是否可以支持多行编辑?就像sublime那样,在多行设置光标,在多行进行操作?

连按键都能完美模拟。

有一个包 叫 multi-curse 好像就只干这个的

1 个赞

multi-cursor⋯⋯

2 个赞

现在在 Emacs 上的多光标操作插件有三个(就我所知的):

multi-cursor 使用最广的

evil-mc evil 适配版的

evil-multiedit 受不了 evil-适配版,自己造轮子适配evil

By the way, 同学提问之前应该先搜索一下 :slight_smile:

1 个赞

「多个光标」是不支持的,但有插件可以做到。「多行编辑」看你指什么了,不见得就需要「多个光标」才能实现,比如

  • 格式化一个 Markdown 代码块可以用 C-x r t (string-rectangle)
  • 对齐一个 Alist 可以用 M-x align

我没用过 Sublime 或者 Emacs 的 「多个光标」的插件,我可能不大需这个功能,纵然它看起来很酷。

虽然我的配置当中有 multiple-cursors, 但现在很少用了。

multiple-cursors 之类的操作问题在于,操作过程中一旦出错,你再想把光标在回归到正确的位置就很困难了,只好二二三四再来选择一遍。

Ctrl-D (类似 Sublime Text )选中第2个、第3个。。。编辑位置,中间跳过某些,或者再调转光方向选择第-1 、第-2个。。。等等,操作起来很麻烦。中间掉链子就哭了,特别是当选择的跨度超过一屏。但是不否认这个操作看起来很酷炫。

我的替代方案是,先把需要批量编辑的内容圈出来:

  • 只编辑一次,就简单选中需要编辑的段落,然后正则替换 :'<,'>s/foo/bar/g
  • 需要多次编辑的,就 narrow 这段文本,然后正则替换。屏蔽了其他不想干的内容,也省去了多次选择。
  • 复杂的情况,用 helm-swoop 把需要编辑的行找出来,集中到一个临时 buffer 编辑。

这样做的好处:

  • 很方便观察到修改前/后的差别,确认有无疏漏
  • 筛选出来(等修改的)位置可以比较长时间的保持
1 个赞

@twlz0ne 多光标编辑有个问题:有时候手抖多选/少选一处 occur,就得打断重新来过。

后来看到一篇文章:

https://macplay.github.io/posts/vim-bu-xu-yao-duo-guang-biao-bian-ji-gong-neng/

文章中提到的 cgn 方法我觉得挺好,evil 应该也支持。

好处是支持正则,可以按 . 重复,或者 n 跳过,或者 u 撤销。

灵活性高了很多,可以作为参考。:grin:

1 个赞

cgn然后.几次我今天才知道,我是cw然后n.几次这样。在以前evil-multi-edit在spacemacs下有秘制bug的时候。现在基本再也不用啦。

evil-multiedit可以花式toggle occur,我都是mark-next哒哒哒按几下,看标记到我想要的最后一个了,再next-occur + toggle-ocurr。

(下面几句评论到博客了,这里也贴一下)
Drew Neil的书我也看了一点,最大的两个收获是:

  • g/re/normal A; g/re/normal @t这个normal这个ex command
  • 可以不离开insert-mode的编辑,就不离开,然后用.重复,比@@要快。比如a+b变成a + b,然后再应用到c/de*f上。我自己把这种技巧叫做"micro macro"。

可以 toggle occur 的话还好,Vim 的对应插件就没这个功能,导致我每次选 occur 的时候得小心翼翼。另外,自动补全不工作也是个槽点。:roll_eyes:

global 命令确实是神兵利器,我经常用。

宏我倒是用的少,原因是重放的时候经常发现录制的有问题。。。倒不如拆分成小段操作,用 . 号重复来的快。

Emacs 的 Edit Macro 可直接用 Emacs Lisp 写。


So who wants Evil? Evil doesn’t give me anything.

忽略操作难易程度只谈能否实现,都是耍流氓的行为。正常用户不会说,放下手头的工作,跑去研究下 lisp 语法,再写个 简单几行代码 来完成某件事情。

话说回来,Vim 的宏也能直接用 vim script 写啊,应该还可以用 python 写,用 lua 写,用 ruby … 等写。然而有什么卵用呢?录制完再去编辑宏的人寥寥无几。真正玩的溜的人都跑去写插件了。

1 个赞

So who wants Lua Python Ruby, they don’t give me anything.

:roll_eyes:

很佩服使用宏的人。要 ng 多少次,才能成功录制一段宏?我觉得还是写代码简单点。

Edit macro 也可以用来写代码,某种程度上能弥补 Elisp 缺乏 reader macro 的这一抽象层的劣势。

gn 对象配合 . 操作符确实能部分代替多光标编辑。但是如果改动超过一组操作——比如插入做括号,然后向后移动两个词,再插入又括号——是不是就只能靠宏解决了?

我已经不记得上次使用多点编辑是什么时候了,这东西就是看着酷炫,实际用起来体验很糟糕。