ciguwerao

<< 前の記事 | main | 次の記事 >>

2016/07/12の記録:xkbのmodifierの設定について

謎が残ったままで解明されたわけではないが、とりあえずわかったことだけメモしておく。
(環境はDebian Jessie LXDE on Inspiron 2200)

きっかけはqiitaoyasさんという方の次の記事を読んだこと。

キーボードレイアウト(キーマッピング)については僕もいろいろいじっていることもあり、記事を拝読して試してみたいことが出てきた。

oyasさんはCaps LockキーをEscapeとして使う設定をしてらっしゃるようなのだが、そのためにxkbの "option" の "caps:escape" を利用されているとのこと(どういう方がそのような設定を必要とされるのだろう。プログラミングなどをされてる方なのだろうか。オプションに用意されているということはそれを必要とする人が結構いるということだろうが、エスケープキーをほとんど使うことのない僕には、想像がつかない)。

しかし、その際に問題があって、Caps Lockキーを押すとEscとCaps Lockの両方の効果が出てしまうそうだ。

その問題の解決方法を記事の中で紹介されているわけだが、その仕組みなんかを考えているうちに、oyasさんのやり方とは別のやり方でもそれを解決できそうに思ったので、それを検討してみたというわけ。

先の不具合が出る理由として僕がまず思いついたのが、keysymをEscapeに変えてもCaps Lockキーに割り振られたmodifierが残ってしまったためでないか、ということ。

というのは、modifierはなかなかめんどくさいもののようで、modifierの絡むキーの変更をxmodmapを使って行う際には、一旦modifierを外してから、やりたいキーの変更をし、そのあとで改めてmodifierをつけ直す、ということをしなければならない。

今回の件に絡むmodifierは "Lock" というやつだが、Caps LockキーをEscとして使う、という事なら、そもそもこのLockというmodifierはいらなくなるはずだ。

というわけで、LockをCaps Lockに割り振る設定を無効にしてしまえば良い、というのが僕のアイデア。

"xmodmap" コマンドをやるとどういうmodifierがあるかわかるが、それを見るとそれぞれのmodifierは一つもしくは複数のkeysymに割り当てられているようである。しかしmodifierをkeysymに割り当てる設定をしている書類がどれなのかわからなかった。

oyasさんの記事にあるように "setxkbmap -print" というコマンドをターミナルでやれば、どんな書類が効いているかがわかるので、そこに出てくる書類をひとつづつ確認していった結果、
/usr/share/X11/xkb/symbols/pc
という書類がその書類だということが、今回初めてわかった。

そこで、oyasさんの使ってらっしゃる "caps:escape" というオプションを/etc/default/keyboardで設定したうえで(他にもやり方があるかもしれないが僕はxkboptionsの設定はいつもこれでしている)、/usr/share/X11/xkb/symbols/pcの36行目の

modifier_map Lock { Caps_Lock };

の前にスラッシュを二つつけて無効にして再起動してみた。

エスケープの使いどころがよくわからないので十分な確認はできていないが、Caps Lockを押してもロックがかかるということはないし、xevで見てみるとキーシムはちゃんとエスケープになっている。このやり方はうまく行くということにする。

もうすこし欲張ってみる。

どうせ/usr/share/X11/xkb/symbols/pcをいじるのなら、必要な設定はここでしてしまって、オプションは使わなくとも済ませたい。

そこで、22行目の

key <CAPS> { [ Caps_Lock ] };

の "Caps_Lock" のところを "Escape" に書き換える。そして/etc/default/keyboardの方のoptionの設定は削除。

これだけならうまく行くのだが、さらに欲張ってみた。

上でmodifierの指定の行(36行目)を無効にしたが、できるだけオリジナルのファイルからの変更は少なくしたいので、さっきつけたスラッシュ二つを削除した。

というのは、デフォルトでは22行目で "key <CAPS>" にkeysym "Caps_Lock" を当てたうえで、そのkeysym "Caps_Lock" に36行目でmodifier "Lock" を当てているわけで、今22行目で当てるキーシムを "Caps_Lock" ではなく "Escape" にしたのだから、どうせ36行目は無効になるはずだ、と読んだわけ。(別の表現をすれば、keysym "Caps_Lock" はどこにも記述がなくなったのだから、そのキーシムは欠番で無効になるだろう、という考え)

しかし、この読みは間違っていた。

36行目を有効にしてしまうと、Caps Lockキーはoyasさんのもともとの不具合と同様、EscapeとCaps Lockの二重の効果が出てしまうようだ。

この辺、何が起こっているのかよくわからないので、試しに22行目は

key <CAPS> { [ Escape ] };

にしたままで、36行目も

modifier_map Lock { Escape };

と、何もかもエスケープにしてみた。

こうすると何が起こったかというと、Caps Lockキーは働きとしてはエスケープになり、ロックはかからない。Escキーは、働きはエスケープだが、ロックもかかる、という状態になった。

ということは、modifierの設定は、キーシムにmodifierを当てているように見えて実際にはキーにmodifierを当てているということだ。(今やった変な設定ではCaps LockとEscの両キーともキーシムはEscapeになっているのにmodifierとしてはEscキーだけが機能しているから)【*】

