これは Emacs が xterm のような端末エミュレータ・ウィンドウで起動されているか, または Emacs 自身がウィンドウを開いているかで異なります. 起動時にどちらかを指定することができます.
もし Emacs を端末エミュレータで起動しているときは, 他の端末から使っている場合と全く同様です. この場合には, 端末エミュレータからファンクション・キーを押したときに 文字列がプログラムに送られます. "xterm" はファンクション・キーが押されたときに 二つのことなる文字列の集合を生成することができます. X のリソース sunFunctionKeys または コマンドライン・オプションの -sf と +sf で指定できます. (どのような文字列が生成されるかを知るには質問 53 の方法を使ってください.) 加えて, xterm では "translations" リソースを変更することで ファンクション・キー (もちろん他のキーも) が生成する文字列を 変更することができます. 例えば
XTerm.VT100.Translations: #override \ <KeyPress>F1: string(0x1b) string("[xyzzy")
とすると, F1 は "ESC [xyzzy" という文字列を生成します.
一方, Emacs が自分でウィンドウを開いているときは 次のような方法を使うことができます. キーボード・フォーカスがウィンドウに与えられている間, キーが押されると Emacs は X サーバから `KeyPress' というイベントを受取ります. KeyPress イベントは X の `keysym' コードを含みます. keysym コードは単なる数字ですが, さらに `control' や `shift' キーが押されていたことを判断するための "modifiers" という情報を含みます. 例えば `Tab' keysym は 0xff09 です. (`Tab' キーは `Tab' keysym を生成します. 一般に, キーボードのキーはキーに記されたラベルと同じ keysym を生成しますが, xmodmap というプログラムで変更することもできます.) Emacs は標準的な ASCII 文字に対応するすべての keysym を理解できます. 内部的には ASCII 文字を使っています.
(注意: I am about to describe a gross, disgusting hack to you, have your barf bag ready.)
Emacs が矢印キーに対応する X の keysym を受取ると, コントロール・キーが押された状態で文字キーが押されたように振舞います. (これはハード・コードされています):
Up becomes C-p Down becomes C-n Right becomes C-f Left becomes C-b
これ以外の keysym がどのように扱われるかは どんなマシンで Emacs をコンパイルしたかに依存します. ファンクション・キーはエスケープ文字列を生成しますが, 他のキーは完全に無視されます.
F1 から F9 まで L1 から L10 まで (F11 から F20 までと同じ) R1 から R15 まで (F21 から F35 までと同じ) (R8, R10, R12 そして R14 は X の keysym Up, Left, Right そして Down を生成する) Break ("Alternate" キーもこの keysym を生成する)これらのキーは Sun のファンクション・キーと同様に働きます. Emacs がこれらの keysym を受けとると, 内部的に "ESC [ ### z" という文字列に変換します. ここで ### は適当な数です. この文字列は Sun のキーボードが SunView 上で生成するものと同じです. 上に挙げた以外のファンクション・キーは "ESC [ - 1 z" という 文字列を生成します.
F1 から F20 まで Help (F15 と同様に扱われる) Menu (F16 と同様に扱われる, LK201 では "Do" キー) Find Insert (LK201 では "Insert Here" キー) Select次のキーはサポートされているはずなのですが, バグのためか認識できません:
Prior (LK201 の "Prev Screen" キー) Next (LK201 の "Next Screen" キー)LK201 キーボードで `Remove' または `Delete' とラベルのあるキーは, LK201 が生成する文字列の代わりに, 通常 Delete keysym を生成し, Emacs では DEL 文字 (C-?) を生成します. ファンクション・キーは Emacs の内部で "ESC [ ## ~" という文字列に 置き換わります. ここで ## は適当な数です. この文字列は LK201 キーボードが生成する文字列と同じです. 上に挙げていないファンクション・キーは "ESC [ - 1 ~" を生成します.
ファンクション・キーが生成する文字列の完全な一覧は src/x11term.c の関数 "stringFuncVal" を参照して下さい.
X サーバは別のマシンでも (例えば X 端末を使っている場合) Emacs を Sun で動かしているなら, Sun のところで紹介した設定になります. どの設定を使うべきかは, どのマシンのディスプレイで X サーバが動いているかではなく, どのマシンでコンパイルした Emacs を使っているかに依存します. "xmodmap" プログラムを使うと keysym を変更できますが, 他のプログラムにも影響します. リソースで Emacs の生成するキー列を変更することはできません.
もし使いたいファンクション・キーが上の一覧に挙がっていなくて, xmodmap で名前を変更したくないときは, Emacs に変更を加えることになります. Johan Vromans <jv@mh.nl> は次のように説明しています:
トリッキーな設定はいくらでもあるが, もっともエレガントな解答だと思われるのは "x-rebind-key" 関数を使うものだ. ただしこの関数はわけあってソース中でコメントアウトされている ---実はバグがあるんだ.
ただし対策は簡単で Epoch のソースから epoch:rebind-key という関数を持ってきて そっくり取り替えてしまえばいいんだ.
こうするとすべてのキーの設定を変更することができる. 例えば
(x-rebind-key "KP_F1" 0 "\033OP")
とすると PF1 キーで "ESC O P" という VT 端末と同じ文字列を生成させることができるようになるんだ.