ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Emacs 中选择或突出显示块?

我想在不使用鼠标的情况下选择或突出显示 Emacs 中的一个块,而是像 Vim 的可视模式一样通过键盘进行操作。从键盘执行此操作的最简单方法是什么?

请参阅文章:"Working with rectangular selections",尤其是评论部分。另请参阅 CUA mode documentation 中标题为“CUA 矩形支持”的部分。还有一个 nice video on Vimeo
厘米mark-defun
您还可以使用 Spacemacs 来获取 emacs 中的 vim 键绑定。

S
Svante

如果我正确理解了这个问题,那么它最初与矩形区域无关。

C-Spc 在当前位置放置一个标记。

之后无论您的光标在哪里,最后一个标记和当前位置之间的文本都被“选中”(您可以通过激活 transient-mark-mode 突出显示它,但这也意味着当您不想突出显示时必须删除标记) .

您可以使用以下命令对该区域进行操作:

C-w 。 .杀区。这会删除该区域并将其放入杀戮环中。
C-y 。 .扬克。这会插入 kill ring 中的最后一个片段。
M-y 。 .循环杀戒。紧接 C-y 之后,这会将被拉出的部分替换为 kill ring 中的其他片段。
M-w 。 .将区域保存到杀戮环中。与 C-w 类似,但不删除。

这只是基本用法。标记也有其他用途。我推荐本教程 (C-h t)。


值得注意的是,在这种情况下,C-s C-r 通常用于查找区域的结束/开始。 (在宏中特别有用。)
嗯,这是非常好的命令,但是……如何选择标记的区域?毕竟我仍然需要它,即在标记之间缩进代码。
最后一个标记和当前点(即您的光标所在的位置)之间的区域选定区域。只需运行 M-x indent-region
@Svante 不,它没有被选中。虽然 indent-region 工作得很好,但 c-indent-line-or-region(绑定到 tab 键的那个)不是。最后一个函数不适用于标记 区域,而是选定 区域,即突出显示的区域,就像您用鼠标选择它一样。
@YagamyLight 啊,您可以通过在标记处按两次 C-Spc 来做到这一点。这会临时激活瞬态标记模式(直到您取消(使用 C-g))。然后移动该点以查看所选区域出现。
P
Peter Mortensen

看看 Emacs 中的 region-rectangle 。

简而言之,您可以像往常一样使用 Control-Space 开始选择,然后使用 Control-x rk 杀死区域并使用 Control-x r y 粘贴(或 yank)被杀死的块。


根据我的经验,这不会杀死区域,它会杀死矩形,这与 vim 的视觉模式有很大不同。
P
Peter Mortensen

Emacs 24.4 现在有 rectangle-mark-mode。使用 Ctrl + X, Space 来调用它。


你如何移动矩形块?
这是正确的,但没有引用来源......
M
Micah Elliott

尽管 C-SPC 是从您的点开始标记某物的常用方法,但通常有更快/更简单的方法不涉及显式移动到起点/终点...

内置选择快捷键

Mh——标记段落的重要手段。 “段落”通常意味着一段代码。

CMh 和 CM-@ — 分别用于标记 sexps 和 defuns。这适用于多种语言,而不仅仅是 lisps。

按住 shift — 在移动过程中突出显示的另一种巧妙方式。例如,MSf 向前选择整个单词。这是 shift-select-mode,它在 Emacs 24+ 中默认启用。在某些(非chiclet)键盘上,您应该能够用一个小指按住 CS-。

您可以反复按其中任何一个来扩大选择范围。

还有一些特殊的方法来标记事物:

Cx h — 标记整个缓冲区

Cx SPC — 进入矩形标记模式

(注意:实验时经常使用 C-g 取消标记。)

附加组件

有一些附加包可以改进选择区域和事物。这些都很好地结合在一起,适合不同的用例。全部使用!

expand-region:扩展区域按语义单元增加选定区域。只需按住该键,直到它选择您想要的。 C-= 是它的推荐绑定。多打几次就能得到你需要的东西。

easy-kill:使用 Mw 和助记符来选择不同类型的东西,如单词、sexp、列表等。

zop-to-char:类似于 zap-to-char,但提供了不错的选择和其他菜单驱动的操作。

diff-hl:突出显示未提交的更改区域。使用 diff-hl-mark-hunk 选择/标记一个块。

symbol-overlay:用击键(Mi)在点处选择符号。然后你可以用它做其他事情,比如复制、搜索、跳转、替换等。


n
nbro

使用 Control-Space 设置标记并移动光标。

transient-mark-mode 将为您突出显示选择。 M-x transient-mark-mode

您可以使用自定义设置 Emacs 以默认启用此模式。 M-x customize-option RET transient-mark-mode


P
Peter Mortensen

...如果您使用 Ubuntu 并且 Ctrl + space 不适合您:您需要清除 Intelligent Input Bus (IBus) "下一个输入方法”键绑定,如

运行 ibus-setup 并将“下一个输入法”的键绑定更改为其他内容(或通过单击“...”按钮然后单击“删除”按钮将其完全删除)。

引用来自 an answer 的 Stack Overflow 问题。


P
Peter Mortensen

要扩展 Edin Salkovic 的答案,如果您使用 CUA 模式,您可以使用 Ctrl + Enter 开始视觉块选择。 documentation of CUA 中描述了许多控制块选择的快捷方式。


P
Peter Mortensen

使用 Emacs 25,只需按 Ctrl + Space,然后将光标移动到要突出显示/选择您感兴趣的文本区域的任何位置。之后,您可能需要以下命令:

Ctrl + W 用于剪切。

Alt + W 用于复制。

Ctrl + Y 用于粘贴。