では、modifier設定で使われる "Caps_Lock" とか "Escape" とかをそれぞれのキーと結びつける設定はどこでしているのか。これを研究しなければならぬ。

これが冒頭で書いた、今日の段階では解明されずに残った謎。

== 追記 ==

*この辺、その後いろいろな設定を試してみたところ、そうとは言えなそうだ、ということがわかった。

ひとつひとつ設定を試すたびに、僕の予想が覆された。

以下、試した設定とその結果を書いていく。

設定1(デフォルト設定)
Escキー:Escape
Caps Lockキー:Caps_Lock
modifier Lock:Caps_Lock

結果
Escキー:Escape(ロック効かず)
Caps Lockキー:Caps Lockとして機能(ロックが効く)

これは当たり前。

設定2
Escキー:Escape
Caps Lockキー:Caps_Lock
modifier Lock:無効

結果
Escキー:Escape(ロック効かず)
Caps Lockキー:Caps Lockとして機能(ロックが効く)

modifierを無効にしてもCaps LockキーはCaps Lockとして使える。

設定3
Escキー:Escape
Caps Lockキー:Caps_Lock
modifier Lock:Escape

結果
Escキー:Escape(ただし、ロックが効く)
Caps Lockキー:Caps Lockとして機能(ロックが効く)

modifier設定は有効。modifier設定していないCaps Lockキーもしかし、Caps Lockとして使える。

設定4
Escキー:Caps_Lock
Caps Lockキー:Escape
modifier Lock:Escape

結果
Escキー:Caps Lockとして機能(ロックが効く)
Caps Lockキー:Escape(ただし、ロックが効く)

Caps LockとEscapeの入れ替え。上の結果からすれば、こんな感じか。

設定5
Escキー:Caps_Lock
Caps Lockキー:Escape
modifier Lock:無効

結果
Escキー:Caps Lockとして機能(ロックが効く)
Caps Lockキー:Escape(ロック効かず)

まあそうだろね。

設定6
Escキー:Caps_Lock
Caps Lockキー:Escape
modifier Lock:Caps_Lock

結果
Escキー:Caps Lockとして機能(ロックが効く)
Caps Lockキー:Escape(ロック効かず)

キーにmodifierを当てているという本文での判断は、これで崩れる。

設定7
Escキー:Caps_Lock
Caps Lockキー:Caps_Lock
modifier Lock:Caps_Lock

結果
Escキー:Caps Lockとして機能(ロックが効く)
Caps Lockキー:Caps Lockとして機能(ロックが効く)

まあそうなのだろうとは思うが、本文で書いた全てをエスケープにした場合(下に設定12として改めて書いた)との整合性が取れないのが気に入らない。

設定8
Escキー:Caps_Lock
Caps Lockキー:Caps_Lock
modifier Lock:無効

結果
Escキー:Caps Lockとして機能(ロックが効く)
Caps Lockキー:Caps Lockとして機能(ロックが効く)

キーシムをCaps_Lockにすると、modifierを設定しなくともCaps Lockとして働く。

設定9
Escキー:Caps_Lock
Caps Lockキー:Caps_Lock
modifier Lock:Escape

結果
Escキー:Caps Lockとして機能(ロックが効く)
Caps Lockキー:Caps Lockとして機能(ロックが効く)

modifier "Lock" を別のキーシムに当てても、キーシムCaps_LockはCaps Lockとして働く。

設定10
Escキー:Escape
Caps Lockキー:Escape
modifier Lock:Caps_Lock

結果
Escキー:Escape(ロック効かず)
Caps Lockキー:Escape(ただし、ロックが効く)

本文で最初に試した設定。modifierが生き残ってしまう。

設定11
Escキー:Escape
Caps Lockキー:Escape
modifier Lock:無効

結果
Escキー:Escape(ロック効かず)
Caps Lockキー:Escape(ロック効かず)

本文で目指した設定。うまくいく。

設定12
Escキー:Escape
Caps Lockキー:Escape
modifier Lock:Escape

結果
Escキー:Escape(ただし、ロックが効く)
Caps Lockキー:Escape(ロック効かず)

本文で試してみた設定。本文を書いた段階ではデフォルト(設定1)と設定10–12だけを知っていたために本文末尾に書いたような判断をしてある程度納得したわけだが、こうしてみてくるとその判断は訂正しなければならない。

この設定でこういう結果が出る意味がわからない。

以上、結果からはどうにも納得いく合理的説明ができない。

わけがわからないと申し上げておく。

わけがわからないのである。

| Linux関連 | 13:36 | comments(0) | trackbacks(0) |

スポンサーサイト

| - | 13:36 | - | - |
コメント
コメントする








この記事のトラックバックURL
http://ciguwerao.jugem.jp/trackback/528
トラックバック
ciguwerao
CALENDAR
S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< August 2017 >>
LATEST ENTRIES
SELECTED ENTRIES
CATEGORIES
ARCHIVES
SPONSORED LINKS
qrcode