[emacs] 二分移動

二分移動コマンドを書いてみました。行内を二分探索の要領で移動します。


ctrl+U ctrl+U ctrl+U ctrl+Fとかよく打つ人にお勧めです。


defvarとか使い方よくわかってないのでまずいところあったら教えてくださると嬉しいです。


D

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 二分移動
(defvar binary-move-fence-beginning nil)
(defvar binary-move-fence-end nil)
(defvar binary-move-overlay nil)

(defun binary-move-set-overlay ()
  (if binary-move-overlay
      (move-overlay binary-move-overlay 
                    binary-move-fence-beginning binary-move-fence-end
                    (current-buffer))
    (progn
      (setq binary-move-overlay
            (make-overlay binary-move-fence-beginning 
                          binary-move-fence-end))
      (make-face 'binary-move-face)
      (set-face-background 'binary-move-face "LightSteelBlue1")
    )
    (overlay-put binary-move-overlay 'face 'binary-move-face))
  )

(defun binary-move-forward (arg)
  (interactive "p")
  (while (save-excursion (beginning-of-line) (looking-at "[ \t]*$"))
    (next-line))
  (dotimes (i arg)
    (if (or
         (eq last-command 'binary-move-forward)
         (eq last-command 'binary-move-backward))
        (setq binary-move-fence-beginning (point))
      (progn
        (setq binary-move-fence-beginning (point))
        (setq binary-move-fence-end (line-end-position))))
    (binary-move-set-overlay)
    (goto-char (/ (+ binary-move-fence-beginning 
                     binary-move-fence-end) 2))
    (if (= (1- arg) i) (sit-for 1.0))
    (move-overlay binary-move-overlay (point) (point))
    ))

(defun binary-move-backward (arg)
  (interactive "p")
  (while (save-excursion (beginning-of-line) (looking-at "[ \t]*$"))
    (previous-line)
    (end-of-line))
  (dotimes (i arg)
    (if (or
         (eq last-command 'binary-move-forward)
         (eq last-command 'binary-move-backward))
        (setq binary-move-fence-end (point))
      (progn
        (setq binary-move-fence-beginning (line-beginning-position))
        (setq binary-move-fence-end (point))))
    (binary-move-set-overlay)
    (goto-char (/ (+ binary-move-fence-beginning 
                     binary-move-fence-end) 2))
    (if (= (1- arg) i) (sit-for 1.0))
    (move-overlay binary-move-overlay (point) (point))
    ))

(global-set-key [?\C-\M-,]  'binary-move-backward)
(global-set-key [?\C-\M-.]  'binary-move-forward)