使用Terminal.app时撤消外部粘贴

时间:2012-11-14 10:37:28

标签: macos emacs emacs24

我将多行文字粘贴到Emacs中,并以原子方式插入。但是,要撤消它,您必须反复按 C - / (或 Mx 撤消 ),撤消一次一行。这是正常的吗?

如何使用单个 C - / 撤消粘贴操作?

5 个答案:

答案 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之外,您可以随意设置密钥。