ciguwerao

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

2017/02/11の記録:Linux Mint 18.1 Cinnamonで初代iMacのキーボード用の設定

必要ないのに思わず買ってしまったリナミンシナモンパソコンの設定ネタをもうひとつ。

ひとつの記事にしても良かったが話が変わるので分けた。

リナミンシナモンのために買った格安パソコンは、格安である以上当然本体だけでモニターもキーボードもマウスもない。

古いのを使うわけだが、幸いモニターは兄の使い古しをもらってあったし、マウス・キーボードも予備はそれなりにある。

キーボードについては、テンキーはあったほうがいいがコンパクトな方がいい、ということで、初代iMacのやつを使うことにした。

このキーボードの欠点はDeleteがないことだが、それについてはxmodmapを使ってあまり使わないhelpキー(LinuxではInsertになる)をDeleteにあてるようにする。
(xmodmapについては古い記事だが2014/03/31の記録を参照のこと)

もう一つの問題は左Controlの位置。

マックのパソコンではcontrolはタブと左シフトの間に来て、caps lockが左下にある。

マックで使う分には別にどうでもいいのだが、リナックスやウインドウズではマックでのコマンドキーの代わりにControlを使うことになるので、その位置は重要になる。

Control_LとCaps_Lockを入れ替えたい。

最初、簡単な方法として、

setxkbmap -option ctrl:swapcaps

をログイン時に自動起動させるように設定していた。

しかし、これだと、日本語を打つためにMozcを使っている状態で左Controlのつもりで左下隅のキーを押すと、Caps Lockの機能が一部残ってしまうらしく、ひらがなではなくローマ字が入力されるようになってしまう。

これは以前、2016/07/12の記録で紹介したqiitaoyasさんという方の記事に書かれている事例と似た事例のようだ。

modifierの付け外しがうまくいってないと思われる。【

で、僕の使っている "ctrl:swapcaps" というxkbのオプションを規定している
/usr/share/X11/xkb/symbols/ctrl
という書類を見てみると、そのswapcapsの内容は次のように至って簡素で、modifierの付け外しについてちゃんとやってくれていないようにやはり見える。

// Swap the functions of the CapsLock key and the left Ctrl key.
partial modifier_keys
xkb_symbols "swapcaps" {
    replace key <CAPS> { [ Control_L ] };
    replace key <LCTL> { [ Caps_Lock ] };
};

そこで、上でもリンクを貼った2014/03/31の記録の際に参考にした

というページで紹介してくださっているやり方、具体的にはxmodmapでコントロールとキャプスロックを入れ替える際の記述内容を、使わせてもらうことにした。

こちらのほうが、記述内容を見る限り、modifierの扱いが手厚い。

remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

見てわかるように、一旦modifierを外してからキーの入れ替えをし、もう一遍modifierを付け直している。

考えてみれば、上に書いたようにDeleteのためにどうせxmodmapを使っているのだから、最初からこれをxmodmapで呼び出す ".xmodmap" という書類(ホーム直下に置いておく)に付け加えておけばよかった。

このやり方なら、問題なく左ControlとCaps Lockの入れ替えができた。

僕がxmodmapをあまり使わないのは、主に使っている環境であるDebian LXDEではなぜだかわからないがこのxmodmapをログイン時に自動起動させられない(手動でなら機能する)からなのだが、ちゃんと使えるのであればやっぱり便利なものだ、と改めて実感した。

せっかくなので、僕がログイン時に自動起動させることにした ".xmodmap" の記述内容を書いておこう。

keycode 118 = Delete Insert
remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

一行目がhelpキーをDeleteにする設定で、もともとの機能であるInsertはシフトと一緒に押せば使えるように第二レベルに設定しておいた。

その後は上掲のページで教えていただいたものをそっくりそのまま書いただけ。

== 02/21追記 ==

modifierの付け外しの問題というのは僕の勝手な思い込みで、勘違いかもしれません。

まず、問題の起こる状況でxmodmapを使ってmodifierを外してみても、問題は解消されません。

状況をよく確認したところ、問題の起こるのはあくまでmozc (fcitx) を使っている時だけで、それ以外の時は特に問題はなさそうです。

また、mozc用に使うキーボードレイアウト(mozcの設定の方ではなく、fcitxの設定のほうでmozcをダブルクリックすると選択できる)を、「規定の入力メソッド」ではなく「日本語」にしてあるのですが(「規定の入力メソッド」をカナディアンフレンチにしてあるため)、これを「規定の入力メソッド」に戻すと、mozc使用時にも問題が起きません。

