Ubuntu (Kali Linux) で、AutoHotkey っぽいことを AutoKey で実現したい

# はじめに

わたしのメインマシンは Windows です。カーソルキーやファンクションキーを押す際に手がホームポジションから離れてしまうのがイヤなので、AutoHotkey を使って極力ホームポジションから離れなくても済むよう設定しています。

関連記事： 
- [AutoHotKeyで日本語キーボードのホームポジションに引きこもりたい](https://qiita.com/sassoon/items/1b523fb6aad35e95a1e8)
- [Autohotkey で、いつでもどこでもGoogle検索](https://qiita.com/sassoon/items/b9ba5e4712a28376fd73)

最近、Kali Linux を使う機会が増えたのですが、Linux には AutoHotkey が無いのでキーボード操作が面倒でした。しかし、AutoKey というソフトを使うことで、ホームポジションから手を離さずにカーソル移動ができたり、マウス操作ゼロで Google 検索ができたりなど、AutoHotkey に近いことが実現できました。

需要がないことは分かっていますが、キーボードの変態設定大好き人間なのでここに記しておきます。
Kali Linux のバージョンは、2020.2 です。


# 要件定義

- 「変換」と h, j, k, l キー（のいずれか）の同時押しで、カーソルの上下左右移動したい（←達成）
- 「変換」と b, n, m キー（のいずれか）の同時押しで、1行削除, BackSpace, Delete したい（←達成）
- 「無変換」と h, j, k, l（のいずれか）の同時押しで、全角かな変換, 全角カナ変換,  半角カナ変換, 半角英数字変換したい（日本語入力時の F7 ～ F10 変換と同じ）（←達成）
- Alt + 1,2（のいずれか）で、Chrome のタブ移動をしたい（←達成）
- 「無変換」だけで、日本語入力と直接入力を切り替えたい（←未達成）


# 方針

AutoKeyは、Ctrl, Alt, Shift, Super, Hyper, Meta の6種類の修飾キーと他のキーの組み合わせでショートカットキーを作成します。
Super とは Windows キーのことです。Linux の世界では Super と呼ぶらしいです。Hyper, Meta は、昔の特殊なキーボードにあった修飾キーで、現在の一般的なキーボードにはありません。また、Autokey は日本語キーボードには対応していないので、「変換」「無変換」などの特殊なキーには対応していません。
Hyper, Meta は使われていないこと、「変換」「無変換」は使えないということならば、Hyper に「変換」を、Meta に「無変換」を割り当ててしまえば、やりたいことができるはずです。


# xkb 設定

このキー割り当ての変更に xkb（X Keyboard Extension）を使用します。まずは、「setxkbmap -print」で、現在の xkb の挙動（設定ファイルの読込対象）を確認します。


```
$ sudo setxkbmap -print -verbose 10
```

「/usr/share/X11/xkb/symbols」フォルダの、「pc」「jp」「inet」の3ファイルを読み込んでいるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/d342391a-695c-e8b0-eae3-ce7fab413351.png)

3つのファイルを読み込んでいますが、今回編集するのは、「inet」だけです。バックアップの後、編集します。

```
$ sudo cp /usr/share/X11/xkb/symbols/inet /usr/share/X11/xkb/symbols/inet_bak
$ sudo vi /usr/share/X11/xkb/symbols/inet
```

編集する箇所は、<HENK><MUHE> の２箇所です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/4230b94f-98c1-08a7-e1d3-d6230ce68cfa.png)

\<HENK> の 「Henkan」を「Hyper_L」に、\<MUHE> の「Muhenkan」を「Meta_L」に修正します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/fa212451-466d-36e7-3931-45e36c69dc89.png)

保存して終了したら、xkb のキャッシュをクリアします。

```
$ sudo rm -rf /var/lib/xkb/*
```

その後、Kali Linux を再起動します。


# Autokey 設定

いよいよ AutoKey の作業です。なにはなくとも、まずはインストールしましょう。

```
$ sudo apt install autokey-gtk
```

## 画面構成

1. 保存した設定一覧
2. 処理内容（Pythonコード）
3. 実行条件設定
4. ホットキー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/39efd3a8-8109-a156-3e23-0fb8e79f13b4.png)

## 設定方法

左上の「新規」からフォルダを切ります（後ででもできます）。
わたしは「MySettings」というフォルダの下に、「browser」「cursor」「input_conversion」という3つのサブフォルダを作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/8444190e-04c0-a447-5feb-dd6e0031c6eb.png)

今回は、「変換」と「h」を同時に押した際、カーソルを左に動かす設定を作ります。「新規」から「Script」を選択し、名前を入力します。

