Linux Mint MATE 20.1 の xkeysnal で Windows の AutoHotKey と同じ設定をする

Linux

Linux Mint を利用しているときに、Windows で利用している AutoHotKey で行っていたように、カーソルキー移動や Backspace キーをホームポジションを崩さすに操作したくなってきました。

Linux で AutoHotKey と同じようなことができないかと調べていると、xkeysnail という python のソフトを利用すれば実現できることが色々と紹介されていましたので、私も試してみて Windows の AutoHotKey で設定しているキー操作と同じことが実現できましたので、設定手順をまとめました。

Windows の AutoHotKey で設定している内容

基本として「無変換」キー+ ○○ といったキーバインドを設定しています。
JIS 配列のキーボードを利用しているとこの「無変換」キーがいい位置にあり気に入っています。

  • カーソルキーを 無変換 + HKJL で操作する
  • Home、End を無変換 + AE で操作する
  • PageUp、PageDown を無変換 + P; で操作する
  • Backspace、Delete を 無変換 + NM で操作する
  • 単語単位のカーソル移動を 無変換 + UI で操作する
  • カーソル位置から行末まで切り取りを 無変換 + O で操作する

Windows の AutoHotKey を利用した設定方法については以下の記事で紹介しています。

xkeysnail のインストール

xkeysnail は python で開発されたツールですので、以下のコマンドでインストールします。
Linux Mint には最初から python3 がインストールされていましたので、pip および xkeysnail をイントールします。

sudo apt install python3-pip
sudo pip3 install xkeysnail

キー設定ファイル(config.py)を作成する

キー設定ファイル(config.py)は以下のパスに作成します。

/home/[ユーザ名]/.config/xkeysnail/cofig.py

config.py の設定内容

import re
from xkeysnail.transform import *

# 単発押しと組み合わせ押しの設定
define_multipurpose_modmap({
   # 無変換単押しで無変換、組み合わせると右コマンドキー(物理キーとしてはWindowsには無い) に設定する
   Key.MUHENKAN: [Key.MUHENKAN, Key.RIGHT_META]
})

define_keymap(None, {
    # 一連のホームポジション維持カーソル移動
    K("RSuper-a"): K("Home"),
    K("RSuper-e"): K("End"),
    K("RSuper-k"): K("Up"),
    K("RSuper-h"): K("Left"),
    K("RSuper-l"): K("Right"),
    K("RSuper-j"): K("Down"),
    K("RSuper-u"): K("C-Left"),
    K("RSuper-i"): K("C-Right"),
    K("RSuper-p"): K("Page_Up"),
    K("RSuper-Semicolon"): K("Page_Down"),

    # 一連のホームポジション維持カーソル移動(+Shift)
    K("Shift-RSuper-a"): K("Shift-Home"),
    K("Shift-RSuper-e"): K("Shift-End"),
    K("Shift-RSuper-k"): K("Shift-Up"),
    K("Shift-RSuper-h"): K("Shift-Left"),
    K("Shift-RSuper-l"): K("Shift-Right"),
    K("Shift-RSuper-j"): K("Shift-Down"),
    K("Shift-RSuper-u"): K("Shift-C-Left"),
    K("Shift-RSuper-i"): K("Shift-C-Right"),
    K("Shift-RSuper-p"): K("Shift-Page_Up"),
    K("Shift-RSuper-Semicolon"): K("Shift-Page_Down"),

    # カーソル位置から行末まで削除
    K("RSuper-o"): [K("Shift-End"), K("Delete")],

    # backspace delete
    K("RSuper-n"): K("Backspace"),
    K("RSuper-m"): K("Delete")

})

xkeysnail をサービス化し自動起動設定する

xkeysnail の実行方法を調べると xkeysnail の GitHub のページでは以下のように sudo で実行しています。

https://github.com/mooz/xkeysnail

sudo xkeysnail config.py

 

色々な方法で自動起動化がありましたが、一般ユーザで起動できるサービス化する以下記事が一番わかりやすかったため、ほとんどそのまま参考にさせていただきました。

https://ohmyenter.com/how-to-install-and-autostart-xkeysnail/

input / uinput グループに自分のユーザを追加

uinput グループを追加

念の為 uinput グループが存在していないこと確認する
何も表示されなければ OK

$ getent group uinput

 

uinput グループ追加

$ sudo groupadd uinput

input / uinput グループにユーザを追加

$ sudo usermod -aG input,uinput [ユーザ名]

 

追加されていることを確認する

$ getent group input

$ getent group uinput

rules ファイル作成

70-input.rules ファイル作成

以下のパスにファイル作成

/etc/udev/rules.d/70-input.rules

ファイルの内容

KERNEL=="event*", NAME="input/%k", MODE="660", GROUP="input"

70-uinput.rules ファイル作成

以下のパスにファイル作成

/etc/udev/rules.d/70-uinput.rules

ファイルの内容

KERNEL=="uinput", GROUP="uinput"

サービスファイル(xkeysnail.service)ファイル作成

以下のパスにファイルを作成

~/.config/systemd/user/xkeysnail.service

xkeysnail.service ファイルの内容

[Unit]
Description=xkeysnail
[Service]
KillMode=process
ExecStartPre=/usr/bin/xhost +SI:localuser:root
ExecStart=/usr/local/bin/xkeysnail /home/[ユーザ名]/.config/xkeysnail/config.py
Type=simple
Restart=always
RestartSec=10s
Environment=DISPLAY=:0
[Install]
WantedBy=default.target

サービス登録

systemctl コマンドで xkeysnail をサービス登録する

$ systemctl --user enable xkeysnail

サービスを開始

$ systemctl --user start xkeysnail

ステータスを確認する
config.py の記載間違いなどがあれば、エラーとあっているので config.py の設定内容を見直しましょう。

$ systemctl --user status xkeysnail

PC 再起動

PC 再起動後に xkeysnail が起動し、設定したキーバインドが利用できれば成功です。

Linux

Posted by snow