以上から、xkbのオプションの設定は規定のレイアウトには効くがfcitx-mozcから呼び出したjpレイアウトには効かない、ということかもしれません。一方xmodmapの方はmozcのjpにまで効力が及ぶ、ということ。

ただ、Caps Lockとして使うことにしたもともとのControlキーの方は、mozc上でもCaps Lockとして機能する点が、この推測とぶつかります。

Controlとして使いたいCaps Lockキーの方も、mozc上でも完全にCaps Lockとしてだけ機能するわけではなく、Controlとしても機能する一方、Caps Lockの機能のうちひらがな入力を英数字入力に切り替える機能は働く一方、小文字を大文字にする機能は働きません。
(そもそも英数字への切り替えがどうして起こるのか、どこでその機能が設定されているのかがわかりません。mozc設定を見てもfcitx設定を見ても、そういう設定はなさそうなのですが)【下のさらなる追記を参照のこと。消線部以下同じ】

ということで、xkb optionがmozcのjpに効力が及ばないとしても、完全に及ばないのではなく一部しか及ばない、ということになるでしょう。元の認識と合わせて、modifierの付け外しがmozc上のjpではうまくいかない、ということかもしれません。

問題が解消しない、尻切れトンボな内容ですみません。いずれにしても、xmodmapが使える環境であれば、そちらを使えば問題ありません。

もうひとつ、本文で触れたoyasさんの記事に書かれている事例と症状は似ているのですが、oyasさんのなさってる方法をまねしてみても、つまり
/usr/share/X11/xkb/symbols/ctrl

partial modifier_keys
xkb_symbols "swapcaps" {
    replace key <CAPS> { [ Control_L, Control_L ] };
    replace key <LCTL> { [ Caps_Lock, Caps_Lock ] };
};

としてみても、うまくいきません。

症状は似ていても、別の問題なのかもしれません。

== さらなる追記 (02/21) ==

先ほど(上の追記)はちょろっと調べてちょろっと書いてしまったので検証不十分な内容になってしまいましたが、その後落ち着いて調べてみました。

わからないことはわからないままではありますが、あらましのことはつかめ、とりあえずの対処法もわかりました。

まず、modifierは関係なさそうです。

問題の肝は、どこで設定されているのかわからない、と上で書いたCaps Lockキーの英数入力への切り替え機能にあり、それは他ならぬjpレイアウトで規定されていたものでした。

/usr/share/X11/xkb/symbols/jp
という書類の、"key <CAPS>" の行(僕の環境では47行目)を見れば、jpレイアウトではキャプスロックキーの第一レベルに "Eisu_toggle" というkeysymが設定されていることがわかります。

Caps_Lock自体は第二レベル。

確かに、マックではないパソコンではキャプスロックをするためにシフトとキャプスロックを一緒に押す必要があるなあ、とは思っていたんですが、僕は漠然とMicrosoftの趣味なんだと思ってました。jp配列 (JIS?) の趣味だったんですね。

この設定が、なぜかxkbのoptionでは取り消せないことが、不具合の原因でした。なぜかはわかりません。

xmodmapではその設定を消せるから、うまくいくのでしょう。

両者に違いが出るのは、xkbのoptionや "symbols" を規定した書類では <CAPS> や <AE07> といった、よくわからないのですがkeyと呼ばれてるんじゃないかと思われるものにkeysym ("Control_L" や "k" や "kana_A" などです)が当てられているのに対して、xmodmapでは、8から255までの数字であるところのkeycodeにkeysymを当てるからではないかと思われます。

xkbの設定書類ではまずkeycodeにkeyを当て、次にkeyにkeysymを当てる仕組みになっています。キーボード(機械)によって同じキーでも送られる信号が必ずしも一致しないためにこういう仕組みが必要なのだと推測しています(昔はともかく最近では大抵同じみたいですが)。どのタイプの機械なのか、によってkeycodeとkeyの対応が決まり、それとは別に、使用するレイアウト(普通は使う言語)ごとにkeyとkeysymの対応が決まるわけです。ですから、keycodeを扱うxmodmapを使う場合は自分のいじりたいキーのkeycodeを、"xev" みたいな仕組みを使って確認する必要があります。keycodeとkeysymをじかに当ててしまうとそういう面倒があるのですが、今回の問題はkeyのレベルで起きるために、かえってそこを飛ばしてしまうxmodmapならばうまくいくのではないか、と、これも僕の推測にすぎませんが、今のところ考えています。

それはともかく、xmodmapを使わない対処法を考えるとなると、xkbのoptionではうまく行かない以上、レイアウト自体をいじっちゃうのが一番手っ取り早そうです。

jpレイアウトから <CAPS> に関する設定を削っちゃうわけです。

