Xorg/キーボード設定

提供: ArchWiki
2023年7月30日 (日) 21:24時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎よく使われる XKB オプション: 同期)
ナビゲーションに移動 検索に移動

関連記事

この記事は Xorg のキーボード設定の基本を説明しています。キーボードレイアウトの変更や追加のキーマッピングなどの高度な話題については、それぞれ X keyboard extension特別なキーボードキー を参照してください。

Xorg サーバーはキーボードレイアウトを定義するために X keyboard extension (XKB) を使用します。オプションで xmodmap を使って内部のキーマップテーブルに直接アクセスすることもできますが、複雑な作業にはお勧めできません。また、systemdlocalectl を使って Xorg サーバーと仮想コンソールの両方でキーボードレイアウトを定義することができます。

ノート: XKB のオプションは、GNOMEKDE などのいくつかのデスクトップ環境が提供するツールで上書きすることができます。

キーボード設定の表示

次のコマンドを使うことで XKB の設定を表示することができます:

$ setxkbmap -print -verbose 10
Setting verbose level to 10
locale is C
Applied rules from evdev:
model:      evdev
layout:     jp
options:    terminate:ctrl_alt_bksp
Trying to build keymap using the following components:
keycodes:   evdev+aliases(qwerty)
types:      complete
compat:     complete+japan
symbols:    pc+jp+inet(evdev)+terminate(ctrl_alt_bksp)
geometry:   pc(pc104)
xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc+jp+inet(evdev)+terminate(ctrl_alt_bksp)"    };
        xkb_geometry  { include "pc(pc104)"     };
};

サードパーティのユーティリティ

現在使用しているキーボードレイアウトの情報を表示するための"非公式の"ユーティリティも存在します。

$ xkb-switch
us
$ xkblayout-state print "%s"
de

キーボードレイアウトの設定

Xorg のキーボードレイアウトは複数の方法で設定することが可能です。以下は使用されるオプションの説明です:

  • XkbModel はキーボードのモデルを選択します。キーボード上の一部の追加キーにのみ影響を与えます。pc104pc105 は安全なフォールバックです。しかし、例えばラップトップには通常いくつかの追加キーが存在し、適切なモデルを設定することでそれらのキーを利用することができます。
  • XkbLayout はキーボードのレイアウトを選択します。レイアウトを素早く切り替えたい場合などは、カンマで区切ることで複数のレイアウトを指定することが可能です。
  • XkbVariantXkbLayout で利用可能な特定のレイアウトのバリアントを選択します。例えば、sk (Slovak) のデフォルトのバリアントは qwertz ですが、手動で qwerty などを指定することができます。
  • XkbOptions には追加のオプションを含めます (コンマ区切り)。レイアウトの切り替えや、通知 LED、コンポーズモードなどを指定するために使われます。例は #よく使われる XKB オプション セクションを参照してください。
ノート: 指定したレイアウトと同じ数だけバリアントを指定してください。デフォルトのバリアントでいい場合は、空文字を指定してください (カンマはそのまま)。例えば、第一にデフォルトの us レイアウト、第二に us レイアウトの dvorak バリアントを使いたい場合、XkbLayout には us,usXkbVariant には ,dvorak を指定してください。

レイアウトの名前は基本的に2文字の国名コードです。キーボードのモデル・レイアウト・バリアント・オプション、そしてその説明を見たいときは /usr/share/X11/xkb/rules/base.lst を開いて下さい。また、以下のコマンドを使うことで説明なしの一覧を表示することができます:

  • localectl list-x11-keymap-models
  • localectl list-x11-keymap-layouts
  • localectl list-x11-keymap-variants [layout]
  • localectl list-x11-keymap-options

以下のサブセクションにあるサンプルはどれも同じ効果があります。pc104 モデルで、第一レイアウトに jp 第二レイアウトに us を、us レイアウトに dvorak バリアント、そしてレイアウトの切り替えに Win+Space を使うよう設定します。詳しい情報は xkeyboard-config(7) を見てください。

ノート: Fcitx/IBus はキーボードレイアウトの制御を試みるため、これらのフレームワークを使用しているユーザは、以下の方法でうまく行かなかったり、少しの間しか効果がなかったりします。Fcitx のユーザは、1番目の入力メソッドを Keyboard - layout に設定する必要があります。Fcitx#入力メソッドの設定 を参照してください。IBus のユーザは、X の設定ファイルを使用している場合は Preference -> Advanced で "Use system keyboard layout" オプションを有効化する必要があり、setxkbmap を使用している場合は手動でレイアウトを指定する必要があります。

