コードを書いていると、「さっきまでカーソルのあった場所に戻りたい」のような場面はけっこうあります。
そんな人のために、カーソル移動の履歴を残してくれる素敵なプラグイン「point-undo.el」もあります。
が。
僕には、暇なとき、ついカーソルを上下とか左右にぱたぱた動かす癖があります。するとこの履歴もすべて残ってしまうので、 point-undo が使い物になりません。困った。
せっかく拡張のできるエディタを使っているので、僕のような落ち着きのない人のための point-undo を作ってみました。
(require 'ring)
(require 'edmacro)
(defvar-local jump-back!--marker-ring nil)
(defun jump-back!--ring-update ()
(let ((marker (point-marker)))
(unless jump-back!--marker-ring
(setq jump-back!--marker-ring (make-ring 30)))
(ring-insert jump-back!--marker-ring marker)))
(run-with-idle-timer 1 t 'jump-back!--ring-update)
(defun jump-back! ()
(interactive)
(if (ring-empty-p jump-back!--marker-ring)
(error "No further undo information")
(let ((marker (ring-ref jump-back!--marker-ring 0))
(repeat-key (vector last-input-event)))
(ring-remove jump-back!--marker-ring 0)
(if (= (point-marker) marker)
(jump-back!)
(goto-char marker)
(message "(Type %s to repeat)" (edmacro-format-keys repeat-key))
(set-temporary-overlay-map
(let ((km (make-sparse-keymap)))
(define-key km repeat-key 'jump-back!)
km))))))
jump-back!
が肝心のコマンドなので、これをどこかにバインドしておくと便利です。
(global-set-key (kbd "M--") 'jump-back!)