キー割り当てをテスト

 適当に関数を作ってからキー割り当てするときに何度も変えるのが面倒だったので。押したキーに割り当てられるテスト用のもの。.xyzzyなどの設定ファイルにキー割り当てがされるわけではない。設定が有効なのは設定してからxyzzyが終了するまで。再起動すれば、.xyzzyなどに書いてある通りのキー設定に戻る。それと二段階のキーマップは対応していない。

■具体的な使用方法
実行するとfunction name:とミニバッファに表示されるので、そこでキーを割り当てる関数名を選ぶ、履歴とか補完も普通のミニバッファの設定が適用される。次に、set-key :とミニバッファに表示されるので、割り当てたいキーを押す。

(defun tester-key-setting()
  (interactive)
  (let ((fun (read-function-name "function name :" :default :history))
		(setkey))
	(minibuffer-message "set-key :")
	(setq setkey (read-char ed:*keyboard*))
	(global-set-key setkey fun)
	(message "global set key ~S ~A" setkey fun)
	))

■どうでも良い話。
 interactiveは(interactive "a")で確かプロンプト呼び出せるんだけど、M-pで実行する時にエラーが出て面倒なので止めてみた。というかinteractiveのreferenceが変化していて、意味がよく分からなくなっていたので止めてみたというのが本当だけど。interactiveのreferenceは前の説明の方が使いやすかったと思う。特に使用例が載っていたのが良かった。今は具体的な使い方を忘れてしまっている自分としては、使い方が思い出せないし。Grepしても珍しいケースは余り使用されていないのでreferenceに乗っている方がありがたいと思った。

■触って思った妄想
 こういう感じで本当にキー設定ができるようにしても良いかもしれない。その場合は、割り当てるキーは押した後、このキー割り当てでいいかと聞くようにするとか、現在のキー割り当てを参照してから割り当てるのを決めれると便利かもしれない。後は、現在の.xyzzyなどに書かれているデフォルトのキー割り当てに戻すとか。そういう失敗する可能性も含めた対策が要りそう。今の場合は取り合えず割り当てるだけなので、要らない機能はない方が逆に早く設定できて良いかなぁと思うけど。

どうせやるならテキストでキーボード風に絵を書いて、カーソル位置のある位置のキー設定をするとか、そういうWindowsのキー割り当てソフトに良くあるような雰囲気にした方が一覧性が上がって良いかもしれないが。

■適当に一部妄想を具体化
一々確認する感じのも今適当にやってみた。apropsとかまでやるとWindowとかの分割の後始末が面倒なので微妙な雰囲気だけど。左下のステータスバーの所に現在のキー割り当てとかもでるかも。

(defun tester-key-setting()
  (interactive)
  (let* ((fun (read-function-name "function name :" :default :history))
		 (setkey))
	(minibuffer-prompt "set-key :")
	(loop (setq setkey (read-char ed:*keyboard*))
	  (describe-key-briefly setkey t)
	  (if (yes-or-no-p "set key ~S ?" setkey)
		  (return)))
	(global-set-key setkey fun)
	(message "global set key ~S ~A" setkey fun)
	))

■更に妄想を具体化したバージョン
処理後は一応Windowを一つにするように。変えてみたけど。・・・。元々分割して使う人だったらまた分割されるようにないといけないし。現在のWindowの仕様状況とかを調べるようにした方が良いのかな。まあ、極少数だと思うので、その辺は無かったことに。と思ったけど、やっぱりやってみた。apropsの所をインクリメンタルな奴にすれば、設定する時には少しでも情報がわかって良いかもしれない。

(defun tester-key-setting()
  (interactive) ;(interactive "a")でも良いけど、M-pでエラーが微妙だったので。
  (let* (fun setkey (cw (count-windows))) ;常時Window分割して使用している人のために一応カウント
	(loop (setq fun (read-function-name "function name :")) ;履歴とかつけるならここを適当に変更。
	  (command-apropos (format nil "~A" fun)) ;インクリメンタルのにするならここのを変える感じ。
	  (refresh-screen)
	  (if (yes-no-or-cancel-p "set ~S ?" fun)
		  (return))) ;関数とキーを決めた後でY/Nを選びたいならここと上の一行は消しても良い。
	(minibuffer-prompt "set-key :")
	(loop (setq setkey (read-char ed:*keyboard*))
	  (describe-key-briefly setkey t);ステータスバーの所に現在のキー割り当てを表示。
	  (if (yes-no-or-cancel-p "set key ~S ?" setkey);Y/Nのダイアログを出す。
		  (return)));Nならloop。Yならreturn
	(global-set-key setkey fun)
	(message "global set key ~S ~A" setkey fun);一応設定したキーと関数をステータスバーに表示
	(if (> (count-windows nil) cw)
		(delete-window));aproposで画面が増えた分を元に戻す感じ。
	))

■極めて個人的な使い方。
 いつもそのキーにその機能が割り当てられていても困るけど、今は良く使うので取り合えず何かのキーに割り当てておきたい場合とか。今だけ良く使うような適当に作ったようなlispを動かしたい場合とかに適当に割り当てるとか。他には、適当に作っているlispの動作確認をする時に、態々M-x hogehgoeとかM-p Enterとか面倒なので、適当な普段使わないキーに割り当てて何度も細かく動きを確認したりと化する。この個人的な使用法の場合はキーのテストとは違うので、一番上の書いたような単純で速いほうが使いやすい感じ。