LoginSignup
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-12

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16