setxkbmap を使う

setxkbmap は、現在の X セッション限定でキーボードレイアウトを設定します。しかし、xinitrcxprofile を使うことで設定を永続化させることができます。これは、次の #X の設定ファイルを使う で指定したシステム全体の設定をオーバーライドします。しかし、外部キーボードなどの場合は、setxkbmap が実行された時にキーボードのデバイス ID が指定されなかった場合、設定は永続化されません。また、キーボードが X サーバのコアキーボードデバイスである場合もです。

使用方法は次の通りです (setxkbmap(1) を参照):

$ setxkbmap [-model xkb_model] [-layout xkb_layout] [-variant xkb_variant] [-option xkb_options]
ノート: setxkbmap は、コマンドラインで指定したオプションを、以前設定したオプション (ルートウィンドウのプロパティに保存されています) に追加します。以前指定したオプションを全て置き換えたい場合は、最初に -option フラグに空の引数を渡してください。

レイアウトだけを変更するには (-layout はデフォルトのフラグです):

$ setxkbmap xkb_layout

複数のカスタマイズを施すには:

$ setxkbmap -model pc104 -layout jp,us -variant ,dvorak -option grp:win_space_toggle

X の設定ファイルを使う

ノート: xorg.conf は X サーバによってスタートアップ時にパースされます。変更を適用するには、X を再起動してください。

X の設定ファイルの構文は Xorg#設定 で説明しています。この方法はシステム全体で適用される設定を作成して再起動後も設定が持続します。

以下サンプル:

/etc/X11/xorg.conf.d/00-keyboard.conf
Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbLayout" "jp,us"
        Option "XkbModel" "pc104"
        Option "XkbVariant" ",dvorak"
        Option "XkbOptions" "grp:win_space_toggle"
EndSection

localectl を使う

X の設定ファイルを手動で編集する代わりに、localectl ツールを使うことができます。このツールは設定を /etc/X11/xorg.conf.d/00-keyboard.conf に保存します。起動時に localectl は変更を上書きするので、手動でこのファイルを編集してはいけません。

使用法は次の通りです:

# localectl [--no-convert] set-x11-keymap layout [model [variant [options]]]

model, variant または options を設定するには、 直前のすべてのフィールドを指定する必要がありますが、 "" で空文字列を渡すことで、 直前のフィールドをスキップすることができます。--no-convert オプションが渡されない限り、指定されたキーマップは最も近いコンソールのキーマップに変換され、 vconsole.confコンソール設定に適用されることもあります。詳しくは localectl(1) を参照してください。

次のコマンドは上のサンプルと全く同じ内容で /etc/X11/xorg.conf.d/00-keyboard.conf ファイルを作成します:

# localectl --no-convert set-x11-keymap jp,us pc104 ,dvorak grp:win_space_toggle
ヒント: localectl は、変数 XKBLAYOUTXKBMODELXKBVARIANT、そして XKBOPTIONS を使用してキーボードの設定を /etc/vconsole.conf にも書き込みますが[1]、Xorg サーバはそのファイルから設定を読み込みません。

よく使われる XKB オプション

キーボードレイアウトの切り替え

キーボードレイアウトを簡単に切り替えられるようにするには、まず、切り替えたい複数のレイアウトを指定してください (最初のレイアウトがデフォルトになります)。次に、切り替えに使用するキー (もしくはキーの組み合わせ) を指定します。例えば、CapsLock キーで US と Swedish レイアウトを切り替えたい場合、XkbLayout の引数に us,seXkbOptions の引数に grp:caps_toggle を指定してください。XkbLayout の個数は XkbVariant の個数と一致している必要があります。別のバリアント間だけで切り替えたい場合は、同じレイアウトを重複して指定してください (例: de,de)。

利用可能なレイアウト (及びバリアント) のリストは xkeyboard-config(7) § LAYOUTS で見られます。レイアウトの切り替えに使用可能なキーの組み合わせは xkeyboard-config(7) § Switching to another layout にリストアップされています。

注意点として、grp:alts_toggle オプションには信頼性がなく、おそらく修正されないでしょう。なので、他のキーの組み合わせが推奨されます。