基本的にこの前01/26の記録でやったのと似たような作業です。

その記事にも書いたようにデフォルトの記述自体をいじっちゃうのが一番楽なのですが、それはあまりに乱暴なので、面倒ですが付け加える形で行きます。

jpレイアウトの設定書類は上に書いたように
/usr/share/X11/xkb/symbols/jp
です。これに付け加えます。

この書類の内容がどうなってるかというと、まず "106" というヴァリアント名が一応付いているデフォルトの設定(jpとだけ選べばそれになるもの)が書かれていて、その下に様々なヴァリアントが続いています。ローマ字入力ではなくかな入力の場合のヴァリアントとかです。

そのヴァリアントの一つとして、新しくさしあたり "EISU_Nashi" と名付けたのを付け加えるわけです。

そもそもデフォルトの106ヴァリアントはその大部分を "common" というヴァリアントをinclude、つまり読み込んで、足りない部分だけを記述する形になっていますから、僕の作るEISU_Nashiヴァリアントでもcommonをincludeする形にしたいんですが、そのcommonのなかににっくき "key <CAPS>" の行が入っちゃっているものですから、そうもいきません。

この行を、例えば

key <CAPS> { [ Caps_Lock, Caps_Lock ] };

と改めて設定しなおしてもいけそうに思うんですが、試したらそれではダメなんですね。optionがダメなのと同じ理由だと思われます。

アホな話ですが、これをやってsetxkbmap -option ctrl:swapcaps をやると、左コントロールキーもキャプスロックキーも両方キャプスロックになります。

なんでキャプスをコントロールにするのはうまくいかないのにコントロールをキャプスにする方はうまくいくんだよ、と思います。本当にアホだと思います。

で、仕方ないのでincludeは諦めて、全部のキーの記述をコピーしてきた上で、にっくき <CAPS> の行と、ついでなので別に要らないはずだと思うのにわざわざ書いてある <LCTL> の行だけを消しちゃいます。

消しちゃうのは不安かもしれませんが、jpに限らず多分すべてのレイアウトが、一番の基盤であるところの "pc" レイアウト(のデフォルトである "pc105" ヴァリアント)を読み込んだ上で、その上に乗っける形で使うことになるようです。(ターミナルで "setxkbmap -print" をやってみればそれがわかります)

modifier絡みのような大事そうなキーについてはそれで規定してあるので、個々のレイアウトでは別に規定する必要はないんですね。

LCTLは要らないはずだ、と上で書いたのはそういう意味で、CAPSの方はpcと内容が違うので書く必要があるのはわかるんですが、LCTLの方はなんで書いてあるのかわかりません。

僕の作ったjp配列のEISU_Nashiヴァリアントの記述内容を以下に貼り付けておきます。デフォルトの106の固有の記述に、それがincludeしているcommonの記述をくっつけて、そこからCAPSとLCTLの行だけを削ったものです。
(本当は、このEISU_Nashiをcommonがincludeして、僕が削ったCAPSとLCTLだけをcommon固有の設定として書く、というのが書類の書き方としては綺麗なんでしょうが、もともとのものをいじるのはなるたけ避けたいので、無駄に長い書類になっています)

