ひろせです

on "Re: C-,と C-.           への割り当て"
   <c12vbb$1sd$1@ns.src.ricoh.co.jp>
at 19 Feb 2004 18:30:03 GMT
   ohta@src.ricoh.co.jp (Junn Ohta) wrote:

> fj.editor.emacsの記事<qkpptcb9yij.fsf@dash.tokyo.pfu.co.jp>で
>    kate@pfu.fujitsu.comさんは書きました。
> > “emacs -nw”なので、xterm か kterm でわないかと、、、、
> >         ^^^
> 
> Windowsからtelnetで入っている場合だってあるでしょ
> うからxterm/ktermとは限らないと思いますが、逆に、

情報が足りませんでしたが emacs -nw は xterm, kterm, rxvt での起動のつ
もりでした。

> > それでしたら、xterm/kterm の resource を使って“C-,”や“C-.”で
> > エスケープシーケンスを出すように定義して、emacs でそれを拾えばい
> > いです。
> 
> Xなターミナルであればそういう手段が何かしら利用で
> きるのですね。勉強になりました。

xterm, kterm では片山さんの方法でうまくできたのですが、rxvt ではダメ
(C-.でも.が入力される) でした。

rxvt の README
<URL:http://cvs.sourceforge.net/viewcvs.py/rxvt/rxvt/doc/README.xvt?rev=HEAD&view=auto>
によれば、

  Xterm features not supported
  ----------------------------
(snip)
   - Toolkit style configurability.  In particular, xvt does not allow
     the user to remap the mouse or keyboard keys.

という記述があるので Translations には対応していないのではないかと思い
ます。

以下、簡単にまとめますので間違いがあったら指摘してもらえるとうれしいで
す。

                                  //

* 目的

xterm, kterm などの中で emacs -nw で起動した Emacs で、C-. や C-, にキー
バインドしたい。


* 方法

~/.Xdefaults に以下を設定。

KTerm*VT100.Translations: #override \
  Shift<Key>space: begin-conversion(JAPANESE_CONVERSION) \n\
 !Ctrl<KeyPress>period: string(0x1b) string("[34~") \n\
 !Ctrl<KeyPress>comma: string(0x1b) string("[33~")

XTerm*VT100.Translations: #override \
 !Ctrl<KeyPress>period: string(0x1b) string("[34~") \n\
 !Ctrl<KeyPress>comma: string(0x1b) string("[33~")

~/.emacs に以下を設定。

(global-set-key [f20] FUNC-FOR-CONTROL-PERIOD)
(global-set-key [f19] FUNC-FOR-CONTROL-COMMA)


* 説明

ターミナルの上で動いているアプリケーションにはターミナル経由で文字コー
ドしか渡せません。ASCII文字の制御コードは0x00〜0x1fの32種類しかなく、
0x40〜0x5f の文字とCtrlキーの同時押しに割り当てられています。つまり使
える組み合わせは以下のものだけです。

  C-@(C-SPC), C-a 〜 C-z, C-[, C-\, C-], C-^, C-_

従って

  (global-set-key [?\C-.] FUNC)

などとしてもターミナルの中の Emacs は反応しない。

一方、X 上ではすべてのキーがイベントを起こすので、任意の通常キーと任意
のモディファイキーの組み合わせ (C-.とか) であまり使わないキー (F20とか) 
の keysym を発生させるように Translations クラスで設定し、Emacs 側で 
F20 に global-set-key すればよい。


* 参考

# 間違っているかもしれませんが参考までに。

rxvt では Translations が実装されていないようなのでこの方法は使えない。

Emacs 側でのファンクションキーと keysym の対応 ("[34~"は f20 であるな
ど) を確認するには、/usr/local/share/emacs/VERSION/lisp/term/lk201.el 
を見ればよい。

                                  //

ではでは

-- 
ひろせ