複数行のテキストを Emacs に貼り付けると、アトミックに挿入されます。ただし、元に戻すには、C-/(またはM-x undo⏎</kbd>) repeatedly, undoing one line at a time. Is it normal?
単一の貼り付け操作を元に戻すにはC-/?
ターミナルで Emacs を実行すると、ペーストは実際には Emacs ではなくターミナルに送られます。Emacs は端末からキーを 1 つずつ受け取ります。
いくつかの回避策がありますが、元に戻すほど簡単なものはありません。たとえば、 に貼り付けてから*scratch*
、そこから kill-n-yank します。または、貼り付ける前に を押しC-spaceます。その後、 を押すだけで元に戻すことができますC-w。
私は実際に、最後のセーブポイント以降のすべての変更を元に戻すカスタム 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))
)
)
うーん...最後のコマンドからの時間が非常に短い場合、pre-command-hook
最後を削除する a を使用することを提案しようとしていました。しかし、実行後undo-boundary
に元に戻す境界が追加されることがわかったので、それはオプションではありません。そのようなことが可能になるように (またはデフォルトで提供されるように) お願いしたいかもしれません。pre-command-hook
M-x report-emacs-bug
Mac OS ターミナルで Emacs を実行している場合は、次のソリューションが役立つ場合があります: https://stackoverflow.com/a/3963229/114833
これ(global-set-key [f5] 'undo);
をemacs設定ファイル(.emacs )に入れると、F5コマンドで貼り付けなどの最後の操作を元に戻すことができます。実際には、F5以外でも好きなようにキーを設定できます。