当我使用VIM或大多数无模式编辑器(如Eclipse、NetBeans等)时,经常会做如下操作。如果我有相似的文本块,并且需要将它们全部更改,我会更改其中一个,复制它(或使用非删除yank),选择下一个需要更改的块,并将更改后的版本粘贴到其上。如果我在emacs中执行相同的操作(选择区域并使用C-y粘贴),它不会替换区域,而只是在光标位置粘贴。在emacs中如何做到这一点?
当我使用VIM或大多数无模式编辑器(如Eclipse、NetBeans等)时,经常会做如下操作。如果我有相似的文本块,并且需要将它们全部更改,我会更改其中一个,复制它(或使用非删除yank),选择下一个需要更改的块,并将更改后的版本粘贴到其上。如果我在emacs中执行相同的操作(选择区域并使用C-y粘贴),它不会替换区域,而只是在光标位置粘贴。在emacs中如何做到这一点?
将以下代码添加到您的.emacs
文件中:
(delete-selection-mode 1)
只要在区域处于激活状态时写入缓冲区的任何内容都会覆盖它,包括粘贴,但也包括简单的输入或击退操作。
exchange-point-and-mark
这样的命令可以跳转到您放置标记的位置。现在我怀疑大多数人不会以这种方式使用标记,因此始终显示该区域并将其视为“活动”可能是可以接受的。 - Michael Mrozekx-clipboard-yank
,因为它更舒适(带有一些其他设置 - 我完全分离了 kill ring 和 clipboard)。所以,问题似乎是 x-clipboard-yank
没有按照需要工作... - Hi-Angelx-cliboard-yank
也无法替换选择。 (defun x-clipboard-yank-fixed () (interactive) (when mark-active (kill-region (region-beginning) (region-end))) (x-clipboard-yank))
- Hi-Angel如Michael所建议的那样,设置delete-selection-mode
似乎是最自然的方法。
但是,这不是我的做法 :) 相反,我将好的内容放入一个“寄存器”中——例如,寄存器“a”——使用C-x r x a
。 然后我杀掉另一个副本,并使用C-x r g a
将寄存器复制到同一位置。
这很方便,因为杀死不会影响寄存器,因此C-x r g a
始终插入好的内容。
我刚刚发现了M-x delete-region
,感谢Emacs:如何在不使用kill ring的情况下删除文本?。正如问题所暗示的那样,这将删除有问题的文本而不将其放入kill ring中,避免了将替换文本推到堆栈底部的问题。而且,正如相关回答所提到的,您可以将其绑定到您选择的快捷键上。
如果有人不想像我一样更改全局设置,可以使用以下函数和按键绑定:
(defun replace-yank(beg end)
(interactive "r")
(kill-region beg end)
(yank 3))
(global-set-key (kbd "C-S-y") 'replace-yank)
我会将所选文本添加到kill ring中,以便以后使用,并且会取出先前在ring中的内容。
使用delete-selection-mode
,使粘贴的文本替换活动区域。
使用次要选择,即使您交替选择新区域以替换,也可以反复粘贴相同的文本。
(defun replace-yank(beg end)
(interactive "r")
(delete-region beg end)
(yank 1))
(global-set-key (kbd "C-S-y") 'replace-yank)
一个优点是可以重复进行上述操作。