キャレットの移動の秘密

 前から良く思っていることに、カーソル移動の方法がある。何かで調べてみればいいのかもしれないが調べていないので厳密な話じゃないけど、個人的な感覚ではカーソル移動と同じくらいインクリメンタルサーチで移動しているんじゃないかと言う気がすること。バッファ全体の移動は当然かもしれないが、むしろ、インクリメンタルサーチの方が近くの移動でも文字区切りなどが適用されない場合には速いような気がする。勿論インクリメンタルサーチは広域での移動の場合でも有用なので、そう考えると移動のかなりの割合でインクリメンタルサーチを使う。遠近両用だし。しかもC-s押すだけで実質移動モードみたいな状態になってくれる。
 つまり何が言いたいかって言うと。

前も書いたけど、この辺の話は何で自分がviのキーバインドが気に入らないかの理由としても一部該当する。

■最近思っていることは
C-s押すだけで移動状態になっていると書いたけれども、実際には移動状態になったのでそれを解除しないといけない。之が地味に面倒な気がする。扉みたいなもので、普段は別に扉を開け閉めしても気にならないが、扉だらけの部屋を移動する場合、扉の開閉が結構面倒というか、世の中には自動で開いて自動で閉るという自動扉なるものが存在する。インクリメンタルサーチも自動扉のように自動でドアノブをひねらなくてもあけてしまいたい。エクスプローラのファイル名指定に使うインクリメンタルサーとかxyzzyのファイラのインクリメンタルサーチはその点非常に優れてるような気がする。何となくああいうのが何とかテキストの場合でも使えないだろうかとか。思ってみたり。

試しに作ってみたインクリメンタルサーチもどき。案外それなりのも出来そうな気もしないでもない。

(defvar *repeat-time* nil)

(defvar *input-repeat-time* 500)

(defun close-door ()
  (interactive)
  (setq *repeat-time* (get-internal-real-time))
  (let ((curp (point))
		input str)
	(while (> *repeat-time* (- (get-internal-real-time) *input-repeat-time*))
		(setq input (read-char *keyboard*))
	  (cond ((equal #\C-g input )
			 (quit))
			((> *repeat-time* (- (get-internal-real-time) *input-repeat-time*))
			 (setq str (concat str (string input)))
			 (message "~A" str)
			 (unless (scan-buffer str :case-fold t )
			   (goto-char curp)))
			((< *repeat-time* (- (get-internal-real-time) *input-repeat-time*))
			 (if (eq (lookup-key-command input) 'self-insert-command)
				 (setq *last-command-char* input))
			 (command-execute (lookup-key-command input))
			 (return))
			)
	  (refresh-screen)
	  (setq *repeat-time* (get-internal-real-time))
	  )))

しかし、之ならもっと原始的に

(defun alphabet-mobile (&optional (arg nil))
  (interactive)
  (let ((curp (point))
		input)
	  (setq input *last-command-char*)
	  (cond ((equal #\C-g input )
			 (quit))
			(t
			 (message " ~A" input)
			 (setq input (string input))
			 (unless (scan-buffer input :no-dup t :case-fold t :reverse arg)
			   (goto-char curp))))))

(defvar *shift-mode-map* nil)
(unless *shift-mode-map*
  (setq *shift-mode-map* (make-sparse-keymap))
  (dolist (item '(#\A #\B #\C #\D #\E #\F #\G #\H #\I #\G #\J #\K #\L #\M #\N
				  #\O #\P #\Q #\R #\S #\T #\U #\V #\W #\X #\Y #\Z))
				(define-key *shift-mode-map* item 'alphabet-mobile))
  )

こういう風とかの方が良いかもしれない。
追記:後で試したら。シフトとかだけなら意外と良いかもしれない。特にLISPなら別に大文字とか殆ど使わないし。日本語では殆ど意味無いけど。

キーはもっと過激に

(unless *shift-mode-map*
  (setq *shift-mode-map* (make-sparse-keymap))
  (dolist (item '(#\A #\B #\C #\D #\E #\F #\G #\H #\I #\G #\J #\K #\L #\M #\N
				  #\O #\P #\Q #\R #\S #\T #\U #\V #\W #\X #\Y #\Z))
				(define-key *shift-mode-map* item 'alphabet-mobile-r))
  (dolist (item '(#\a #\b #\c #\d #\e #\f #\g #\h #\i #\g #\j #\k #\l #\m #\n
				  #\o #\p #\q #\r #\s #\t #\u #\v #\w #\x #\y #\z))
				(define-key *shift-mode-map* item 'alphabet-mobile))
  (define-key *shift-mode-map* #\C-g 'shift-mode)
  (define-key *shift-mode-map* #\, 'close-door))

こんなとか、どうかとか。あんまりviを皮肉ってるとコボコボに叩きのめされそうなのでこの辺で止めておこう。w

 ∧_∧      
 ( ・ω・)=つ≡つ   ボコボコにしてやんよ
 (っ ≡つ=つ    
 ./   ) ババババ
 ( / ̄∪