Edited at

[Emacs] 前回1秒以上立ち止まった場所にジャンプするコマンド

More than 3 years have passed since last update.

コードを書いていると、「さっきまでカーソルのあった場所に戻りたい」のような場面はけっこうあります。

そんな人のために、カーソル移動の履歴を残してくれる素敵なプラグイン「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!)