web-dev-qa-db-ja.com

<esc>と<capslock>を、外部キーボードで持続する方法で交換する

以下を含む〜/ .speedswapperというファイルがあります。

! Swap caps lock and escape
remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock

...実行するとxmodmap ~/.speedswapper、これは esc そして Caps Lock キー。 〜/ .profileにこの行があるので、ログインするたびにこれらのキーが切り替えられます。

ただし、外付けUSBキーボードを接続すると、この設定が持続しないようです。私のラップトップのキーボードは完全に機能しますが、外部キーボードが2つのキーを切り替えるには、コマンドを再度実行する必要があります。幸いなことに、そうすることは私のラップトップのキーボードに影響を与えないようです-それらは同期しているようです。

1つの解決策は、外部キーボードが接続されているときはいつでもそのxmodmapコマンドを実行する方法を見つけることですが、より堅牢であれば、別のキーワッピングソリューションを利用できます。 OSはUbuntu13.04です。

Justbrowsingのコメントを考えると、これはudevルールを作成することで実現できるようです-RUNオプションを使用する必要があり、/ dev/hidraw0または/ dev/hidraw1でトリガーする必要があると思います。キーボードを接続すると表示されます...しかし、私はまだコンセプトに頭を悩ませようとしているので、udevで何をしているのかを知っている誰かの助けをいただければ幸いです。

8
evilsoup

このコマンドは~/.profileにあるため、ログイン時に1回だけ実行されます。あまり洗練されていない解決策の1つは、代わりにコマンドを~/.bashrcに配置することです。ターミナルを開くたびに実行します。

より良い解決策は、USBキーボードが挿入されたときにudevを実行するxmodmapルールを定義することです(USBキーボードに返された値を使用しているので、このソリューションを次のように編集する必要がありますあなたに合う):

  1. USBキーボードの詳細を取得します。キーボードを接続した状態で次のコマンドを実行します。

    $ /lib/udev/findkeyboards | grep USB
    USB keyboard: input/event6
    
  2. udevルールを作成するには、それらが何と一致するかを知る必要があります。これは、udevadm info --export-dbの出力でevent6エントリを検索するか、次のように直接解析することで取得できます。

    udevadm info --export-db | Perl -ne 'BEGIN{$/="\n\n"}print if /event6/'
    

    これにより、使用するテキストを含む数行のテキストが返されます。

    E: ID_MODEL_ID=0002
    [...]
    E: ID_VENDOR_ID=1c4f
    
  3. udevは、xmodmapのようなXプログラムを使用すると複雑になり、$DISPLAY$XAUTHORITYをエクスポートするときにも機能させることができませんでした。とにかく、私はそれをあなたのメソッドで動作させることができなかったので、私のソリューションは代わりにkeymapを使用します。まず、次のキーコードを見つける必要があります Esc そして Caps Lock、実行することでこれを行うことができます

    Sudo /lib/udev/keymap -i input/event6
    

    次に、関連するキーを押します。私のシステムでは、これは次のようになります。

    scan code: 0x70029   key code: esc
    scan code: 0x70039   key code: capslock
    
  4. 次の行を含む新しいキーマップルールを作成します。

    0x70029 capslock
    0x70039 esc
    

    /lib/udev/keymaps/speedswapとして保存します。

  5. 新しいudevルールを定義します。 /etc/udev/rules.d/95-speedswap.rulesというファイルを作成し、次の行を追加します。

    ACTION=="add", 
    SUBSYSTEM=="input", 
    ATTRS{idVendor}=="1c4f", 
    ATTRS{idProduct}=="0002", 
    RUN+="keymap $name speedswap"
    

少なくとも私のシステムでは、外部USBを接続するとそれができるはずです Esc のように振る舞う Caps Lock およびその逆

3
terdon