partial alphanumeric_keys
xkb_symbols "EISU_Nashi" {

    name[Group1]= "Japanese";

    key <AE10> { [ 0, asciitilde   ] };
    key <AE13> { [ backslash, bar  ] };

    key <HZTG> {
        type[Group1]="PC_ALT_LEVEL2",
        symbols[Group1]= [ Zenkaku_Hankaku, Kanji ]
    };

    key <AE01> { [ 1, exclam       ] };
    key <AE02> { [ 2, quotedbl     ] };
    key <AE03> { [ 3, numbersign   ] };
    key <AE04> { [ 4, dollar       ] };
    key <AE05> { [ 5, percent      ] };
    key <AE06> { [ 6, ampersand    ] };
    key <AE07> { [ 7, apostrophe   ] };
    key <AE08> { [ 8, parenleft    ] };
    key <AE09> { [ 9, parenright   ] };
    key <AE11> { [ minus, equal    ] };
    key <AE12> { [ asciicircum, asciitilde ] };

    key <AD01> { [ q, Q            ] };
    key <AD02> { [ w, W            ] };
    key <AD03> { [ e, E            ] };
    key <AD04> { [ r, R            ] };
    key <AD05> { [ t, T            ] };
    key <AD06> { [ y, Y            ] };
    key <AD07> { [ u, U            ] };
    key <AD08> { [ i, I            ] };
    key <AD09> { [ o, O            ] };
    key <AD10> { [ p, P            ] };
    key <AD11> { [ at, grave       ] };
    key <AD12> { [ bracketleft, braceleft ] };

    key <AC01> { [ a, A            ] };
    key <AC02> { [ s, S            ] };
    key <AC03> { [ d, D            ] };
    key <AC04> { [ f, F            ] };
    key <AC05> { [ g, G            ] };
    key <AC06> { [ h, H            ] };
    key <AC07> { [ j, J            ] };
    key <AC08> { [ k, K            ] };
    key <AC09> { [ l, L            ] };
    key <AC10> { [ semicolon, plus ] };
    key <AC11> { [ colon, asterisk ] };
    key <AC12> { [ bracketright, braceright ] };

    key <AB01> { [ z, Z            ] };
    key <AB02> { [ x, X            ] };
    key <AB03> { [ c, C            ] };
    key <AB04> { [ v, V            ] };
    key <AB05> { [ b, B            ] };
    key <AB06> { [ n, N            ] };
    key <AB07> { [ m, M            ] };
    key <AB08> { [ comma, less     ] };
    key <AB09> { [ period, greater ] };
    key <AB10> { [ slash, question ] };
    key <AB11> { [ backslash, underscore ] };

    key <NFER> { [ Muhenkan        ] };

    key <XFER> {
        type[Group1]="PC_ALT_LEVEL2",
        symbols[Group1]= [ Henkan, Mode_switch ]
    };

    key <HKTG> {
        type[Group1]="PC_ALT_LEVEL2",
        symbols[Group1]= [ Hiragana_Katakana, Romaji ]
    };

    key <EISU> {
        type[Group1]="PC_ALT_LEVEL2",
        symbols[Group1]= [ Eisu_toggle ]
    };

    key <KANA> {
        type[Group1]="PC_ALT_LEVEL2",
        symbols[Group1]= [ Hiragana_Katakana ]
    };

    key <PRSC> {
        type[Group1]= "PC_ALT_LEVEL2",
        symbols[Group1]= [ Print, Execute ]
    };
};

/usr/share/X11/xkb/symbols/jp
の最後にこれを書き足し、あとはこの前と同様

  • /usr/share/X11/xkb/rules/evdev.lst
  • /usr/share/X11/xkb/rules/evdev.xml

という書類をいじります。(この前はoptionの追加だったのでもうひとつ拡張子なしの "evdev" という書類もいじったのですが、すでにあるレイアウトのヴァリアントの追加の際は2つだけでいいようです)

この2つの書類に、それぞれ次のような記述を付け加えます。

場所は、jpのdvorakの設定があると思うので、その下でいいと思います。わかりやすくするために、そのdvorakの内容と合わせて書いておきましょう。

  dvorak          jp: Japanese (Dvorak)
  EISU_Nashi      jp: Japanese (Without EISU)
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Japanese (Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>EISU_Nashi</name>
            <description>Japanese (Without EISU)</description>
          </configItem>
        </variant>

これで、システムを再起動させればjpレイアウトのEISU_Nashiヴァリアントが、普通のキーボードレイアウトのような顔をして色んな所に出てくるようになると思います。

例えばfcitxでは「入力メソッド」の一つとして選べるようになります。

また、
/etc/default/keyboard
という書類に次のように書けば、システムのレイアウトとして使えるようになります。

XKBMODEL="pc105"
XKBLAYOUT="jp"
XKBVARIANT="EISU_Nashi"
XKBOPTIONS="ctrl:swapcaps"

ターミナルで

setxkbmap -layout jp -variant EISU_Nashi -option ctrl:swapcaps

とやれば、そのセッションの間は使えるようになります。

これをログイン時に自動起動させるようにすれば、個人設定にできます。

(この記事のそもそもの目的であるコントロールとキャプスロックの入れ替えのオプションを書いておきましたが、不要な場合はオプションの記述を削除します。上の方は "" で大丈夫。逆に、すでに書いてあるのに付け加える場合は , で区切ります。カンマの前後スペース無しです)

キーボードレイアウトの設定方法はこの他にもいろいろあり、参考になる記事がたくさん見つかると思います。このブログにもいくつか記事がありますが、この記事でわかるように僕の文章は読みづらいので、他の方のまとめられたものを探されたほうが良いと思います。

========
| Linux関連 | 17:18 | comments(0) | trackbacks(0) |

スポンサーサイト

| - | 17:18 | - | - |
コメント
コメントする








この記事のトラックバックURL
http://ciguwerao.jugem.jp/trackback/576
トラックバック
ciguwerao
CALENDAR
S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    
<< October 2017 >>
LATEST ENTRIES
SELECTED ENTRIES
CATEGORIES
ARCHIVES
SPONSORED LINKS
qrcode