Alt Shift で言語を切り替える

Alt+Shift をレイアウト切り替えのショートカットとして設定するには、XkbOptionsgrp:alt_shift_toggle を使用してください。

しかし、XKB には、Alt+Shift+any_key という形式の他のショートカットの機能を破壊してしまうという既知の問題が存在します。さらに、XKB は一部のキーボードレイアウトで右 AltAltGr とデフォルトで設定する場合があり、このせいで RAlt+RShift でレイアウト切り替えを行うことができなくなってしまいます。

回避策として、以下を sxhkdrc に追加することで sxhkd をレイアウト切り替えに使用することができます:

Shift_L + Alt_L
    setxkbmap -query | grep -q 'fr' && setxkbmap us || setxkbmap fr,us
Shift_R + Alt_R
    setxkbmap -query | grep -q 'fr' && setxkbmap us || setxkbmap fr,us

とある理由により、AltShift の前に押さないと sxhkd が認識しないことに注意してください。

Ctrl+Alt+Backspace で Xorg を終了する

デフォルトで、キーの組み合わせ Ctrl+Alt+Backspace は無効になっています。XkbOptionsterminate:ctrl_alt_bksp を指定することで有効にできます。また、xmodmap でキーを Terminate_Server にバインドすることでも設定できます (既存の XkbOptions 設定は元に戻ります)。どちらにしても ServerFlagsDontZap 設定を "off" にする必要がありますが、2004年からデフォルトで "off" になっています [2]

Caps Lock と左 Control を交換する

Caps Lock と左 Control キーを交換するには、XkbOptionsctrl:swapcaps を追加してください。次のコマンドを実行することで似たようなオプションとその説明を表示できます:

$ grep -E "(ctrl|caps):" /usr/share/X11/xkb/rules/base.lst

マウスキーを有効にする

現在、マウスキー (マウスに付いているキーのことではありません) はデフォルトで無効にされているので keypad:pointerkeysXkbOptions に加えて手動で有効にする必要があります。Shift+NumLock ショートカットによってマウスキーの切り替えが行えます。

高度な設定については X keyboard extension#マウスの操作 も参照してください。

コンポーズキーの設定

通常、典型的なキーボードにはコンポーズキーなんて存在しませんが、既存のキーをコンポーズキーとして設定することができます。

まず Compose キーを押し、その後に追加のキー (通常は2つ) を押します。典型的な用途としては、キーボードの言語以外の文字を入力するためや、AltGr 修飾キーでは入力できないあまり使用されない文字を入力するためなどがあります。例えば、Compose ' e を押すと é になり、Compose - - - を押すと "エムダッシュ" になります。

いくつかの風変わりなキーボードには Compose キーがありますが、通常、すでにあるキーを Compose キーに置き換えることで使えるようにします。例えば、Menu キーを Compose キーにするには、デスクトップ環境の設定を使うか、XkbOptionscompose:menu を渡します (setxkbmap の場合は setxkbmap -option compose:menu)。利用可能なキー置き換えは /usr/share/X11/xkb/rules/base.lst で定義されています:

$ grep "compose:" /usr/share/X11/xkb/rules/base.lst

欲しいキーマッピングがこのファイルにない場合、xmodmap を使ってキーを Multi_key keysym にマップすることもできます。Multi_key keysym はデフォルトでコンポーズキーとして機能します (xmodmap の設定は setxkbmap によってリセットされることに注意してください)。

キーの組み合わせ

コンポーズキーのデフォルトの組み合わせは /usr/share/X11/locale/used_locale/Compose (used_localeen_US.UTF-8 などです) に保存されているロケールによります。

先のデフォルトのファイルを ~/.XCompose にコピーして、独自のコンポーズキーの組み合わせを定義することができます。または、空の ~/.XCompose を作成し、include "%L" を使ってデフォルトのファイルをインクルードすることもできます。例えば:

~/.XCompose
include "%L"

<Multi_key> <g> <a> : "α"
<Multi_key> <g> <b> : "β"
<Multi_key> <g> <g> : "γ"

コンポーズキー (~/.XCompose 内では <Multi_key> と表記しています) は、数千もの有効な Unicode 文字のどれでも機能します (基本多言語面外のものも含む)。Compose(5) を見てください。XCompose ファイルの形式について説明されています。

