インクリメンタルに行移動(その2)
C-gで元の位置に戻るようにしておいた。その方がC-sとかと動作が同じで感覚にあうかと。C-hで消して書き直すのが面倒な場合はもう一度igoto-lineを呼び出せば良い。例えばM-gにigoto-lineを書き換えているとすると、M-gして移動したけど、間違えてて、もう一度違う行に移動したい場合は、そこで更にM-gすれば消えて行移動になる。移動した所から一ページくらいずつ移動したい場合はC-vとかで其のまま抜けて移動も出来るので、移動系のを押せばいい。
;;インクリメンタルに行移動 (defun igoto-line() (interactive) (toggle-ime nil) (let ((input-number 0) (current-point (point))) (loop (minibuffer-prompt "iline to go:~A" (if (zerop input-number) "" input-number)) (refresh-screen) (let ((key (read-char *keyboard*))) (cond ((eq key #\C-h) (if (<= 10 input-number) (setq input-number (truncate (/ input-number 10))) (setq input-number 0))) ((eq key #\C-g) (goto-char current-point) (return)) ((digit-char-p key) (setq input-number (+ (* input-number 10) (digit-char-p key)))) (t (unread-char key) (return)))) (goto-line input-number)) ))