keyconf.l

こんなんができた。
ライブラリを作るときに使う。
利点としては、

  • 設定ファイルが見易くなる
  • キーバインドしたい関数を全部exportしなくてもよくなる

とか?

不具合やら不都合やらは、まだまださっぱりです。
なにせまだまだ単純なxyzzy lispしか書いてないもので。

こんな感じで使う。

(require "keyconf")
(require "ruby")

(in-package "editor")
(export '(ruby-keyconfig))

(keyconf::define
 ruby-keyconfig
 ((:run          ruby-run-for-current-script)
  (:syntax       ruby-run-syntax-check-for-current-script)
  (:rdefs        ruby-run-rdefs-for-current-script)
  (:rdefs-c      ruby-run-rdefs-about-class-for-current-script)
  (:rdefs-toggle ruby-rdefs-lineno-toggle)
  (:rake         ruby-run-rake-on-current-directory)
  (:rake-target  ruby-run-rake-on-current-directory-with-target))
 (lambda (cmd key)
   (define-key *ruby-mode-map* key cmd)))

設定する側ではこう。

(ruby-keyconfig
 '((:run          #\F5)
   (:syntax       #\C-c #\c)
   (:rdefs        #\C-c #\d)
   (:rdefs-c      #\C-c #\D)
   (:rdefs-toggle #\C-c #\C-d)
   (:rake         #\C-c #\r)
   (:rake-target  #\C-c #\C-r)))


ソースはこれ。

;;; -*- Mode: Lisp; Package: KEYCONF -*-
;;;
;;; This file is not part of xyzzy.
;;;
#|
Copyright (c) 2009 arikui <http://d.hatena.ne.jp/arikui/>
All rights reserved.

Distbutes under the modified BSD lisence.
|#

(provide "keyconf")
(eval-when (:compile-toplevel :load-toplevel :execute)
  (unless (find-package "keyconf") (defpackage "keyconf")))
(in-package "keyconf")

(defvar *command-tables-table* (make-hash-table :test 'eql))

(defun get-command-table (name)
  (let ((place (gethash name *command-tables-table*)))
    (unless place (setf place (make-hash-table)))
    place))

(defmacro define (name assocs key-binder)
  `(let ((cmds   (get-command-table ',name))
	 (mapper ,key-binder))
     (dolist (pair (quote ,assocs))
       (setf (gethash (first pair) cmds) (second pair)))
     (defun ,name (alist)
       (dolist (pair alist)
	 (funcall mapper (gethash (car pair) cmds) (cdr pair))))))