假设我已经在当前缓冲区中选择了一些文本。是否可以选择另一段文字,同时保留先前的选择(依此类推)?
添加:此功能的动机如下:假设我有一些看起来像这样的文本:
paragraph 1 ...
paragraph 2 ...
paragraph 3 ...
paragraph 4 ...
paragraph 5 ...
我想删除一些段落(例如2、4和6),然后将它们插入第1段之前。
multiple-cursors
可能会为您提供解决方案。
假设我已经在当前缓冲区中选择了一些文本。是否可以选择另一段文字,同时保留先前的选择(依此类推)?
添加:此功能的动机如下:假设我有一些看起来像这样的文本:
paragraph 1 ...
paragraph 2 ...
paragraph 3 ...
paragraph 4 ...
paragraph 5 ...
我想删除一些段落(例如2、4和6),然后将它们插入第1段之前。
multiple-cursors
可能会为您提供解决方案。
Answers:
您可以将寄存器与标记环一起使用。用推动当前标记,用C-<SPC> C-<SPC>
以后恢复它们C-u C-<SPC>
,或将它们保存在一个寄存器中,例如b
通过C-x r <SPC> b
,然后用恢复到后面C-x r j b
。
现在标记另一个区域。 C-u C-x r s a
将复制标记的区域以注册a
并删除文本。然后标记下一个区域,C-u C-x r + a
并将另一个选择添加到该寄存器a
并将其删除。
然后,您可以使用插入内容C-x r i a
。
请参阅Emacs手册的“在寄存器中保存文本”部分。
安装browser-kill-ring.el
复制并杀死所有感兴趣的区域。
指出重新插入的位置。
M-x browse-kill-ring
RET 将打开一个缓冲区并将光标放在其中。
键入n以旅行的块。
RET 将在原始/其他缓冲区中的点插入块。
如果可以通过正则表达式匹配来区分要操作的行,则可以使用出现模式在新窗口中查看它们。然后,您可以使用出现编辑模式进行编辑,原始缓冲区反映出您在Occur缓冲区中所做的更改。
例如,与multi-cursors-mode结合使用时,它的效果非常好:因为您选择显示在Occur缓冲区中的行连续显示,而不管它们在原始缓冲区中有多远,因此您可以标记所有行或子集,然后一次激活mc/edit-lines
和编辑它们。(是的,我知道多光标本身可以使用来完成所有操作mc/mark-all-like-this
,但是拥有选项很好。)
如果您只看到要处理的行,那么任何其他编辑操作都将更容易完成,例如设置复杂的regex搜索和替换,或者需要依次在缓冲区的每一行上运行的宏,也可以这样
这回答了您的一般问题,但不是特别地回答了您提到的用例(四处移动代码)。
Emacs现在具有所谓的非连续区域,这是您要询问的选择类型。Vanilla Emacs不提供任何特殊方法来创建不连续的区域,除非它是矩形。但是图书馆区域确实如此。
库区域可让您在缓冲区中定义多个区域。一个区域的列表是不连续的区域。您也可以将其视为多个区域,具体取决于您希望如何使用它。您可以随时定义多个区域列表,每个区域列表都分配给不同的区域变量,并且可以在它们之间切换。
如果您还使用Bookmark +库,则可以永久保存区域列表,并在以后的Emacs会话中将其还原。Bookmark +还允许您将任意标签分配给书签。这意味着您可以标记区域列表。
给定区域列表中的区域通常位于同一缓冲区中,但不必如此。在这种情况下,区域列表比非连续区域更笼统。还更笼统的是,每个区域除了区域限制之外还可以包含其他信息,并且可以具有标识符。
有几种创建区域的方法。最简单的方法之一是使用C-x n a
:它从活动区域定义一个区域,并将其添加到当前区域集中。(C-x n n
(narrow-to-region
)除缩小范围外,还这样做。)
您可以对一组区域(列表)执行以下操作:
facemenu+.el
。另请参见Narrow Indirect,它使您可以创建间接缓冲区,这些间接缓冲区是给定缓冲区的克隆,并且缩小到其不同部分。
另一种方法是使用objed包(我是作者)。您可以标记任何文本对象,并且m
该点会自动移动到当前类型的下一个对象。通过导航到任何对象取消标记,然后再次按m。这是一个示例屏幕录像(显示标记线,但也适用于其他对象,如段落,defuns ...):
package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found
。
M-x package-refresh-contents
然后M-x package-install
。