我将多行文字粘贴到Emacs中,并以原子方式插入。但是,要撤消它,您必须反复按 C - / (或 Mx 撤消 ⏎),撤消一次一行。这是正常的吗?
如何使用单个 C - / 撤消粘贴操作?
答案 0 :(得分:3)
在终端中运行Emacs时,粘贴确实会转到终端,而不是Emacs。 Emacs从终端逐个接收密钥。
有一些解决方法,但没有一个像撤消一样简单:例如,粘贴到*scratch*
,然后从那里杀死n-yank。或者,在粘贴之前,按 C-space 。然后只需按 C-w 即可撤消。
答案 1 :(得分:2)
我实际上有一些自定义的elisp我使用它撤消自上一个保存点以来的所有修改。如果你经常保存(我这样做),这就提供了一个很好的逻辑撤销能力。假设您在粘贴块之前保存了缓冲区,这将删除整个粘贴。 (注意,它适用于多个保存点,这意味着您可以在撤消历史记录中一次撤消保存点。)
(defun undo-last-modification ()
"Undo all changes since last save point in the buffer."
(interactive)
(let* ((repeat-undo (eq last-command 'undo))
(cur-undo-list (if repeat-undo pending-undo-list buffer-undo-list))
(head (car-safe cur-undo-list))
(tail (cdr-safe cur-undo-list))
(found-next-mod nil)
(num-undos 0))
;; when in the midst of undoing, the first nil gets chopped off the list,
;; so add one if the list doesn't start with nil
(if head (setq num-undos (1+ num-undos)))
;; search for next save point in the undo list
(while (not found-next-mod)
(if (not head)
(setq num-undos (1+ num-undos))
(if (and (listp head) (eq (car-safe head) t))
(setq found-next-mod t)))
(if tail
(progn
(setq head (car-safe tail))
(setq tail (cdr-safe tail)))
;; end of list
(setq found-next-mod t))
)
(if (> num-undos 0)
(undo num-undos))
)
)
答案 2 :(得分:1)
如果您在Mac OS终端上运行Emacs,此解决方案可能会有所帮助:https://stackoverflow.com/a/3963229/114833
答案 3 :(得分:1)
嗯......如果自上次命令以来的时间非常短,我打算建议使用pre-command-hook
删除最后undo-boundary
。但我发现在运行pre-command-hook
之后添加了的撤消边界,所以这不是一个选项。您可能希望M-x report-emacs-bug
,要求使这样的事情成为可能(甚至默认提供)。
答案 4 :(得分:0)
您可以将此(global-set-key [f5] 'undo);
放入您的emacs配置文件,即 .emacs ,然后F5命令将帮助您撤消上一次操作,包括粘贴。实际上,除了F5之外,您可以随意设置密钥。