我想在不使用鼠标的情况下选择或突出显示 Emacs 中的一个块,而是像 Vim 的可视模式一样通过键盘进行操作。从键盘执行此操作的最简单方法是什么?
mark-defun
如果我正确理解了这个问题,那么它最初与矩形区域无关。
C-Spc
在当前位置放置一个标记。
之后无论您的光标在哪里,最后一个标记和当前位置之间的文本都被“选中”(您可以通过激活 transient-mark-mode
突出显示它,但这也意味着当您不想突出显示时必须删除标记) .
您可以使用以下命令对该区域进行操作:
C-w
。 .杀区。这会删除该区域并将其放入杀戮环中。
C-y
。 .扬克。这会插入 kill ring 中的最后一个片段。
M-y
。 .循环杀戒。紧接 C-y
之后,这会将被拉出的部分替换为 kill ring 中的其他片段。
M-w
。 .将区域保存到杀戮环中。与 C-w
类似,但不删除。
这只是基本用法。标记也有其他用途。我推荐本教程 (C-h t
)。
看看 Emacs 中的 region-rectangle 。
简而言之,您可以像往常一样使用 Control-Space 开始选择,然后使用 Control-x rk 杀死区域并使用 Control-x r y 粘贴(或 yank)被杀死的块。
尽管 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)在点处选择符号。然后你可以用它做其他事情,比如复制、搜索、跳转、替换等。
使用 Control-Space 设置标记并移动光标。
transient-mark-mode
将为您突出显示选择。 M-x transient-mark-mode
。
您可以使用自定义设置 Emacs 以默认启用此模式。 M-x customize-option
RET transient-mark-mode
。
...如果您使用 Ubuntu 并且 Ctrl + space 不适合您:您需要清除 Intelligent Input Bus (IBus) "下一个输入方法”键绑定,如
运行 ibus-setup 并将“下一个输入法”的键绑定更改为其他内容(或通过单击“...”按钮然后单击“删除”按钮将其完全删除)。
引用来自 an answer 的 Stack Overflow 问题。
要扩展 Edin Salkovic 的答案,如果您使用 CUA 模式,您可以使用 Ctrl + Enter 开始视觉块选择。 documentation of CUA 中描述了许多控制块选择的快捷方式。
使用 Emacs 25,只需按 Ctrl + Space,然后将光标移动到要突出显示/选择您感兴趣的文本区域的任何位置。之后,您可能需要以下命令:
Ctrl + W 用于剪切。
Alt + W 用于复制。
Ctrl + Y 用于粘贴。
不定期副业成功案例分享
C-s
C-r
通常用于查找区域的结束/开始。 (在宏中特别有用。)M-x indent-region
。indent-region
工作得很好,但c-indent-line-or-region
(绑定到 tab 键的那个)不是。最后一个函数不适用于标记 区域,而是选定 区域,即突出显示的区域,就像您用鼠标选择它一样。C-Spc
来做到这一点。这会临时激活瞬态标记模式(直到您取消(使用C-g
))。然后移动该点以查看所选区域出现。