============================================== 1999.12.06 発行 =========
         極私的 Emacs カスタマイズ紹介マガヂン
            Emacs をわたし色に染めて♪
------------------------------------------------------------------------
                第 18 回 X にまつわるエトセトラ【中編】
           xmodmap でキー配列を変える(その 1)普通のキーの場合
------------------------------------------------------------------------
※あなたのカスタマイズをぜひ教えてください。一般的なものから、他の人は
 絶対にしないような「外道」なものまで、何でも結構です。

※解除の方法は、このメールの末尾をごらんください。
========================================================================

	こんにちは。でるもんた・いいじまです。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

☆今回のお題☆

	今回は、X 上で Emacs を使うための tips の第 2 段として、
	「xmodmap によるキー割り当ての変更方法」をご紹介します。

	Emacs では、キーの割り当てはほぼ 100% カスタマイズ可能です。
	ここで「ほぼ」と言ったのは、Emacs 上では変更のできないキーも
	あるからです。そのキーとは、Control、Alt/Meta、Shift、CapsLock
	などのキーです。Control キーの位置が気に入らないという場合は、
	Emacs だけではどうしようもありません。

	こういったとき、Windows なら、
	http://www.vector.co.jp/vpack/filearea/win/util/operate/keyboard/
	から
		○猫まねき
		○KeyLay
		○SwapScan.386
	といったソフトをダウンロードしてきて使うのですが、Unix 系の
	場合は xmodmap というコマンドを使います。今回はこのコマンドの
	ご紹介です。

	なお、xmodmap で設定すれば、Emacs 以外のアプリケーションでもこの
	配列が有効になります。

☆対象は X のみです☆

	なお、今回の対象は、「X 上の場合」だけです。X が起動していない
	コンソールの場合はこの方法ではキーの変更はできません。

	【補足】ただし、各 OS がキー変更機能を提供している場合があります。
	    OS のマニュアル等で調べてください。

☆注意!東京大学の ECC で使っておられる方へ☆

	東大 ECC の BusinessTerminal 300 は、仕様が通常の Unix 系
	OS とは若干ことなっており、下手をすると他人に迷惑がかかります。
	次の点にご注意ください。

		○Unix サーバーにログインした状態で(ux??? というウィン
		 ドウの中の kterm から)xmodmap を実行した場合、その
		 設定はウィンドウの中でのみ有効です。他のソフト(ICEMail
		 や Windows サーバーなど)には影響しませんし、また、Unix
		 サーバーからログアウトしたら、その時点ですべて元に戻り
		 ます。
		○「ツール→Ssh」からログインして xmodmap を実行した場合、
		 ICEMail などすべてのソフトで有効です。ただし、すでに
		 Unix サーバーや Windows サーバーにログインしている場
		 合は、そのウィンドウには影響しません(有効にするには、
		 一旦これらのサーバーからログアウトし、再ログインする
		 必要があります。)

		【重要】「ツール→Ssh」からログインして xmodmap を実行
		    した場合、この端末からログアウトしても、電源を
		    切るまで設定が有効になります。(一般的な X 端末
		    では、ログアウトすると設定は元に戻ります。)
		    従って、このような使い方をした場合は、ログアウト
		    したあと、次の人に端末を譲る前に必ず電源を切る
		    ようにしてください。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆たとえば実例☆

	まずは、xmodmap が効果を発揮する実例を挙げましょう。

(1) Control と CapsLock の件: AT 互換機の場合

	最近の PC/AT 互換機では、Control キーと CapsLock キーの位置関係は

		+----+----+----+--
		| Esc| 1 | 2 |
		+----+--+-+--+-+--
		| Tab   | Q | W
		+-------+-+---++---
		| CapsLock| A | S
		+---------++---++----
		| Shift    | Z | X
		+--------+-+-+-+---
		| Control|   | Alt
		+--------+   +-----

	のようになっています。ところが、'A' のとなりに Control がある
	キーボードに慣れている人にとっては、これは不満です。そのため、
	'A' のとなりに Control があるキーボードも売り出されていますが、
	一方で、上記の配列に慣れてしまった人にとっては、逆にそれが
	不満になります。

	以前にご紹介した
		>●いいじまさんは、Ctrl キーは小指の先で押しますか、
        	> それとも、手のひらの小指の根元のところで押しますか?
	というご質問をくださった方は、上記の配列に慣れてしまった人なの
	ですね。

(2) Control と CapsLock の件: PC-9801/9821 デスクトップの場合

	PC-98x1 のデスクトップ機では、

		+----+----+----+--
		| Esc| 1 | 2 |
		+----+--+-+--+-+--
		| Tab   | Q | W
		+----+--+-+---++---
		|Ctrl|Caps| A | S
		+---------++---++----
		| Shift    | Z | X
		+----------+----+---

	というキー配列になっています。このため、Control を押そうとして
	誤って Caps を押してしまうというケースが非常によく起こります。
	この Caps の部分を押しても Control と見なしてくれれば助かります。

	【補足】この方法は、Caps キーがソフトウェアで制御できない古い
	    キーボードでは使えないかもしれません。そういう機種で
	    X を使うことはないとは思いますが、ジャンク屋でキーボード
	    だけ買ったという場合などは要注意でしょう。

	【補足】Caps キーをふだん使わない人ならば、Caps キーを殺して
	    しまえばいいのですが、たまには使うという場合は、何か
	    空いている別のキー、たとえば vf・5(=F15)に割り当てる
	    といったことが考えられます。

	【余談】PC-98x1 でも、ノートの場合は 'A' の隣は すべて Control
	    です。また、PC98-NX は基本的には AT 互換機と同じ配列に
	    なっています。

	【余談】X で使う場合はあまり関係ありませんが、Windows キーの
	    となりに Grph(=Alt)キーがあるのも煩わしく、私の弟は
	    Windows キーのキートップを外すという暴挙に出ています(^^;)

(3) 私の Biblo

	私の FMV Biblo NE926 では、Backspace キーが小さく(通常の文字
	キーの 3/4 程度の幅しかない)、しかもそのすぐ隣に Home キーが
	あります。

		---+---+---+
		¥ |BS |Hom|
		-+-+---+---+
		 | Re- |PUp|
		 ++turn+---+
		  |    |PDn|
		 ++----+---+
		 |Shift|End|
		 +-----+---+

	このため、Backspace を押そうとして Home を押してしまうことがよく
	あります。

(4) 高岳 XMiNT

	XMiNT では、シフトキーとカーソルキーを同時に押すと「Shift +
	F11〜F14」と見なされてしまい、第 7 回・第 16 回でご紹介したような
	Shift+カーソルが使えなくなってしまいます。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆本題に入る前に: キーコードとキーシンボル☆

	キーボードのそれぞれのキーには、「キーコード」と呼ばれる番号が
	割り振られています。この番号は、たとえば左の Shift キーと右の
	Shift キーとでは異なる番号になっていますし、メーカーなどに
	よっても異なります。

	たとえば、現在の私の環境(富士通 Business Terminal 300、NetBSD
	1.2.1+XFree86 3.3(?)、Happy Hacking Keyboard)では、左 Shift は
	50 番、右 Shift は 62 番になっています。また、手元にある高岳
	XMiNT CSV では、左 Shift は 8 番、右 Shift は 9 番です。

	このため、X のアプリは、もしキーコードを元に「あ、50 番のキーが
	押されたから○○しよう」という判断をしていては、機種ごとに場合
	分けをしなければならず、面倒です。

	そこで、「キーシンボル」というものを使います。このキーシンボルは、
	X さえ使っていればどの機種でも共通です。OS はキーコードとキーシン
	ボルの対応表(たとえば、「50 番=Shift_L」「62 番=Shift_R」)を
	持っていて、キーが押されたときには、OS はアプリに対し、キーコード
	とともにキーシンボルも教えてあげるのです。その上で、アプリは
	「あ、Shift_L が押されたから○○しよう」と判断するわけです。

	なお、キーシンボルとキーコードの対応表は
		% xmodmap -pke
	で調べることができます。また、何のキーシンボルも与えられていない
	キーのキーコードは、xev というコマンド(手元の Solaris 2.6 では
	/usr/openwin/demo/xev ですが、PATH には入っていないのでフルパスで
	指定してください)を起動してから問題のキーを押し、画面に
		KeyPress event, serial 20, synthetic NO, window 0x3400001,
		    root 0x25, subw 0x0, time 3855450141, (160,520),
		    root:(335,610), state 0x80, keycode 36 (keysym 0xff0d,
		    Return), same_screen YES,
		"   XLookupString gives 1 characters:  "

	のように出てくるのを見ればわかります。(上は Return キーを押した
	場合ですが、keycode 36 というのがわかります)

	【余談】手元の Happy Hacking Keyboard では、Space の左右の[◇]
	    キーが、割り当てなしのキーです。このキーは Macintosh
	    では Command キーとして使われる(Alt は Option キーに
	    なる)ようですし、また最近の版では Windows キーとして
	    使われることもあるようですが、AT 互換機の UNIX 上では
	    通常は使われません。

	なお、この「キーコード」「キーシンボル」という言葉はたいへん
	重要ですので、よく覚えて、混同しないようにしてください。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆xmodmap の起動法☆

	xmodmap を起動する際は、まず、どのような変更を行うのかをあらかじめ
	テキストファイルに書いておきます。(書式はこれから説明します。)
	そうしてから、仮にファイル名を ~/.Xmodmap として、
		% xmodmap ~/.Xmodmap
	という形で読み込ませます。

	【注】man xmodmap ではファイル名として ~/.xmodmaprc を推奨して
	   いますが、~/.Xmodmap とすることも多いようです。また、
	   環境によっては、~/.Xmodmap があると X の起動時に自動的に
	   実行してくれることもあります。

	また、コマンドラインオプションで指定することもできます。
	たとえば、
	     % xmodmap -e 'keycode 10 = 1 exclam' -e 'keycode 11 = 2 quotedbl'
	とすると、これは、
		keycode 10 = 1 exclam
		keycode 11 = 2 quotedbl
	という 2 行のファイルを作って、そのファイルを指定したのと同じ
	ことになります。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆xmodmap の文法 (1) - 通常のキーの場合☆

◇全般的なこと

	~/.Xmodmap には、1 行に一つのコマンドを書きます。
	空行は自由に入れることができます。また、行頭に(行中は不可)
	'!' を書くと、その行はコメントとして無視されます。

◇はじめの一歩 - keycode 文

	【例題】手元のキーボードが米国配列なので、日本配列にしたい

	この場合、もっとも簡単な方法は、
		keycode  10 = 1 exclam
		keycode  11 = 2 quotedbl
		keycode  12 = 3 numbersign
		keycode  13 = 4 dollar
		keycode  14 = 5 percent
		keycode  15 = 6 ampersand
		keycode  16 = 7 apostrophe
		keycode  17 = 8 parenleft
		keycode  18 = 9 parenright
		keycode  19 = 0 NoSymbol
		keycode  20 = minus equal
	のように、「キーコード何番のキーは、キーシンボルこれこれ」と
	指定する方法です。こうすれば確実です。

◇keysym 文を使おう

	ところが、最初に述べた通り、キーコードはキーボードの種類によって
	異なります。したがって、このようにキーコードで書いてしまうと、
	別の環境ではうまく動作しなくなる恐れがあります。

	【補足】ただし、元々の状態では何のキーシンボルも割り当てられて
	    いないキー(たとえば、上述の [◇])を指定するときは、
	    以下で述べる keysym 文は使えませんので、互換性がなく
	    なるのを覚悟で keycode 文を使うのもやむをえません。

	そこで、keysym 文を使います。

	【例題】Escape キーの位置が気に入らないので、F1 を押すと Escape
	    として働くようにしてほしい。

	このとき、キー「F1」のキーコードは、手元の環境では 67 です(環境に
	よって違いますので、xmodmap -pke や xev で確認してください)から、
		keycode 67 = Escape
	と書くこともできますが、その代わりに、
		keysym F1 = Escape
	と書くこともできます。これは、
		xmodmap 起動時において元々キーシンボル F1 に割り当て
		られているすべてのキーに、Escape を割りあてる
	という意味です。

	なお、ここで持ってまわったような分かりにくい言い回しをしている
	のには、実は訳があります。

	「すべてのキー」
		同じキーシンボルが割り当てられているキーがふたつある
		ときには、その両方が影響を受けます。たとえば、AT 互換
		機の日本語キーボードでは、設定にもよりますが
			○「へ」のキーには「¥(\)」と「|」が
			○「ろ」のキーには「\(¥)」と「_」が
		割り当てられています。ここで、「¥(\)」という
		文字を表すキーシンボルは backslash ですが、
			keysym backslash = Delete
		とすると、両方のキーが Delete キーに化けます。これを
		避けるには、backslash のかわりに bar(|)や underscore
		(_)を使って
			keysym bar = Delete
			keysym underscore = BackSpace
		とするか、keycode 文を使うかしなけけばなりません。

		【補足】上のように設定した場合、単に「へ(¥|)」を押した
		    だけでもきちんと Delete キーとみなされます。keysym
		    文に指定したのが Shift キー押しの状態で使う bar
		    だからといって Shift+へ を押すと、Shift+Delete と
		    見なされます。

	「xmodmap 起動時において」
		これが問題になるのは、キーの入れ替えの場合などです。
		たとえば、
			keysym Delete = BackSpace
			keysym BackSpace = Delete
		という 2 行を書いて、いちどに xmodmap コマンドに指定した
		場合(以下、甲とします)は、期待どおりに、Backspace と
		Delete を入れ替えることができます。

		しかし、1 行目だけを実行し(そうすると、Delete と刻印
		してあるキーは Backspace キーとして働くようになりますが、
		Backspace と刻印してあるキーは、まだ元の Backspace の
		ままですよね?)、それからもう一度 xmodmap を起動して、
		今度は 2 行目だけを実行すると、Backspace と刻印してある
		キーが Delete として働くのは当然ですが、Delete と刻印
		してあるキーが Delete として働くように戻ってしまいます。
		(以下こちらを乙とします。)

		これらの違いの原因が、「xmodmap 起動時において」という
		一言です。

		甲では、xmodmap 起動時には
			○Delete キーシンボルが割り当てられているキーは、
			 Delete と刻印してあるキーだけ
			○BackSpace キーシンボルが割り当てられているキーは、
			 Backspace と刻印してあるキーだけ
		なので、2 行目の keysym BackSpace = Delete の対象になるの
		は、1 行目に関係なく、Backspace と刻印してあるキーだけです。

		いっぽう、乙では、2 度目の xmodmap 起動時には
			○Delete キーシンボルが割り当てられているキーは
			 存在しない
			○BackSpace キーシンボルが割り当てられているキーは、
			 BackSpace と刻印されているキーと、Delete と刻印
			 されているキーのふたつ
		という状況になっているので、両方ともが keysym BackSpace =
		Delete の対象になってしまうのです。

