インクリメンタルに行移動(その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))
	))