シングルバッファ
編集を追跡し、編集が行われた場所に戻るかどうかは、編集の種類によって異なります。
編集で何かを追加した場合は、かなり単純な方法で元に戻すことができます:
(goto-char (car(cadr buffer-undo-list)))
削除した場合は、次の方法で元に戻すことができます。
(goto-char (abs (cdr(cadr buffer-undo-list))))
そして、ミニバッファーで削除したものを表示したいかもしれません:
(progn
(goto-char (abs (cdr(cadr buffer-undo-list))))
(message "DEL->: %s" (substring-no-properties (car(cadr buffer-undo-list)))))
要約:
(defun last-edit ()
"Go back to last add/delete edit"
(interactive)
(let* ((ubuf (cadr buffer-undo-list))
(beg (car ubuf))
(end (cdr ubuf)))
(cond
((integerp beg) (goto-char beg))
((stringp beg) (goto-char (abs end))
(message "DEL-> %s" (substring-no-properties beg)))
(t (message "No add/delete edit occurred")))))
読んC-h v buffer-undo-list
で、テキスト プロパティの設定など、それほど微妙でない編集のためにこれを統合することができます (本当に必要であると仮定します)。
マルチバッファ
変数を使用buffer-undo-list
してタスクを実行しました。バッファごとに個別のリストがあり、私の知る限り、グローバルな取り消しリストはありません。ほとんどの場合、何かを入力したバッファーを知っていて、Emacs に編集した場所に移動させたいと考えています。この場合、global-mark-ring
行ったバッファのシーケンスを記録する単一の変数があります。
コマンド Meta-Xpop-global-mark
または単に
Ctrl- X Ctrl-を連続して使用すると、Space以前にアクセスしたバッファー (およびマーク位置) に移動します。ターゲット バッファに到達したら、Meta- Xlast-edit
(またはバインドされたキー) をトリガーできます。