【问题标题】:How to replace a region in emacs with yank buffer contents?如何用 yank 缓冲区内容替换 emacs 中的区域?
【发布时间】:2010-04-13 05:59:37
【问题描述】:

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

【问题讨论】:

  • 有类似的文本块(在你的代码中?),通常建议你需要一些重构,例如用包含“相似文本”的函数/方法调用替换相似的文本块。我做客这就是我从未真正错过 Emacs 中的“替换区域”功能的原因之一......
  • @slu 你如何重命名你提取的漂亮函数/方法?
  • @slu 这显然是想要用剪贴板替换选定区域的示例。您的第二个猜测答案在任何方面都没有建设性,并且表明希望通过编码实践来发信号而不是解决合理的问题。

标签: emacs


【解决方案1】:

将此添加到您的.emacs

(delete-selection-mode 1)

在区域处于活动状态时写入缓冲区的任何内容都会覆盖它,包括粘贴,但也只是简单地键入内容或按退格键

【讨论】:

  • 为什么不是默认的?
  • @mcb 可能与该区域直到最近才默认显示的原因相同;标准的 emacs 实践是(或者曾经是,也许)在您移动点时将标记保持在一个位置,并且除非您使用专门对其进行操作的命令,否则它们之间存在区域这一事实是无关紧要的。您不希望每次键入时都破坏该区域,并且有诸如exchange-point-and-mark 之类的命令可以跳转到您留下标记的位置。这些天我怀疑大多数人不会那样使用标记,所以总是显示该区域并将其视为“活跃”可能是可以的
  • 这在手动输入标记区域时有效,但在粘贴文本时无效。 :( Emacs 24 / Ubuntu 14.04.
  • @mcandre 两者都为我工作,在 24.3.1。如果该模式处于活动状态,则写入缓冲区的任何内容都应删除该区域
  • @MichaelMrozek 不知何故,它开始为我工作。 :) 哦,好吧。
【解决方案2】:

按照 Michael 的建议,设置 delete-selection-mode 似乎是最自然的方式。

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

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

【讨论】:

    【解决方案3】:

    执行此类操作的默认方式是不完全优雅的以下操作:

    1. 以某种方式(例如 M-w)将所需的替换文本放入杀伤环中。
    2. 突出显示要替换的区域。
    3. 删除它 (C-w)。
    4. 将其替换为先前复制的区域(C-yM-y)。这会将新删除的内容替换为您刚刚删除的完全相同的文本 (C-y),然后将其重新替换为缓冲区环中下一个最近保存的缓冲区 (M-y)。

    如果您想使用相同的文本执行此操作 10 次,这将变得非常痛苦,因为每次您删除一个区域时,所需的替换项都会被推到更远的位置,因此您必须每次你想拉它时,拨打M-w的次数越来越多。

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

    【讨论】:

      【解决方案4】:

      我这样做的方法是:

      • 去你想要新东西的地方
      • 粘贴好东西
      • 您的光标现在位于新内容和要删除的内容之间
      • 向前选择,直到您想要删除的所有内容都被选中
      • 删除它

      这是一种稍微不同的思考方式。粘贴你想要的,然后去掉你不想要的,而不是用你所做的替换你不想要的。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          使用delete-selection-mode,以便粘贴的文本替换活动区域。

          使用辅助选择,反复粘贴相同的文本,即使您交替选择要替换的新区域。

          http://www.emacswiki.org/emacs/SecondarySelection

          【讨论】:

          • 以便复制的文本替换区域。
          【解决方案7】:

          对于像我这样不想更改全局设置的人,我使用此功能和键绑定:

          (defun replace-yank(beg end)
            (interactive "r")
            (kill-region beg end)
            (yank 3))
          
          (global-set-key (kbd "C-S-y") 'replace-yank)
          

          我故意将选定的文本添加到杀戮环中,以防我以后想要它,然后将之前在环中的第一个内容拉出来。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-12
            • 2012-08-05
            • 1970-01-01
            • 1970-01-01
            • 2023-04-01
            • 2010-12-24
            • 1970-01-01
            • 2010-12-18
            相关资源
            最近更新 更多