「バッファの移動[C-x b]をインクリメンタルに」

 ついでに、インクリメンタルにバッファを移動するのを、作ってみようかなぁと思ったら、既にあったので、それを導入。iswitchb。個人的に作ろうと思っていたのは。エクスプローラとか(xyzzyのファイラとか)のインクリメンタルにファイルを移動するような、時間制限付いてる方が良いなぁと(決定するのが面倒だし。)思ったので、勝手に試みてみた。使ってみたら、意外と微妙。ファイル名を早く入力するのに慣れが要るかもしれない。それと、今見えているファイルがどのファイルなのか分かり難いのが難しい原因かも。あとIMEとか入ったらOFFになるようにしてmigemoとかないと日本語入力とか英語の区別の時点でもかなり厳しい。IMEはOFFにしてみた。migemoは面倒そうだったので止めた。しかし、やっぱりolt2のインクリメンタル移動の方が便利かもしれない。

一応メモ。Wikiの所にあるヤツのiswitchbの部分を之に差し替えると時間制限がついて、IMEがOFFになるかもしれない。2,3行付け加えただけだけど。

(defun iswitchb ()
 "バッファの切り替え"
 (interactive)
 (let ((buffer-list
		 (iswitchb-buffer-list-init-rotate
		  (iswitchb-buffer-list-init)
		  (buffer-name (other-buffer))))
		(input "")
		(pre-buffer (selected-buffer))
		(top-buffer (buffer-name (selected-buffer)))
		(buffer-list-grepd)
	    (c))
	(loop  ; iswitchb-mode ...
	  (setq buffer-list-grepd (iswitchb-list-grep buffer-list input))
	  (message "~S" buffer-list-grepd)
	  (when (< 0 (length buffer-list-grepd))
		(when (string/= top-buffer (car buffer-list-grepd))
		  (setq top-buffer (car buffer-list-grepd))
		  (switch-to-buffer top-buffer)))
	  (ed:minibuffer-prompt "iswitchb: ~A" input)
	  (toggle-ime nil)
	  (setq *repeat-time* (get-internal-real-time))
	  (setq c (read-char ed:*keyboard*))
	  (case c
		((#\C-g #\ESC)
		 (switch-to-buffer pre-buffer) (quit))
		((#\Left #\Up #\C-r #\Home #\PageDown) ; 'iswitchb-prev-match
		 (when (< 1 (length buffer-list-grepd))
		   (while (string= top-buffer (car (iswitchb-list-grep buffer-list input)))
			 (setq buffer-list (append (last buffer-list) (butlast buffer-list))))))
		((#\Right #\Down #\C-s #\End #\PageUp) ;'iswitchb-next-match
		 (when (< 1 (length buffer-list-grepd))
		   (while (string= top-buffer (car (iswitchb-list-grep buffer-list input)))
			 (setq buffer-list (append (cdr buffer-list) (list (car buffer-list)))))))
		((#\C-m #\RET) ;'iswitchb-exit-minibuffer
		 (return))
		((#\C-j)
		 (switch-to-buffer top-buffer))
		((#\C-a)
		 (setq input ""))
		((#\C-h)
		 (ignore-errors (setq input (substring input 0 -1))))
		((#\TAB)
		 (ignore-errors
		  (multiple-value-bind (result list prefix)
		      (*do-completion input :buffer-name)
		    (cond ((eq result :solo-match)
			   (return (switch-to-buffer top-buffer)))
			  ((stringp result)
			   (setf input result))))))
		(t
		 (if (< *repeat-time* (-(get-internal-real-time) 500))
			 (setq input (format nil "~A" c))
		   (setq input (format nil "~A~A" input c))))
		))))

何か中途半端なので思い切って、最後の所は

		 (when (< *repeat-time* (-(get-internal-real-time) 650))
		   (insert c)
		   (quit))
		 (setq input (format nil "~A~A" input c)))

これくらいの方が潔いかもしれない。ただC-x bで実行するには微妙なので、2段階にせず、もっと押しやすいキー一個とかが良いかも。