トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

キーバインド

キーバインド

Emacsではキーが押されたときに行う動作を全て設定・変更できる。一般的にエディタではAのキーを押したらaが入力されるがEmacsではこの動作も変更することができる。例えばディレクトリ操作を行うDiredモードでは全く違うキーバインドになっている。

キーバインドの作成例

キーマップの定義

以下のようにしてキーマップを作成する。

(defvar test-mode-map nil)
(setq test-mode-map (make-sparse-keymap))

キーに対応する関数の設定

設定にはdefine-key関数を使う。第二引数はキーを押したときの処理を行う関数のシンボルにする。次の例ではキーボードのaを押したときにtest-mode-message関数が呼ばれるように設定している。

(define-key test-mode-map "a" 'test-mode-message)

設定される関数について

普通にdefunを用いて宣言し、インタラクティブに呼び出されるようにしておけば問題ない。意味のない例であるが、例えば上記例で設定されている関数test-mode-messageが以下のように宣言されているとする。

(defun test-mode-message ()
 (interactive)
 (message "test message"))

関数interactiveを含む関数はインタラクティブに呼び出すことができるようになる。このように定義されているtest-modeでaキーを押すと"test message"と表示される。

キーマップの登録

作成したキーマップを使うにはuse-local-map関数を使う。

(use-local-map test-mode-map)

test-modeに組み込んだ場合の例

Emacsモード作成手順で作成したtest-modeで上記のキーマップを使うには以下のようにする。

(defvar test-mode-map nil)
(setq test-mode-map (make-sparse-keymap))

 ;;キーと関数の関連付け
(define-key test-mode-map "a" 'test-mode-message)

;;aを押したときに呼ばれる関数の定義
(defun test-mode-message ()
 (interactive)
 (message "test message"))

;;entry point
(defun test-mode ()
  "Test Mode "
  (interactive)
  (kill-all-local-variables)
  (setq mode-name "Test")
  (setq major-mode 'test-mode)
  
  ;;キーマップの登録
  (use-local-map test-mode-map)
  (run-hooks 'test-mode-hook))
 
(provide 'test-mode)