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

Posted

技术标签:

【中文标题】如何在 Emacs 中选择或突出显示一个块?【英文标题】:How to select or highlight a block in Emacs? 【发布时间】:2010-10-14 01:08:55 【问题描述】:

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

【问题讨论】:

C-M-h mark-defun 您也可以使用 Spacemacs 来获取 emacs 中的 vim 键绑定。 【参考方案1】:

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

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

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

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

C-w 。 .杀区。这会删除该区域并将其放入杀戮环。C-y。 .扬克。这会插入 kill ring 中的最后一个 sn-p。M-y 。 .循环杀戒。在C-y 之后,这会立即用kill ring 中的其他sn-ps 替换被拉出的部分。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))。然后移动该点以查看所选区域出现。【参考方案2】:

看看emacs中的region-rectangle。

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

【讨论】:

根据我的经验,它不会杀死区域,它会杀死矩形,这与 vim 的可视模式有很大不同。【参考方案3】:

Emacs 24.4 现在有rectangle-mark-mode。 C-x 空间来调用它。

【讨论】:

如何移动矩形块? 这是正确的,但没有引用来源......【参考方案4】:

参见文章:"Working with rectangular selections",尤其是 cmets 部分。另见CUA mode documentation 标题为“CUA 矩形支持”的部分。还有一个nice video on vimeo。

【讨论】:

【参考方案5】:

虽然C-SPC 是开始标记某项内容的常用方法 无论您的意思是什么,通常都有更快/更简单的方法 涉及显式移动到起点/终点...

内置选择快捷键

M-h标记段落的重要手段。一个段落” 通常意味着一段代码。

C-M-hC-M-@ — 用于标记性别和定义, 分别。这适用于多种语言,而不仅仅是 lisps。

按住 shift — 另一个巧妙的突出显示方式 移动。例如,M-S-f 选择转发整个单词。这是 shift-select-mode, 它在 Emacs 24+ 中默认启用。在一些(非chiclet) 键盘,你应该可以按住C-S- 小指。

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

还有一些特殊的标记方式:

C-x h标记整个缓冲区

C-x SPC — 进入矩形标记模式

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

附加组件

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

expand-region: 扩展区域按语义单位增加选定区域。只是 一直按该键,直到它选择您想要的。 C-= 是一个 建议绑定它。多打几次就可以得到你想要的了 需要。

easy-kill:使用M-w 和 用于选择不同类型事物的助记符,例如单词、sexp、 列表等。

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

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

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

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

...如果您使用的是 Ubuntu 并且 C-spc 不适合您:您需要清除 IBus“下一个输入法”键绑定,如

运行 ibus-setup 并更改键绑定 “下一个输入法”到别的东西(或完全删除它 单击“...”按钮,然后单击“删除”按钮)。

引用自 an answer 到一个 SO 问题。

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

C-w 用于切割。 M-w 用于复制。 C-y 用于粘贴。

【讨论】:

以上是关于如何在 Emacs 中选择或突出显示一个块?的主要内容,如果未能解决你的问题,请参考以下文章

如何突出显示 Emacs 缓冲区中所有出现的单词?

Emacs支架和支架突出显示?

如何使 emacs 突出显示超过 80 个字符的行?

Emacs:在评论中突出显示 TODO *only*

在 vim 中用于 inc-search 的 Emacs 样式突出显示

如何在IntelliJ IDEA中的特定代码块内搜索?