2010-04-13 203 views
33

当我使用VIM或最无模式的编辑器(Eclipse,NetBeans等)时,我经常执行以下操作。如果我有类似的文本块,我需要将它们全部更改,我将更改它,复制它(或使用未删除的YANK),选择我需要的下一个块,并将更改后的版本粘贴到它上面。如果我在emacs中执行同样的操作(选择区域并使用C-y粘贴),它不会替换区域,只会粘贴到光标位置。在emacs中做这件事的方法是什么?如何用yank缓冲区内容替换emacs中的区域?

+0

有类似的文本块(在你的代码?),通常建议你需要一些重构,例如,用包含“相似文本”的函数/方法调用替换相似的文本块。我的客人,这是我从来没有真的错过了Emacs中的“替换区域”功能的原因之一... – slu 2010-04-13 13:08:31

+0

@slu你如何重命名你已经提取的漂亮的功能/方法? – 2016-05-12 22:41:57

回答

55

添加到您的.emacs

(delete-selection-mode 1) 

凡是写入缓冲区,而该地区是积极将覆盖它,包括粘贴,而且只需键入某事或点击Backspace

+1

为什么不是默认? – 2014-03-09 18:56:18

+2

@mcb可能是该地区直到最近才默认不可见的原因;标准的emacs实践是(或者可能)在将标记移动到一个位置时将标记保留在一个位置,并且除非使用专门对其进行操作的命令,否则它们之间存在区域的事实是无关紧要的。你不想在每次打字时都要摧毁这个区域,并且有像'exchange-point-and-mark'这样的命令可以跳转到你离开商标的地方。这些天我怀疑大多数人不使用这种方式,所以总是显示该区域并将其视为“活动”可能是好的 – 2014-03-11 19:47:24

+2

这适用于手动输入标记区域,但不适用于粘贴文本的情况。 :(Emacs 24/Ubuntu 14.04。 – mcandre 2014-07-23 21:36:56

8

默认方式做这样的事情是不完全优雅的以下内容:

  1. 让你想要的替换文本以某种方式进入杀戒(例如,Mw)。
  2. 突出显示要替换的区域。
  3. 删除它(C-w)。
  4. 将其替换为之前复制的区域(C-y,M-y)。这将用刚刚删除的文本(C-y)替换刚删除的内容,然后用缓冲区环中下一个最近保存的缓冲区(M-y)重新替换它。

如果你想用同样的文字做这10次,这将会成为一个真正的痛苦,因为每次删除一个区域时,所需的替换物会被推回到杀戒环中更远的位置,每次你想要抽取它时,你都必须打电话给M-w

我也刚刚发现M-x delete-region,这要感谢Emacs: how to delete text without kill ring?。正如问题所暗示的那样,这会删除违规文本而不会将其放入kill ring中,从而避免将替换文本进一步压入堆栈的问题。而且,如相关回复所述,您可以将其绑定到您选择的快捷键。

2

如果启用CUA模式,则此粘贴到选定区域将成为正常行为。

13

设置delete-selection-mode,正如迈克尔所说,似乎是最自然的方式来做到这一点。

但是,这不是我所做的:)相反,我把好东西放到一个“注册”中 - 例如注册“a” - 与C-x r x a。然后我杀死另一个副本,并将该寄存器复制到与C-x r g a相同的位置。

这很方便,因为查杀不会影响寄存器,所以C-x r g a总是插入好东西。

2

我做到这一点的方法是:

  • 去到你想要的新东西
  • 粘贴好东西,现在
  • 光标是新的东西,你想要得到的东西之间摆脱
  • 选择向前推,直到一切你想摆脱的选择
  • 删除

这是一个稍微不同的思考方式。粘贴你想要的东西,然后摆脱你不想要的东西,而不是用你所做的事替换你不想要的东西。