トップ 一覧 検索 ヘルプ 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 "\t" 'indent-line-function)
 (define-key test-mode-map [f1] 'test-mode-message)
 (define-key test-mode-map "a" 'test-mode-message)

1行目ではタブを押したときに行う処理を設定しているが、
タブに関する機能では以下を参照すると良い。
*[Mode-Specific Indent - GNU Emacs Lisp Reference Manual |http://www.gnu.org/s/emacs/manual/html_node/elisp/Mode_002dSpecific-Indent.html]([日本語訳|http://www.geocities.co.jp/SiliconValley-Bay/9285/ELISP-JA/elisp_505.html])


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

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

関数interactiveを含む関数はインタラクティブに呼び出すことができるようになる。
このように定義されているtest-modeでF1キーを押すと"test message"と表示される。
インデントを行う関数は整数(インデント数)を返す関数ならどのように定義しても構わない。
このように定義されている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 "\t" 'indent-line-function)
 (define-key test-mode-map [f1] 'test-mode-message)
 (define-key test-mode-map "a" 'test-mode-message)
 
 ;;F1を押したときに呼ばれる関数の定義
 ;;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)