M-x list-function で、カレントバッファに定義されている関数の一覧ダイヤログを作成する。 選択して OK すると、そこにジャンプしてくれる。
M-x control-code-dialog-box で、制御コードをダイヤログから選択し、入力することができる。 使ったことないけど。
[xyzzy:04501](川崎 真さん), [xyzzy:04503](山本 泰三さん)が、そのままでは動かなかったので、 動かしてみた。こんなで良いのか解からないが、結構便利でうれしい。
C-F7 に割り当てている。
;; アプリケーションランチャのリスト (defvar *launch-application-list* (list '(" CALC" . "C:/WINDOWS/CALC.EXE") '(" Explorer" . "C:/WINDOWS/EXPLORER.EXE") )) ;; アプリケーションランチャ (defun application-launcher-dialog () (interactive) (multiple-value-bind (result data) (dialog-box '(dialog 0 0 219 100 (:caption "Application Launcher") (:font 9 "MS Pゴシック") (:control (:listbox list nil #x50b10111 7 7 150 82) (:button IDOK "じっこ" #x50010001 162 7 50 14) (:button IDCANCEL "やめ" #x50010000 162 24 50 14))) (list (cons 'list *launch-application-list*)) nil) (when result (let ((cmd (cddr (assoc 'list data)))) (if cmd (call-process (map-slash-to-backslash cmd) :wait nil) (message "なにもえらんでない。")))))) (global-set-key #\C-F7 'application-launcher-dialog) (set-function-bar-label #\C-F7 "ExtApp")
C-] で送る。「送る」はバッファバーメニューからしていたが、こっちのほうがいいかも。
;; バッファから送るのリスト (defvar *buffer-send-to-list* (list '(" Internet Explorer" . "C:/Program Files/Internet Explorer/IEXPLORE.EXE") '(" Phoenix" . "C:/usr/local/phoenix/phoenix.exe") '(" Mozilla" . "C:/usr/local/Mozilla/mozilla.exe") '(" Opera" . "C:/usr/local/Opera/Opera.exe") '(" a2pr" . "C:/usr/local/a2pr/a2pr.exe") )) ;; バッファから送る (defun buffer-sendto-dialog () (interactive) (let ((file (get-buffer-file-name))) (when file (multiple-value-bind (result data) (dialog-box '(dialog 0 0 219 100 (:caption "送っちゃうよ") (:font 9 "MS Pゴシック") (:control (:listbox list nil #x50b10111 7 7 150 82) (:button IDOK "送る" #x50010001 162 7 50 14) (:button IDCANCEL "送らない" #x50010000 162 24 50 14))) (list (cons 'list *buffer-send-to-list*)) nil) (when result (let ((cmd (cddr (assoc 'list data)))) (if cmd (call-process (map-slash-to-backslash (concat cmd " " file)) :wait nil) (message "なにもえらんでない。")))))))) (global-set-key #\C-] 'buffer-sendto-dialog)
C-F8 で起動。引数を指定して実行する場合は、(lambda () (interactive) (関数 引数))
と指定すればよいみたい。
;; Lisp Application ランチャのリスト (defvar *lisp-app-list* (list '(" www-mode" . www) '(" KaMail" . kamail) '(" 2ch" . 2ch) '(" diary" . diary) '(" shell" . shell) '(" circ" . circ) '(" tterm" . tterm) '(" cFTP" . cftp) )) ;; Lisp Application ランチャ (defun lisp-app-dialog () (interactive) (multiple-value-bind (result data) (dialog-box '(dialog 0 0 219 100 (:caption "Lisp Applications") (:font 9 "MS Pゴシック") (:control (:listbox list nil #x50b10111 7 7 150 82) (:button IDOK "じっこ" #x50010001 162 7 50 14) (:button IDCANCEL "やめ" #x50010000 162 24 50 14))) (list (cons 'list *lisp-app-list*)) nil) (when result (let ((func (cddr (assoc 'list data)))) (funcall func))))) (global-set-key #\C-F8 'lisp-app-dialog) (set-function-bar-label #\C-F8 "LispApp")
関数 popup-list は、リファレンスに解かりやすいサンプルがついている。文字列を insert する場合は、refresh-screen をしてやらないといけないらしい。
KaMail のドラフトバッファで、よく使うアドレスをポップアップリストから選択して挿入(C-,)してみた。 (KaMail のアドレスリストに、700 程のアドレスを登録したら、 「メニュー項目が多すぎます」と(たまに)怒られてしまい、困っているため、 こんなことをして一時凌ぎしている...。)
;; よく使うアドレス (setq *favorite-mailaddr-list* '( "あどれすA <adr_a@domain.a>" "あどれすB <adr_b@domain.b>" )) ;; よく使うアドレスをリストから入力 (C-,) (defun insert-mailaddr-simplicity () (interactive) (popup-list *favorite-mailaddr-list* #'(lambda (adr) (insert adr) (refresh-screen)))) (define-key *kamail-draft-map* '#\C-\, 'insert-mailaddr-simplicity)