| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
キーは対話的に割り当てることもできるし、 `.emacs' ファイルであらかじめ割り当てることもできます。 対話的にすべてのモードでキー割り当てが使えるようにするには 次のように入力してください。
M-x global-set-key RET key cmd RET
現在のメジャーモードでのみ割り当てたいときは次のように入力してください。
M-x local-set-key RET key cmd RET
詳しくは See Info file `emacs', node `Key Bindings' を参照してください。
キーを割り当てるための lisp コードを `.emacs' に書きこむには 次の様にすると簡単にできます。 まず対話的にキーを割り当てます。 直後に C-x ESC ESC C-a C-k C-g と入力します。 これでキー割り当てのための Lisp コードがキルリングにセーブされるので `.emacs' にペーストすることができます。 グローバルに割り当てるときはそのままで構いません。 たとえば次のコードは直接 `.emacs' に書き込めます。
(global-set-key (quote [f1]) (quote help-for-help)) |
特定のモードでキーを割り当てるときは add-hook を使ってください。
たとえば tex-mode でローカルに割り当てるときは次のようにします。
(add-hook 'tex-mode-hook (lambda () (local-set-key (quote [f1]) (quote help-for-help)))) |
(global-unset-key [?\e ?{]) ;; または
(local-unset-key [?\e ?{])
|
(global-set-key [f10] [?\C-x?\e?\e?\C-a?\C-k?\C-g]) ;; または (global-set-key [f10] "\C-x\e\e\C-a\C-k\C-g") |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
大抵は以下の二つの場合のいずれかでしょう。 一つ目の場合として、キー入力列中のの制御文字の記述が 間違っているということがあります。 (例えば Lisp 式の中で `\C-f' ではなく、 `C-f' が使われている場合) もう一つの場合として、割り当てようとしているキー入力列のプレフィクス キーがすでに完全なキー入力列として割り当てられているということがあります。 歴史的経緯で `ESC [' をプレフィクスキーにすると問題がありました。 このときはキー入力列を割り当てる前に次の式を評価してください。
(global-unset-key [?\e ?[]) ;; または (global-unset-key "\e[") |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
起動時に Emacs は与えられたコードまたはファイルの順番に従って自分自身を 初期化しようとします。端末やウィンドウの設定の初期化が実行される まで有効にならないコードが書かれているとこの問題が発生します。 (この順番は起動後にはあまり問題になりません)
端末・ウィンドウシステムの設定の初期化が実行されてから Lisp コードを
実行させるには、あなたが実行したいと思っているコードを ラムダ式 にして
変数 term-setup-hook まはた window-setup-hook の値に
追加してください。たとえば次の様にします。
(add-hook 'term-setup-hook
(lambda ()
(when (string-match "\\`vt220" (or (getenv "TERM") ""))
;; vt220 の "Do" キーを M-x と同じにする
(global-set-key [do] 'execute-extended-command))))
|
Emacs が起動時に何をするのかを知るためには `lisp/startup.el' を見てください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacs 19 以降ではファンクションキーは他のキーと同様に利用できます。 10.1 キー(ファンクションキーを含む)にコマンドを割り当てる方法は? 参照。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
C-h c と入力してからファンクションキーやカーソルキーを押してください。 ファンクションキーのシンボルか文字列を表示します。 (詳細はオンラインマニュアル参照) 他のキーに対しても使えます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacs は標準では Xt ライブラリを使って書かれてはいないので、 "キーの読み替え" はできません。 (Xt ライブラリを使ってコンパイルした Emacs での キーの読み替えについて知っていたら教えてください)
Emacs にそう言った挙動をさせるには
(Emacs の外で) xmodmap を使うか、
(Emacs の中で) define-key を使ってください。
関数 define-key は変数 function-key-map と合わせて使ってください。
たとえば次の式は M-TAB というキー入力列を定義します。
(define-key function-key-map [M-TAB] [?\M-\t]) |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
C-s と C-q は XON/XOFF のフロー制御に使われているので Emacs は混乱します。それは Emacs が標準で C-s と C-q に コマンドを割り当てているからです。 Emacs はこれらをフロー制御文字として認識せず、 出力のバッファを埋め尽くすかも知れません。 時に XON/XOFF フロー制御をするソフトは Emacs から C-s と C-q を見えないようにしているかも知れません。
解決方法:
フロー制御の原因を特定します。
あなたの使っている端末はすべてのキャラクタを表示する時間を 取るために XON/XOFF フロー制御をしているかも知れません。 たとえば VT 端末がこれをしています。 セットアッップメニューを使えばこれを無効にできるかも知れません。 これはいくつかの PC のターミナルエミュレータにも使えます。
端末のフロー制御を無効にすると、 もう一端のフロー制御も無効にしなければなりません。 それはログインしたコンピュータかも知れませんし、 端末サーバかも知れません。
フロー制御を無効にするとキャラクタが失われる可能性があります。 端末につながっているプリンタは誤動作するかも知れません。 これを回避するには、端末の `termcap' エントリを修正して ヌルキャラクタで埋めてください。
電話回線で接続しているなら、モデムが XON/XOFF フロー制御をしています。 これを回避する方法は明らかになっていません。
端末とコンピュータをつなぐ装置が XON/XOFF フロー制御をしている場合が あります。他のフロー制御に切り替える事ができるかも知れません。 近くにいるネットワークに詳しい人に尋ねてみてください。
tty, pty デバイス
Emacs が動いているマシンまでの接続が
いくつかの tty, pty を通っている場合は、
必要もないのに XON/XOFF フロー制御をしている場合があります。
Eirik Fuller は次の様に書いています。
rlogin(とtelnet)のいくつかのバージョンは フロー制御文字を接続しているリモートシステムに渡さないんだ。 そのようなシステムでは、 リモートシステム上の Emacs はフロー制御を抑制できない。 `rlogin -8' で回避できることもある。これを直す一つの方法はローカルホスト(
rloginを実行しているマシン。rlogindを実行している方ではない)でrloginを 実行する前にsttyコマンドを使ってフロー制御を抑制することだ。 多くのシステムでは `stty start u stop u' で良いだろう。
tcshを使っている場合、 バージョンによってはこれもうまくいかないかも知れない。 これを回避するにはrloginする前に別のシェルを起動し、 そのシェルからsttyコマンドを使ってフロー制御を抑制することだ。
システムによっては `stty start u stop u' の 代わりに `stty -ixon' を使う必要があります。
次の式を評価すると Emacs は無条件に C-s と C-q を フロー制御文字として扱うようになります。
(enable-flow-control) |
端末によって設定を変える場合は次の様にしてください。 (`vt100' や `h19' は実際の端末名に置き換えてください。)
(enable-flow-control-on "vt100" "h19") |
これらのコマンドは自動的に C-s と C-q を
C-\ と C-^ に入れ替えます。
変数 flow-control-c-s-replacement と
flow-control-c-q-replacement で交換用のキーを変更できます。
個人で対処する場合は `.emacs' に記述してください。 サイトで対処する場合は `site-lisp/site-start.el' に 記述するのが良いでしょう。 (実際にはこの `site-lisp' は Emacs をインストールしたディレクトリ (Unix なら大抵の場合 `/usr/local/share/emacs')のサブディレクトリです。) `site-lisp/default.el' に書くのは問題があります。 もしユーザーの `.emacs' にエラーがあると `site-lisp/default.el' は ロードされません。 そうなると、ユーザはたとえ `.emacs' を修正するためであっても Emacs を 使うことができなくなってしまいます。 (`.emacs' の名前を変更するとか `-q' オプションを使う と言う方法に気付けば話は別ですが)
コマンド enable-flow-control は次の様に対話的に使うこともできます。
M-x enable-flow-control RET
詳しくは `etc/PROBLEMS' ファイルを読んでください。 (このファイルは Emacs の配布ファイルに含まれています。)
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
C-s と C-q にコマンドを割り当てるには関数 enable-flow-control か
関数 enable-flow-control-on を使ってください。
使い方については 10.7 フロー制御に使われている C-s と C-q を扱う方法は? 参照。
他のキーに割り当てるには関数 keyboard-translate を使ってください。
使い方については 10.11 キーを交換する方法は? 参照。
サイトで対処する場合は `site-lisp/site-start.el' に記述してください。
`site-lisp/default.el' を使っていけない理由については
10.7 フロー制御に使われている C-s と C-q を扱う方法は? 参照。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Backspace キーは(ほとんどのキーボードでは) ASCII コードの 8 を 生成します。C-h も同じコードを生成します。 Emacs は標準で C-h でヘルプを起動します。 `help' の先頭が `h' なので覚えやすいようにこう決められました。 もっとも簡単な解決法は C-h (と Backspace)でヘルプを起動し、 DEL(Delete)で直前の文字を削除する という標準のの設定のまま Emacs を使うことです。
この解決方法を好まない人もいます。
stty erase `^?' |
normal-erase-is-backspace-mode の値を設定することで
変えることができます。
設定は端末でもウィンドウシステムでも有効です。
これは M-x normal-erase-is-backspace と入力することでも設定できます。
詳しくは変数や関数の説明を読んで下さい(3.4 Emacs Lisp ドキュメントの入手方法は?参照)。
(keyboard-translate ?\C-h ?\C-?) |
Backspace を DEL の様にする方法としてはこれがお薦めです。
この方法なら DEL に delete-backward-char 以外のコマンド
を割り当てているモードでも Backspace を DEL として扱います。
同様にして DEL を C-d にするには次の様にします。 (C-d は現在位置の文字を消します。)
(keyboard-translate ?\C-? ?\C-d) |
keyboard-translate の詳細については 10.11 キーを交換する方法は? 参照。
(global-set-key "\C-h" 'delete-backward-char) ;;; overrides mark-whole-buffer (global-set-key "\C-xh" 'help-command) |
この方法はお薦めできません。
この方法では DEL を delete-backward-char に割り当てている
モードでのみうまくいきます。
そうでないモード(例えばview-mode)では Backspace で
ヘルプが起動するでしょう。
このため上記の keyboard-translate を利用する方法をお薦めします。
他にヘルプを割り当てるキーとしては M-? や C-x ? が 良く使われるようです。
DEL をヘルプに割り当てないでください。 DEL にローカルな割り当てを持つモードが多数存在し、うまく機能しません。
Emacs 21 以降ではウィンドウシステム上で起動された場合、 Delete でポイント位置の文字を削除するようになっています。 このためウィンドウシステム上ではあまりキー操作に悩むことはありません。
この問題についてオンラインマニュアルにも書かれています。 See Info file `emacs', node `DEL Does Not Delete'を参照して下さい。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
stty の設定を無視するのはなぜですか? sttyの設定を無視するのはなぜですか?"へのコメント(無し)良い質問です。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacs 19 では関数 keyboard-translate を使ってキー
(またはキー入力列)を交換することができます。
例えば C-h と DEL を交換したいときは次の式を評価してください。
(keyboard-translate ?\C-h ?\C-?) ; translate `C-h' to DEL (keyboard-translate ?\C-? ?\C-h) ; translate DEL to `C-h'. |
一番目の引数はキーボードから入力されるシーケンスです。 二番目の引数はキーマップに適用されるシーケンスです。
キーボードトランスレーションはキー割り当てとは異なります。 Emacs は色々な状況で適用される様々なキーマップを持ちますが、 キーボードトランスレーションはただ一つしか存在せず、 Emacs が端末から読み取る文字すべてに適用されます。 キーボードトランスレーションは入力プロセスの最下層で実現されます。 キーマップに適用されるキーはキーボードトランスレーションの結果の文字列です。
オンラインマニュアルの See Info file `emacs', node `Keyboard Translations' 参照。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
X 以外の端末では次の様な "エイリアス" が一般的です。
他のエイリアスも存在します。 CTRL キーと数字キーでどんなキーが生成されるか C-h c を使って調べてみてください。 コマンド名がわかっているなら C-h w を使ってみてください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
多くのキーボードでは Alt キーが Meta キーとして使えるでしょう。
M-a と入力する代わりに、ESC a と入力することができます。
実際、Emacs は内部で M-a を ESC a に分解して処理しています。
(ただし変数 meta-prefix-char の値にもよります)
Meta キーと a は同時に押しますが、
ESC を使うときは同時に押すのではなく、
ESC を離してから a を押すことに注意してください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
C-[ を代わりに使ってください。 これは ESC と同じく ASCII コードの 27 を送信します。 C-3 も端末によっては(X 上でないときは)うまくいくでしょう。 F11 は多くの端末(特に DEC の端末)で ESC を生成します。 そうでなければ次の式で利用できるようになります。
;;; F11 is the documented ESC replacement on DEC terminals. (define-key function-key-map [f11] [?\e]) |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
VT220 のようなダム端末ではできません。
VT220 クローンでそのようなことができる物があるという噂はあります。
X を使っているなら xmodmap を使ってできるかも知れません。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacs 19 以降ではベクトルを使ってモディファイアキーとファンクションキーを 組み合わせたキー入力列を表すことができます。 例: (オンラインマニュアルにあります)
(global-set-key [?\C-x right] 'forward-page) |
`?\C-x' は C-x の Lisp 表現です。
ファンクションキーとモディファイアキー
(CTRL, META, HYPER, SUPER, ALT, SHIFT)を
同時に使うにはファンクションキーを表すシンボル名の前に
`C-', `M-', `H-', `s-', `A-', `S-' を
付けてください。
次の式は Hyper-Meta-RIGHT に forward-word を割り当てます。
(global-set-key [H-M-right] 'forward-word) |
一般的なキー割り当ての方法については 10.1 キー(ファンクションキーを含む)にコマンドを割り当てる方法は? 参照。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
xterm で Meta キーが使えないのはなぜ? xtermでMetaキーが使えないのはなぜ?"へのコメント(無し)See Info file `emacs', node `Single-Byte Character Support' を参照してください。
それでうまく行かない場合は以下の点を確認してみてください。
mwm を使っているなら無理でしょう。
(誰か良い解決法を知りませんか?)
xev を使って Meta キー(らしきキー)の生成するコードを
調べられます。
それは Meta_L か Meta_R でなくてはいけません。
そうでなかったら xmodmap で修正してください。
Meta キーが Meta_L か Meta_R を生成し、
M-x が non-ASCII 文字を生成するのならば
`~/.Xdefaults'に以下の様に書き加えて下さい。
XTerm*eightBitInput: false XTerm*eightBitOutput: true |
xterm の使う `pty' が 8 ビット文字を通すか確認してください。
`stty -a' (または `stty everything')で `cs8' が
表示されなければいけません。
`cs7' が表示されたなら `stty cs8 -istrip'(または `stty pass8')
で修正してください。
xterm と Emacs の間を rlogin で
つないでいるなら 8 ビット文字を通すために
`-8' を rlogin の引数に指定する必要があります。
(set-input-mode t nil) で
うまくいくと言う報告があります。
xterm に生成させる方法があります。
これは Emacs では同じキー入力列となります。
X11R4 では次のリソースを指定してください。
XTerm.VT100.EightBitInput: false |
(これは `insert-eight-bit' の挙動を変更します)
古い xterm ではトランスレーションで同じことができます。
XTerm.VT100.Translations: #override \ Meta<KeyPress>: string(0x1b) insert() |
リソース中の `Meta' を `Alt' に置き換える必要があるかも知れません。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
これは X11R4 で国際化拡張がなされ、現在 HP がこの拡張を使っているためです。
Emacs は `XLookupString' が Meta キーの状態によらずに
同じ結果を返すものと見なすためです。
Emacs 側で修正されるようになるまでは、
X サーバを起動する度に xterm を起動する前に次の様にしてください。
xmodmap -e 'remove mod1 = Mode_switch' |
これによりシステム全体で新たなキーシムが使えなくなるので、 期待した解決法ではないかもしれません。
| [ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |