============================================== 1999.12.20 発行 =========
         極私的 Emacs カスタマイズ紹介マガヂン
            Emacs をわたし色に染めて♪
------------------------------------------------------------------------
                第 19 回 X にまつわるエトセトラ【完結編】
           xmodmap でキー配列を変える(その 2)Control などの場合
------------------------------------------------------------------------
※あなたのカスタマイズをぜひ教えてください。一般的なものから、他の人は
 絶対にしないような「外道」なものまで、何でも結構です。
※解除の方法は、このメールの末尾をごらんください。
========================================================================
	こんにちは。でるもんた・いいじまです。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆祝・1000 部突破☆
	おかげさまで読者数が 1000 名様を超えました。
	最初にこのマガヂンをはじめた頃は、まさかこんなに多くの方に
	読んでいただけるとは思っていませんでした。
	これからもよろしくお願いいたします。
☆姉妹紙のお知らせ☆
	本日より、新しいメールマガヂン「Windows 95/98 管理人のための
	MS-DOS 基礎講座」を開始いたししました。
		マガジン ID = 0000022456
		Windows95/98の管理には、MS-DOSの基礎知識がほぼ必須です。
		このマガジンでは、Windowsでソフトのインストール等が一応
		できる人を対象に、MS-DOSの基礎について説明します。
		ATと98に両対応、上級者のツッコミ歓迎。
	Emacs のマガヂンとはまったく関係ないのですが、Windows ユーザーの
	方はぜひ読んでいただければと思います。
	なお、創刊号はすでに配送済みなのですが、バックナンバーを
		http://user.ecc.u-tokyo.ac.jp/~l94102/dos/
	においてあります(登録もここからできます)ので、ぜひご覧ください。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆読者のお便りから☆
	●最近の Linux の日本向け配布では、インストール時に Control の
	 位置を選べるものがあります。
	 また、自分は X を使っていないので loadkeys というコマンドを
	 使っています。
		最近はそんな親切な環境が増えたとは知りませんでした(^^;)
		loadkeys のほうは、これが第 18 回でちょこっと説明した
		「各 OS がキー変更機能を提供している場合」にあたります。
		詳しくお知りになりたい方は man loadkeys などで調べてみて
		ください。
			【注】loadkeys による設定は、試したわけではあり
			   ませんが、ひょっとしたら、X が動いていない
			   状態でのみ有効、ということになっているかも
			   しれません。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆今回のお題☆
	今回は、xmodmap の話の完結編、Control・CapsLock・Shift などの
	キーの場合です。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆宿題の答え☆
	その前に、前回の宿題の答えです。
	>○(3) で、Home キーを押したときに何も起こらないようにするには
	>  どうすればよいか?
		これは、Home キーが BackSpace の隣にあり、間違って押して
		しまうことが多いので無効にしたい、ということでした。
		正解は、
			keysym Home = NoSymbol
		です。
	> ○(4) で、Shift+カーソルがきちんと Shift+カーソルと認識
	>  されるためにはどうればよいか?
		こちらは、
			keycode  34 = Left F11
			keycode  35 = Down F12
			keycode  36 = Up F13
			keycode  37 = Right F14
		となっている環境で、Shift とカーソルキーを同時に押した
		ときに、Shift とファンクションキーが同時に押されたように
		なってしまうという問題でした。
		これは、
			keysym Left  = Left
			keysym Down  = Down
			keysym Up    = Up
			keysym Right = Right
		で大丈夫です。= の左辺は F11〜F14 と書いてもいいのですが、
		本当に F11、F12 キーのある環境でも悪さをさせないためには
		Left、Down、Up、Right と書いておくのがいいでしょう。
		なお、本当に F11、F12 がほしいという場合もあると思います。
		幸い、このキーボードにはカナロックキーがありますので、
		「カナロックがかかっていれば F11〜F14」としておくのも
		悪くはないでしょう。
		【余談】私自身は、カナ入力派でありながらカナロックキーは
		    殺していました。tcsh がカナロックキーによる半角
		    カナの入力を受け付けなかったせいです。ただ、いま
		    UNIX で使っているキーボードはそもそもカナロック
		    キーがないので、特に何もしていません。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆さっそくやってみよう☆
	さて、それでは Control、CapsLock などの入れ替えにいってみましょう
	…とはいっても、じつは次のような方法ではうまくいきません。
	!間違い(1) AT 互換機、左 Control と CapsLock の入れ替え
	keysym Control_L = Caps_Lock
	keysym Caps_Lock = Control_L
	【余談】PC-98x1 の場合は、たとえば次のように書くことになります。
			!間違い(2) PC-98x1、Control の隣の CapsLock を殺す
			keysym Caps_Lock = Control_R
			keysym F15 = Caps_Lock
		以下では、上の AT 互換機の例で説明します。
	これを実行しても、いっこうに Control は Control のまま、
	CapsLock は CapsLock のままになっています。
	ところが、xev コマンド(Solaris なら /usr/openwin/demo/xev ですが、
	Linux などでは標準で PATH に入っていることも少なくありません)で
	調べてみると、たしかに、
		○Control  と刻印されているキーを押したときには Caps_Lock が
		○CapsLock と刻印されているキーを押したときには Control_L が
	押されたと表示されています。
	いったいこれはどうしてでしょうか。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆modifier map という曲者☆
	実は、これらのシフトキー類(man xmodmap では modifiers と言って
	います)の場合、キーを単体で押したときの機能の他に、「押しっぱなし
	にして(あるいは、押してから)別のキーを押したときの機能」の設定も
	しなければいけないのです。
	たとえば、次のような設定をしたとします。
		keysym Control_L = a A
	このとき、Control と刻印されているキーを単に押したら、小文字の 'a'
	が入力されます。あるいは、Shift と Control を同時に押したら、
	大文字の 'A' が入力されます。
	ところが、この Control キーと、たとえば 'c' を同時に押してみて
	ください。そうすると、アプリケーションはこれを Control+C と認識
	したはずです。
	実は、上の設定では、「Control と刻印してあるキーを単体で押した
	ときには、アプリには 'a' が押されたと伝えてほしい」という設定を
	しただけです。先に出てきた Control と CapsLock の入れ替えの例でも
	同様で、その設定は、Control キーを単体で押したときに何か動作を
	するようなアプリに対しては正しい設定なのです。
☆xmodmap -pm で見てみると☆
	ところが、それとは別に、「他のキーと一緒に押したときに、Control
	modifier として働くのは、キーコード何番と、何番のキーと、何番の
	キー」という設定項目があります。これを変更してやらなければいけ
	ないのです。
	この設定内容(modifier map)は、「xmodmap -pm」で調べることが
	できます。たとえば、手元の環境で xmodmap -pm を実行すると、
		shift       Shift_L (0x32),  Shift_R (0x3e)
		lock        Caps_Lock (0x42)
		control     Control_L (0x25),  Control_R (0x6d)
		mod1        Alt_L (0x40),  Alt_R (0x71)
		mod2        Num_Lock (0x4d)
		mod3
		mod4
		mod5        Scroll_Lock (0x4e)
	と表示されます。この 2〜3 行目を見ると、
		○押したとき CapsLock として働くのは、キーコード 0x42 番
		 (これは 16 進数ですので、10 進数に直すと 66 番になり
		 ます)のキーであって、このキーに現在割り当てられている
		 キーシンボルは Caps_Lock である
		○他のキーと一緒に押したときに Control として働くのは、
		 キーコード 0x25(37)番と 0x6D(109)番で、これらの
		 キーに現在割り当てられているキーシンボルはそれぞれ
		 Control_L と Control_R である
	という意味のことが書いてあります。
	そこで、最初に出てきた
		keysym Control_L = Caps_Lock
		keysym Caps_Lock = Control_L
	を実行させてみると、その後の xmodmap -pm の出力は
		shift       Shift_L (0x32),  Shift_R (0x3e)
		lock        Control_L (0x42)
		control     Caps_Lock (0x25),  Control_R (0x6d)
		mod1        Alt_L (0x40),  Alt_R (0x71)
		mod2        Num_Lock (0x4d)
		mod3
		mod4
		mod5        Scroll_Lock (0x4e)
	となります。つまり、「キーコード 0x42(66)番のキーが CapsLock で
	ある、0x25(37)番のキーが Control である」という指定は変わって
	いないのです。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆では、どう書くか☆
	そこで、次のように書きます。
		remove Lock = Caps_Lock
		remove Control = Control_L
		keysym Control_L = Caps_Lock
		keysym Caps_Lock = Control_L
		add Control = Control_L
		add Lock = Caps_Lock
	最初の 2 行で、それぞれの modifier map からキーを削除します。
	続いて、keysym 文でキーを入れ替え、add 文で、いま入れ替えた
	キーをそれぞれの modifier map に追加します。
		【補足】ここで、もし最初の remove 文がなければ、元のキー
		    0x42(66)と 0x25(37)が元の modifier map に
		    残たままになってしまい、xmodmap -pke の出力は
		    次のようになってしまいます。
			lock        Control_L (0x42),  Caps_Lock (0x25)
			control     Caps_Lock (0x25),  Control_R (0x6d),
			            Control_L (0x42)
		    つまり、これでは、どちらのキーも Control の機能と
		    CapsLock の機能を兼ねることになってしまいます。
☆remove と add の評価される順序☆
	最初の
		remove Lock = Caps_Lock
		remove Control = Control_L
	という文は、「その文を解釈した時点において Caps_Lock/Control_L
	が割り当てられているキーすべてを、Lock/Control modifier map から
	外す」という意味です。
	ここで「その文を解釈した時点において」というのは、
		○先に keycode/keysym 文が実行されていたら、その処理を
		 した後で
		○その後に keycode/keysym 文が書いてあっても、それは
		 関係なし
	という意味です。つまり、上の Control/CapsLock 入れ替え例では、
	remove 文の前に keysym 文を実行する場合には
		keysym Control_L = Caps_Lock
		keysym Caps_Lock = Control_L
		remove Lock = Control_L
		remove Control = Caps_Lock
		! 前例と remove 文の右辺が違うことに注意。
		! 以下 add 文は前例と同様
	のように書くことになります。
	一方、そのあとの
		add Control = Control_L
		add Lock = Caps_Lock
	は、「すべての keycode/keysym 文の処理が完了したあとにおいて、
	Control_L/Caps_Lock が割り当てられているキーすべてを、Control/Lock
	modifier map に入れる」という意味です。
	つまり、この場合、右辺の Control_L というのは、keycode/keysym 文
	によるキー交換が終わった後の Control_L、つまり、物理的には CapsLock
	と刻印されている、キーコード 0x42(66)のキーという意味になります。
	なお、これは、add 文が keycode/keysym 文より先に書いてあっても
	同様です。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆べつの実例☆
	いままでは Control と CapsLock の入れ替えを例として紹介してきま
	したが、もう一つの実例を取り上げたいと思います。第 18 回の冒頭でも
	紹介した、PC-98x1 デスクトップマシンでの CapsLock の取り扱いの
	問題です。
	このキーボードの場合、たとえば次のようにするとよいでしょう。
		remove Lock = Caps_Lock
		keysym Caps_Lock = Control_R
		keysym F15 = Caps_Lock
		add Lock = Caps_Lock
		add Control = Control_R
	ここでは、CapsLock と刻印してあるキーを、Control_R(右コントロール
	キー)に変更しています。Control_L でも別にかまわないのですが、区別
	できるのですから別にしておいた方が、あとで何かいいことがあるかも
	しれません。
	また、CapsLock があったほうがいいと考える人のために、F15(vf・5)
	キーに CapsLock の機能を割り当てています。CapsLock 機能がいっさい
	必要ないひとは、その部分をカットしてもいいでしょう。
		【注意】このコードは、実機がないので検証していません。
		    動作保証はいたしかねますのでご了承ください。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
☆次回予告☆
	次回からは Emacs の話に戻ります。が、具体的な予定は、未定です(^^;)
	もうひととおり「言いたいネタ」は出してしまったので、今のところ
		○「便利なマクロ」シリーズ第 4 弾
		 JIS 罫線素を使った絵を簡単に書くマクロ
		○上級者向けに、cons や quote などの綿密な話
		○「便利なマクロ」シリーズの、秀丸エディタへの移植
		 (というより、私は秀丸用と Emacs 用を同時並行で
		  開発しています)
		○マクロを作る手順を step by step で解説
	といったところを考えています。
	なお、次回の発行は年明けになります。
	1 月 8 日(金)には発行したいと思います。
	それでは、よいお年を♪
========================================================================
極私的 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
	
これは「古文書」です。
	古くなった情報も原則未修正で保存していますのでご注意ください。