Go to the first, previous, next, last section, table of contents.

X ウィンドウ・システムでファンクション・キーを使うにはどうするのですか?

これは 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 をコンパイルしたかに依存します. ファンクション・キーはエスケープ文字列を生成しますが, 他のキーは完全に無視されます.

  1. Sun でコンパイルした場合は, Emacs は X の keysym を Sun のキーボードと同様に解釈します:
      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" という 文字列を生成します.
  2. Sun 以外でコンパイルした場合は, ファンクション・キーは DEC LK201 キーボード (VT シリーズの端末で使われている) とほぼ同様に振舞います. 次の X の keysym は認識されます:
      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 端末と同じ文字列を生成させることができるようになるんだ.

Go to the first, previous, next, last section, table of contents.