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))))))