ただし、GTK はデフォルトで XIM を使わないので ~/.XCompose に設定したキーが使えません。この問題は、グラフィカル環境の変数 GTK_IM_MODULE=ximXMODIFIERS="@im=none" の両方/片方を設定して GTK に XIM の使用を強制することで修正できます。

ヒント: XIM はとても古く、IBusFcitx5 などの他の入力メソッドの方がうまくいくかもしれません。詳細は インプットメソッド を参照してください。
ノート: XIM では Ctrl+Shift+u の組み合わせで Unicode 文字の挿入ができません。

他のキーで通貨記号を入力する

ほとんどのヨーロッパ言語キーボードでは 5 キーにユーロ記号 (€) が印字されています。Alt+5 などでユーロを打てるようにするには、lv3:lalt_switcheurosign:5 オプションを使って下さい。

ルピー記号 (₹) は同じように rupeesign:4 で使うことができます。

Caps Lock が押されたときにすぐに状態を切り替える

大文字を Caps Lock キーを使って打つ人は、Caps Lock の状態を切り替える時に短い遅延が発生し、2文字以上が大文字になってしまうという経験があるかもしれません (例: THeARch LInux)。これは、Caps Lock キーの有効化は即座に起こりますが、無効化は2つ目のキーが押されたときにしか起こらないからです。この挙動はタイプライター由来です。タイプライターでは Caps Lock の機能はシフトされた活字棒を物理的にロックすることで実現されていて、Shift キーを押して離すとロックが解除されていました。

一部の人気なオペレーティングシステムでは意図的 (一部の人々にとってはこの挙動は紛らわしいため) またはミスでこの挙動が削除されていますが、これは好みの問題です。現在、この挙動を持たない他のオペレーティングシステムから反映された挙動に切り替える簡単な方法が存在しないため、バグレポートは X サーバのバグトラッカーに投稿されたままです。この問題を追跡したい場合は、バグレポートと最新の進捗状況が [3][4] で見られます。

解決方法

まず、キーボードの設定をファイルにエクスポートしてください:

$ xkbcomp -xkb $DISPLAY xkbmap

xkbmap ファイルの中から key <CAPS> から始まる Caps Lock のセクションを探してください:

 key <CAPS> {         [       Caps_Lock ] };

以下のコードでセクション全体を置き換えてください:

key <CAPS> {
    repeat=no,
    type[group1]="ALPHABETIC",
    symbols[group1]=[ Caps_Lock, Caps_Lock],
    actions[group1]=[ LockMods(modifiers=Lock), Private(type=3,data[0]=1,data[1]=3,data[2]=3)]
};

キーボード設定を保存してリロード:

$ xkbcomp -w 0 xkbmap $DISPLAY

リロードした設定は再起動すると消えてしまうため、X の起動時に上記のコマンドを自動的に実行させるようにしても良いでしょう。

One-click key functions

To assign an additional one-click function to a modifier key, you can use xcape. For example it is possible to have CapsLock work as Escape when pressed alone, and as Control when used with another key. First set the Control swapping using setxkbmap as mentioned earlier, and xcape to set the Escape association:

 $ xcape -e 'Caps_Lock=Escape'

You can set multiple associations separated with a semicolon, e.g.: Caps_Lock=Escape;Shift_L=Escape.

If you hold a key for longer than the timeout value (default 500 ms), xcape will not generate a key event.

typematic delay と rate の調整

typematic delay はキーリピートを始めるのにキーを押し続ける必要がある時間 (ミリ秒) を表します。キーリピートが開始されると、typematic rate によって指定された頻度 (Hz) で文字が繰り返されます。これらの値は xset コマンドを使うことで変更できます:

$ xset r rate delay [rate]

例えば typematic delay を 200ms に typematic rate を 30Hz に設定するには、次のコマンドを実行します (xinitrc を使えば設定を永続化できます):

$ xset r rate 200 30

delay や rate の値を指定しないでコマンドを実行することで typematic の値をデフォルト (delay は 660ms で rate は 25Hz) に戻すことができます:

$ xset r rate

Using AutoRepeat configuration option

To persist the configuration and change the seat defaults, you can create an Xorg configuration file as described in #Using X configuration files, and add a AutoRepeat section entry: [5]

/etc/X11/xorg.conf.d/00-keyboard.conf
Section "InputClass"
        ...
        Option "AutoRepeat" "200 30"
        ...
EndSection

参照