◇シフトキー同時押しの場合の処理

	keycode 文、keysym 文とも、シフトキーなしで(普通に)押したときと、
	シフトキーを押しながら押したときとで別々のキーシンボルを割り当てる
	ことができます。たとえば、上で挙げた
		keycode 10 = 1 exclam
	は、このキーを単独で押したら数字の '1' が、シフトキーを押しながら
	押したら '!'(EXCLAMATION MARK)が出るように、と指定しています。
	また、たとえば次のような変態的なことも、やろうと思えば可能です:
		keysym a = a B
	こうすると、'A' と刻印されているキー('ち')を単に押せば、
	小文字の 'a' が出てきますが、Shift+ち を押すと大文字の 'B' が
	出てきます。

	なお、上で挙げた
		keycode 19 = 0 NoSymbol
	では、2 番目に NoSymbol を指定しています。これは、
		Shift なしなら数字の '0' を出すが、
		Shift と同時に押したら、何の動作もしない
	という意味です。次の例
		keycode 19 = 0
	とで動作を比較してみてください。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆宿題☆

	さて、実は今回だけで xmodmap の件は片付ける予定だったのですが、
	実はまだ重要な問題が残っています。それは、Shift、Control、Alt
	といった、modifiers と呼ばれるキーです。実は、
		keysym Control_L = Caps_Lock
		keysym Caps_Lock = Control_L
	だけではうまくいきません。

	が、今回はだいぶ長くなりましたので、modifiers については次回に
	ということにさせていただきたいと思います。

	Modifiers 以外については、Emacs でも基本的には操作を変えられます
	ので、xmodmap でいじっても、「Emacs 以外でもキーが変更できる」
	「文字キーの並べ替えは、Emacs でやるより遥かに簡単」という以外の
	メリットは特にありません。というわけで、modifiers の変更こそが
	xmodmap の醍醐味なのですが、そみまで入れなくて申し訳ありません。

	とはいえ、ここまで説明した内容だけで、最初に挙げた実例の (3)(4)
	は解決できるようになりました。ということで、次のふたつの課題を
	宿題としたいと思います。

		○(3) で、Home キーを押したときに何も起こらないようにする
		 にはどうすればよいか?

		 【注】Home キーを押したときに Backspace として働く
		    ようには私は設定しません。というのは、そういう
		    設定にすると、Backspace と Home を同時に押したら
		    Backspace を 2 度押したことになってしまうからです。

		○(4) で、Shift+カーソルがきちんと Shift+カーソルと認識
		 されるためにはどうればよいか?

		 【ヒント】xmodmap -pke の出力から該当部分を抜粋すると
		      次のようになっています。

				keycode  34 = Left F11
				keycode  35 = Down F12
				keycode  36 = Up F13
				keycode  37 = Right F14

	正解発表は次回です。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆次回予告☆

	次回は、「第 19 回 X にまつわるエトセトラ【完結編】xmodmap で
	キー配列を変える(その 2)Control キーなどの場合」として、
	modifiers の設定を変更します。

	それではまた♪

========================================================================
極私的 Emacs カスタマイズ紹介マガジン Emacs をわたし色に染めて♪

☆発行人☆

        でるもんた・いいじま <L94102@mail.ecc.u-tokyo.ac.jp>
                        http://user.ecc.u-tokyo.ac.jp/~l94102/emacs/

                ※このメールマガジンで取り上げてほしいテーマ、ご意見など
                 ありましたら、上のメールアドレスまでお気軽にどうぞ。

☆配信☆
        このメールマガジンは、「インターネットの本屋さん・まぐまぐ」を
        利用して配信しています。
                http://www.mag2.com     (マガジン ID=0000013484)

☆バックナンバー・登録解除・メールアドレス変更は☆

        上記のホームページまでどうぞ。
        なお、手動での登録解除は行っておりませんのでご了承下さい。
=========================================================================


Copyright © IIJIMA Hiromitsu aka Delmonta, 2016/03/10 15:09 JST
これは「古文書」です。 古くなった情報も原則未修正で保存していますのでご注意ください。

古文書本館トップ | 電脳外道学会