キーマップ
Type: Variable
Package: editor
File: keyboard.l
多分、入力された物理的なキーを論理的なキーに変換するためのものです。
この論理的なキーは、F13〜F24などのように存在しないキーに振り向けることが
出来ます。例えば、キートップのラベルに別の文字のラベルを貼り付けるような
ものだと思います。
・物理的なキーから論理的なキーへの変換
・ローカルキーマップに論理的なキーの設定があればコマンド実行
・グローバルキーマップに論理的なキーの設定があればコマンド実行
使用例:
;;; C-[ と ESC を別物にする
(setf (svref *kbd-translate-table* (char-code #\C-[)) #\F15)
(global-set-key #\F15 'xxxx)
;;; BSとCtrl-hを別物にする
(setf (svref *kbd-translate-table* (char-code #\C-h)) #\F13)
(global-set-key #\F13 'replace-dialog)
Type: Tips
| (global-set-key #\C-h 'replace-dialog) という設定を行うと、
| BS Key を押下した場合も、ダイアログが出てきます。
伝統的な仕様ですが、
(setf (svref *kbd-translate-table* (char-code #\C-h)) #\F13)
(global-set-key #\F13 'replace-dialog)
このようにすれば逃げられなくもないです。
SeeAlso: global-set-key
Type: Function
Arguments: copy-keymap MAP
Package: editor
File: keymap.l
キーマップのコピーを返します。
使用例:
;;; gresreg.lより
;;; query-replaceのキーマップをコピーして
;;; query-gresregのキーマップを作って、ちょっと修正する。
(unless *query-gresreg-map*
(setq *query-gresreg-map* (copy-keymap *query-replace-map*))
(define-key *query-gresreg-map* #\C-g '(throw . quit)))
Type: Function
Arguments: define-key KEYMAP KEY COMMAND
Package: editor
File: builtin.l
キーマップのキーにコマンドを割り当てます。
KEYMAP : キーマップ
KEY : 登録するキー
COMMAND : 実行するコマンド
使用例:
;;; Ctrl-X fのキー割り当てを変える
(define-key ctl-x-map #\f 'my-find-file)
=> t
;;; Esc-f のキー割り当てを変える
(define-key esc-map #\f 'my-find-file)
=> t
;;; Ctrl-C aのキー割り当てを変える
(define-key spec-map #\a 'my-find-file)
=> t
SeeAlso: undefine-key
Type: Function
Arguments: describe-key KEY
Package: editor
File: help.l
指定したキーにバインドされた関数と docstring を表示します。
Type: Function
Arguments: describe-key-briefly KEY &optional ARG
Package: editor
File: help.l
指定したキーにバインドされた関数を表示します。[C-x ?]
KEY : 検索するキー
ARG : 出力(表示)先をどこにするか
nil : ステータスバーに表示
non-nil : バッファに「キー (関数名)」のフォーマットで文字列を出力
SeeAlso: describe-key
Type: Function
Arguments: global-set-key KEY COMMAND
Package: editor
File: keymap.l
グローバルなキーマップにキーを登録します。
使用例:
(global-set-key #\C-r 'previous-page)
(global-set-key #\S-Left 'selection-backward-char)
(global-set-key #\S-C-Left 'selection-backward-word)
SeeAlso: global-unset-key
Type: Function
Arguments: global-unset-key KEY
Package: editor
File: keymap.l
グローバルなキーマップのキーの割り当てを解除します。
使用例:
;;; global-set-keyで割り当てたキーを解除してみる。
(global-set-key #\C-r 'previous-page)
=> t
(global-unset-key #\C-r)
=> t
SeeAlso: global-set-key
Type: Function
Arguments: local-unset-key KEY
Package: editor
File: keymap.l
ローカルキーマップのキー割り当てを解除します。
使用例:
;;; lisp-modeのTABのローカルキーマップを外す。
(lookup-key-command #\TAB)
=> lisp-indent-line
(local-unset-key #\TAB)
=> t
(lookup-key-command #\TAB)
=> self-insert-command
Type: Function
Arguments: make-keymap
Package: editor
File: builtin.l
空のキーマップを作成します。
Type: Function
Arguments: make-sparse-keymap
Package: editor
File: builtin.l
空のキーマップを作成します。
キー定義の数が少ない時に使うとメモリを節約できます。
使用例:
;;; lispmode.lより
(unless *lisp-mode-map*
(setq *lisp-mode-map* (make-sparse-keymap))
(define-key *lisp-mode-map* #\C-M-x 'eval-defun)
...
(define-key *lisp-mode-map* #\) 'lisp-electric-close))
SeeAlso: make-keymap
Type: Function
Arguments: set-extended-key-translate-table KEY C
Package: editor
File: keyboard.l
通常は同時押しができないキーを別のキーに振り向けるテーブルです。
| c-modeでシフトを押しながらTABを押した時に
| インデントしてもらおうと思ったんですが、
| #\TABを#\S-TABにしたらSHIFTは使えませんとのことで。
残念ながらまともな手段では Shift+Tab は使えません。が、まともでない手
段が用意されています。
(set-extended-key-translate-table exkey-S-tab #\F20)
このようにしておくと、Shift+Tab が押されたときに F20 が押されたふりをするので
(global-set-key #\F20 'foo)
とすればお望み通り(^^
exkey-... に指定できるのは以下の通り。
exkey-space
exkey-S-space
exkey-C-space
exkey-S-C-space
exkey-M-space
exkey-S-M-space
exkey-C-M-space
exkey-S-C-M-space
exkey-backspace
exkey-S-backspace
exkey-C-backspace
exkey-S-C-backspace
exkey-M-backspace
exkey-S-M-backspace
exkey-C-M-backspace
exkey-S-C-M-backspace
exkey-tab
exkey-S-tab
exkey-C-tab
exkey-S-C-tab
exkey-return
exkey-S-return
exkey-C-return
exkey-S-C-return
exkey-M-return
exkey-S-M-return
exkey-C-M-return
exkey-S-C-M-return
exkey-escape
exkey-S-escape
exkey-zenkaku
exkey-S-zenkaku
exkey-C-zenkaku
exkey-S-C-zenkaku
exkey-S-M-zenkaku
Type: Function
Arguments: set-function-bar-label CHAR LABEL
Package: editor
File: builtin.l
ファンクションバーのラベルを変更します。
CHAR : 各ファンクファンクションバーに対応したキャラクタ
LABEL : 表示するラベル
使用例
(global-set-key #\F3 'search-forward-again)
=> t
(set-function-bar-label #\F3 "次検索")
=> t
SeeAlso: set-number-of-function-bar-labels
Type: Function
Arguments: toggle-ime &optional ON-OR-OFF
Package: editor
File: builtin.l
IMEのON/OFFを制御します。
non-nil IMEをONにする
nil IMEをOFFにする
省略時 IMEをトグルする
Type: Function
Arguments: undefine-key KEYMAP KEY
Package: editor
File: keymap.l
キーマップのキーの割り当てを解除します。
KEYMAP : キーマップ
KEY : 削除するキー
使用例:
;;; C-lをfiler-reloadに割り当てて、解除してみる
(define-key filer-keymap #\C-l 'filer-reload)
=> t
(undefine-key filer-keymap #\C-l)
=> t
SeeAlso: define-key
Type: Function
Arguments: use-keymap KEYMAP &optional BUFFER
Package: editor
File: builtin.l
バッファが使用するキーマップを設定します。
KEYMAP : 使用するキーマップを指定します。
BUFFER : バッファを指定します。省略時はカレントバッファに適用されます。
使用例:
;;; lispmode.lより
(defun lisp-mode ()
(interactive)
(kill-all-local-variables)
(setq buffer-mode 'lisp-mode)
(setq mode-name "Lisp")
(use-keymap *lisp-mode-map*)
...
(run-hooks '*lisp-mode-hook*))
Type: Tips
#\aや#\C-bのように表現します。ただし、"'(),;`\| の9文字は、
lispの構文上の特別な意味があるので、それを抑制するために
'\'を前置します。
#\a ; a
#\; ; ;
#\C-b ; Ctrl+b
#\C-\; ; Ctrl+;
#\M-\; ; Alt+;
#\C-M-\; ; Ctrl+Alt+;
Ctrl、Alt、Shiftの同時押しも表現できます。C-、M-、S-の順番は何でも良いです。
#\C- ; Ctrl同時押し
#\S- ; Shift同時押し
#\C-S- ; Ctrl+Shift同時押し
#\M- ; Alt同時押し
#\M-C- ; Alt+Ctrl同時押し
#\M-S- ; Alt+Shift同時押し
#\M-C-S- ; Alt+Ctrl+Shift同時押し
キーによっては同時押しできるキーに制限があります。
例えばS-TABは普通のやり方ではできません。どうしてもやりたければ、
set-extended-key-translate-table を参照して下さい。
┌─────────────┬─────────────┐
│キー │同時押しできるキー │
│ ├─┬─┬─┬─┬─┬─┬─┤
│ │M │C │M │S │C │M │M │
│ │ │ │C │ │S │S │C │
│ │ │ │ │ │ │ │S │
├─────────────┼─┼─┼─┼─┼─┼─┼─┤
│ !"#$%&'()*+,-./ │○│○│○│X│X│X│X│
│0123456789:;<=>? │ │ │ │ │ │ │ │
│@ABCDEFGHIJKLMNO │ │ │ │ │ │ │ │
│PQRSTUVWXYZ[\]^_ │ │ │ │ │ │ │ │
│`abcdefghijklmno │ │ │ │ │ │ │ │
│pqrstuvwxyz{|}~ │ │ │ │ │ │ │ │
├─────────────┼─┼─┼─┼─┼─┼─┼─┤
│SPC スペースキー │○│○│X│X│X│X│X│
├─────────────┼─┼─┼─┼─┼─┼─┼─┤
│TAB Tabキー │○│X│X│X│X│X│X│
│LFD │ │ │ │ │ │ │ │
│RET Enterキー │ │ │ │ │ │ │ │
│ESC Escキー │ │ │ │ │ │ │ │
│DEL │ │ │ │ │ │ │ │
│NUL │ │ │ │ │ │ │ │
├─────────────┼─┼─┼─┼─┼─┼─┼─┤
│PageUp Page Upキー │○│○│○│○│○│○│○│
│PageDown Page Downキー │ │ │ │ │ │ │ │
│End Endキー │ │ │ │ │ │ │ │
│Home Homeキー │ │ │ │ │ │ │ │
│Left ←キー │ │ │ │ │ │ │ │
│Up ↑キー │ │ │ │ │ │ │ │
│Right →キー │ │ │ │ │ │ │ │
│Down ↓キー │ │ │ │ │ │ │ │
│Pause Pauseキー │ │ │ │ │ │ │ │
│Scroll ScrollLockキー │ │ │ │ │ │ │ │
│Apps Applicationキー │ │ │ │ │ │ │ │
│Insert Insertキー │ │ │ │ │ │ │ │
│Delete Deleteキー │ │ │ │ │ │ │ │
│Help どのキー? │ │ │ │ │ │ │ │
│F1〜F24 F1〜F24キー │ │ │ │ │ │ │ │
│LBtnDown 左ボタン押し │ │ │ │ │ │ │ │
│LBtnUp 左ボタン離し │ │ │ │ │ │ │ │
│LBtnMove 左ボタンドラッグ│ │ │ │ │ │ │ │
│RBtnDown 右ボタン押し │ │ │ │ │ │ │ │
│RBtnUp 右ボタン離し │ │ │ │ │ │ │ │
│RBtnMove 右ボタンドラッグ│ │ │ │ │ │ │ │
│MBtnDown 中ボタン押し │ │ │ │ │ │ │ │
│MBtnUp 中ボタン離し │ │ │ │ │ │ │ │
│MBtnMove 中ボタンドラッグ│ │ │ │ │ │ │ │
│XBtn1Down │ │ │ │ │ │ │ │
│XBtn1Up │ │ │ │ │ │ │ │
│XBtn1Move │ │ │ │ │ │ │ │
│XBtn2Down │ │ │ │ │ │ │ │
│XBtn2Up │ │ │ │ │ │ │ │
│XBtn2Move │ │ │ │ │ │ │ │
│MouseMove │ │ │ │ │ │ │ │
└─────────────┴─┴─┴─┴─┴─┴─┴─┘
例えば、RETとC-mは内部的には同じキーと見なされます。このようなキーは以下
のとおりです。
TAB ; #\C-i
LFD ; #\C-j
RET ; #\C-m
ESC ; #\C-[
DEL ; #\C-?
NUL ; #\C-@
#\C-SPC ; #\C-@
SeeAlso: global-set-key
SeeAlso: define-key
Type: Tips
プログラム言語毎(というか、モード毎)にキーマップを変更することができます。
;;; 言語用キーマップ一覧
*basic-mode-map* ; BASIC用
*csharp-mode-map* ; C#用
*c-mode-map* ; C言語用
*c++-mode-map* ; C++用
*css-mode-map* ; CSS用
*html-mode-map* ; HTML用
*idl-mode-map* ; IDL用
*java-mode-map* ; java用
*LaTeX-mode-map* ; LaTeX用
*lisp-mode-map* ; lisp用
*pascal-mode-map* ; PASCAL用
*perl-mode-map* ; Perl用
*sql-mode-map* ; SQL用
;;; その他キーマップ一覧
*box-drawings-mode-map* ; 罫線描画モード用
*buffer-menu-mode-map* ; buffer-menu用
*calc-mode-map* ; calc用
*calendar-mode-map* ; calendar用
*den8-view-mode-map* ; 電信八号のメール表示用
*den8-summary-mode-map* ; 電信八号のメール一覧表示用
*den8-draft-mode-map* ; 電信八号の下書き用
*diff-mode-map* ; diff用
*async-grep-mode-map* ; 非同期grep用
*lisp-interaction-mode-map* ; *scratch*というかlisp-interaction-mode用
*fundamental-mode-map* ; モードが無いとき用
*log-summary-mode-map* ; niftyのログ一覧用
*log-article-mode-map* ; niftyのログ用
*command-output-mode-map* ; 外部コマンド実行時用
*shell-mode-map* ; shellモード用
*tail-f-mode-map* ; tail-f用
*text-mode-map* ; テキスト用
*view-mode-map* ; テキスト表示用
使用例:
;;; c++-modeでのキー割り当てを変える
(define-key ed::*c++-mode-map* #\C-s 'foo)
;;; lisp-modeでのキー割り当てを変える
(define-key ed::*lisp-mode-map* #\TAB 'lisp-complete-symbol)
;;; Lispインタラクションモードでのキー割り当てを変える
(define-key ed::*lisp-interaction-mode-map* #\TAB 'lisp-complete-symbol)
SeeAlso: define-key