「Hotkey」の行の「Set」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/d7505258-a414-ba39-cdb9-2096848a0a60.png)


「Press to Set」ボタンを押し、「h」キーを押し、「Hyper」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/cc09087c-a06c-da8a-3cfb-c1fe59432343.png)

設定されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/0217242f-287e-e226-c6bb-b8a2d22d86cf.png)

画面右上のスクリプト入力欄に以下のように入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/7205d1f9-04e2-12ae-4e7a-1721e11a8960.png)

「Save」ボタンを押すと、入力内容が保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/ec10a3b9-c39d-2876-86bb-87d0ddd2d1b7.png)

これで、「変換」と「h」を同時に押すとカーソルを左に動くようになります。同じ手順で、上下左右、Delete、BackSpace などを作ります。ホットキーはお好みで設定してください。
カーソルキーや制御キーなど、特殊キーの名称はこちらを参考にしてください。
**[autokey - SpecialKeys.wiki](https://code.google.com/archive/p/autokey/wikis/SpecialKeys.wiki)**

# OS のショートカットの無効化

h, j, k, l を上下左右移動に設定すると、「Hyper」+「l」が 、OSで設定されている「ログオフ」とバッティングしてしまうので、これを削除します。
「設定」→「キーボード」→「アプリケーションショートカットキー」タブを選択します。

この行を削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/4456e2ae-accd-8893-da6c-ef2a238c66c9.png)

以上で設定は終了です。


# 設定一覧

## cursor

```:カーソル左移動　Hyper+h　left.py
keyboard.send_keys("<left>")
```

```:カーソル右移動　Hyper+l　right.py
keyboard.send_keys("<right>")
```

```:カーソル上移動　Hyper+k　up.py
keyboard.send_keys("<up>")
```

```:カーソル下移動　Hyper+j　down.py
keyboard.send_keys("<down>")
```

```:delete.py　Hyper+n
keyboard.send_keys("<delete>")
```

```:backspace.py　Hyper+m
keyboard.send_keys("<backspace>")
```

```:1行削除　Hyper+b　line_delete.py
keyboard.send_keys("<home>")
keyboard.send_keys("<shift>+<end>")
keyboard.send_keys("<delete>")

```

## 変換（日本語モードで入力時に押下）

```:ひらがな　Meta+h　hiragana_zen.py
keyboard.send_keys("<f6>")
```

```:カタカナ全角　Meta+j　katakana_zen.py
keyboard.send_keys("<f7>")
```

```:カタカナ半角　Meta+k　katakana_han.py
keyboard.send_keys("<f8>")
```

```:アルファベット　Meta+l　alphabet.py
keyboard.send_keys("<f10>")
```

## Chrome タブ操作

```:左タブ移動　ctrl+1　chrome_lefttab.py
keyboard.send_keys("<ctrl>+<page_up>")
```

```:右タブ移動　ctrl+2　chrome_righttab.py
keyboard.send_keys("<ctrl>+<page_down>")
```

```:Google検索　meta+g　chrome_search.py（アドレスバーにフォーカスする。Chromeが起動している必要アリ）
window.activate("Chrome")
keyboard.send_keys("<ctrl>+l")
```

# 余談

-  **その1**

本当は、「無変換」だけで日本語入力/直接入力を切り替えたかったのですが、「無変換」を Meta に設定してしまったのでできなくなりました。ctrl + space などで代用しようかと思います。

- **その2**
Meta を「無変換」に割り当てたことで、「無変換」でウインドウがつかめるようになりました。地味に便利かも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155700/0fb51043-e270-2a9e-f9ae-836c515f2fce.png)

- **その3**
処理のコードは Python らしいので、Python が書ける人はもっと高度なことができると思います。


# 参考サイト
- [AutoKey : Linux Utility for Text Substitution , Hotkeys and Desktop Automation](
https://saravananthirumuruganathan.wordpress.com/2010/04/14/autokey-linux-utility-for-text-substitution-hotkeys-and-desktop-automation/)
サンプルのスクリプトやチュートリアルが飼いてあってわかりやすいです（英語だけど機械翻訳でもなんとかなります）

- [Ubuntu：無変換・変換キーをMeta・Hyperキー化してAutoKeyでカスタマイズ可能な修飾キーにする方法](https://did2memo.net/2015/07/19/ubuntu-xkb-muhenkan-henkan-meta-hyper/)
かなりお世話になりました。ありがとうございます。

- [autokey - SpecialKeys.wiki](https://code.google.com/archive/p/autokey/wikis/SpecialKeys.wiki)
カーソルキーや制御キーなど、特殊キーの名称