如何在Emacs中选择一个矩形

36
9个回答

69

6
我不得不降落在这里才发现这个。令人沮丧的是,Emacs手册中的“矩形”部分直到最后一个命令才列出这个内容。 - Micah Elliott
这是目前最佳答案(该组合最容易命中)。 - BjornW

19

还有一个有趣的要添加到列表中。

如果您正在使用evil-mode(即Vim仿真层),则可以使用evil-visual-block(默认绑定为C-v)来直观地选择矩形。


2
谢谢。我使用Spacemacs,C-x SPC在插入模式下有效,C-v在可视模式下有效。 - cranehuang

17
在Emacs中,一个命令是作用于连续文本还是矩形区域取决于该命令,而不是所选内容的样式。我不知道如何将所选内容显示为矩形(但请参见这个答案),但如果您使用链接页面上列出的任何矩形命令,例如C-x r kC-x r t,您会发现它们作用于由所选内容的起始和结束定义的矩形区域,尽管所选内容看起来像是普通区域。

3
cua-rectangle-mark-mode 可以实现矩形选择,但我还是喜欢使用默认的 -rectangle- 命令。 - event_jr

10

使用矩形命令时,您需要将标记放置在矩形的一个角落并指向另一个对角线。虽然区域将正常显示,但矩形命令将作用于由点和标记限定的矩形区域。CUA模式不会影响此操作。

emacs截图,其中标记、光标和矩形被突出显示

您只需要发挥想象力 :)


2
这个矩形区域的虚假显示似乎在至少Emacs v25中已经被修复了。 - Micah Elliott

9
  1. 按下 C-x SPC 进入矩形选择模式。

  2. 通过以下步骤缩小或扩大区域 (这将选择一个矩形):

    2.1. 使用 C-nC-p 将光标扩展到下一行或上一行。

    2.2. 现在可以通过执行 C-f, C-b, M-f, M-b 等来进行文本选择。

  3. 所选的矩形区域可用于执行某些操作,如:

    • 剪切: C-x r k
    • 删除: C-x r d
    • 粘贴: C-x r y (在光标位置粘贴最后一个被剪切的矩形)

4
如果您想看到矩形选择,请使用CUA矩形。通过启用它来实现。
(cua-selection-mode t)

然后使用 M-RET 开始选择,移动光标可以改变选择区域(也可以使用 RET 移动光标到不同的角落),使用 C-? 获取可以操作矩形区域的命令列表。当选择区域处于活动状态时,M-RET 可以取消选择,C-g 也可以取消选择。
CUA 选择模式并不会启用 CUA 的其他功能,因此 C-xC-cC-v 等命令不会发生变化。

1
除了其他人提到的使用rectangle-mark-modecua-rectangle-mark-mode来突出显示矩形之外,库Mode-Line Position (modeline-posn.el)为与矩形命令一起使用提供以下功能:它在模式行中显示矩形的长度和宽度,作为size-indication-mode的一部分。
通常,size-indication-mode仅显示缓冲区大小和缓冲区中当前相对位置。使用库modeline-posn.el时,当区域处于活动状态时,您看到的是不同的:

  • 对于读取输入的矩形命令,您会看到矩形行数和列数(例如21 rows, 16 cols

  • 否则,是区域大小

你可以自定义信息的显示方式(选项modelinepos-style)。默认情况下,活动区域的大小显示为区域中字符数和行数(例如473 ch, 3 l)。
用于显示活动区域(包括矩形)的模式行指示的面是面region,因此它看起来与区域相同。
另一个功能会在对活动区域执行操作或更改其行为时读取输入时进一步引起您对模式行区域指示的注意。这只是使用不同的面,其默认值为面region,但具有红色上划线和下划线。
最后,布尔选项modelinepos-empty-region-flag确定是否在模式行中指示活动区域以吸引您的注意(否则您可能不会注意到正在处理空区域)。例如,您会看到(使用面region突出显示):0 ch,0 l

EmacsWiki中“ModeLinePosition”的链接已损坏。 - gsl
1
@gsi:谢谢。现在已经修复,希望没有问题了。 - Drew
谢谢,顺便说一下,这个库很不错。我现在开始使用它了。 - gsl

1
大多数矩形命令都通过与“register”命令共享的“C-x r”前缀访问。请参见“矩形”手册部分here,了解所有特殊的“kill、yank、delete、number、replace”等命令的描述,这些命令对于处理矩形很有用。
唯一的非前缀矩形命令是启动器“C-x SPC”(rectangle-mark-mode),但这很容易记住,类似于非常常见的“C-SPC”(set-mark-command)。
看起来在最近的Emacs版本中,所选区域可以很好地显示出所选内容。

我建议您使用helm-descbindsguide-key来完善您的C-x r命令前缀,以及其他任何命令。


1
如果您愿意,也可以用鼠标执行相同的操作。虽然与通过键盘进行操作时选择不存在于行末的字符等情况相比没有那么具体,但它可以满足大多数使用场景。
(defun mouse-start-rectangle (start-event)
  (interactive "e")
  (deactivate-mark)
  (mouse-set-point start-event)
  (rectangle-mark-mode +1)
  (let ((drag-event))
    (track-mouse
      (while (progn
               (setq drag-event (read-event))
               (mouse-movement-p drag-event))
        (mouse-set-point drag-event)))))

(global-set-key (kbd "M-<down-mouse-1>") #'mouse-start-rectangle)

我在这里找到了这个链接:https://emacs.stackexchange.com/a/7261


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接