xremapを使ったキーバインドの設定

linux の日本語入力について xremap という PC のキーを変更するソフトを利用して挫折していた SKK 入力方式を再練習しています。 ちなみに、使用している PC 環境は arch linux となります。

rn.nyaomin.info

少し前に SKK という日本語入力方式を使用して挫折していましたが、世の中には "SandS" と呼ばれる技があるというのを知りました。 SandS が何かと言うと、スペースキーを Shift キーとして使用する方法のことです。 Space and Shift の簡易略で sands と言うみたいです。

スペースキーを押している時は Shift キーとして動作し、単体で使用した時はスペースキーとして動作させるようです。 メリットとしては押し難い Shift キーを使用せずに、スペースキーで代替できることです。 デメリットとしてはスペースキーを押し続けた時に連続で空白を入力できなくなることです。 連続で空白を入力することはほとんど必要ないと思うので、メリットの方が上回っていると思います。

この動作を実現するためには PC のキーを再設定することの出来るソフトを導入する必要があります。 少し調べると下記のソフトが出てきます。

  1. xremap
  2. evremap
  3. keyd

この中から私は xremap を使うことにしました。 理由は設定がわかりやすいこと、アプリケーション別にキーの割り当てを変更できる機能があることから選んでいます。

細かい設定の方法は公式の github を参照してもらうと詳しく書かれています。 簡単に書くと config.yml ファイルを用意して xremap を実行する時に指定して実行すればよいです。

キー別に押し続けた時、離した時の動作を設定することができ、Ctrl や Shift との同時押しも設定できます。

私は結局、下記のような設定で運用してみることにしました。

name: Ekey 以下は emacs keybind と言われる部分で、公式サイトのリンクを参照しています。

    modmap:
      - name: SandS
        remap:
          Space:
            held: [Shift_L]
            alone: [Space]
          CapsLock: LEFTCTRL
          Shift_L:
            held: [Shift_L]
            alone: [Esc]
    
    keymap:
      - name: Ekey
        application:
          not: [konsole.konsole]
        remap:
          # Cursor
          C-b: { with_mark: left }
          C-f: { with_mark: right }
          C-p: { with_mark: up }
          C-n: { with_mark: down }
          # Forward/Backward word
          M-b: { with_mark: C-left }
          M-f: { with_mark: C-right }
          # Beginning/End of line
          C-a: { with_mark: home }
          C-e: { with_mark: end }
          # Newline
          C-m: enter
          # Delete
          C-d: [delete, { set_mark: false }]
          C-h: [backspace, { set_mark: false }]
          # Cancel
          C-g: [esc, { set_mark: false }]
          # C-x YYY
          C-k:
            remap:
              C-b: C-b
              C-h: C-h
              C-m: C-m
              C-a: C-a
              C-f: C-f
              C-p: C-p
              C-n: C-n
              C-e: C-e
              C-d: C-d
              C-g: C-g
              C-k: C-k

これで、スペースキーを押している間はスペースキーが Shift として認識されます。 また、左 Shift キーを空で離した場合、Esc が入力されるようにしています。 Esc キーも指から遠いので、近くに設定しました。 頻繁に押すキーでは無い為、Shift に設定しています。

ついでに、その他のアプリでも emacs keybind を使えるようにしてみました。 この部分については不具合があれば変更します。

ハマったところ

実は昨日の夜に xremap の設定を始めて、暫くハマっていました。

毎回 xremap を起動するのは面倒だと思ったので、Systemd のサービスとして自動起動するように設定しました。

しかし、私の環境ではサービスとして自動起動させた場合、アプリケーション別のキー設定が上手く動作せず、バグってしまいました。 config の書き方を変更するなど工夫をしてみましたが、どうしても直らなかったです。

結局、Systemd のサービスではなくスクリプトとしてログイン時に実行するようにしています。 このように設定すると問題なく動作します。

原因は未だに不明です。

おわり

xremap というソフトを使用してキーボードのキー動作を自分好みに変更しています。

最終的にどのようになるかは使いながら試していきます。

また、キー入力がやり易くなった為、SKK 日本語入力にも再チャレンジしています。