LinuxでMacっぽくCmd,Ctrlキーを使い分ける

# はじめに
Ubuntuを始めとしたLinux環境において、**Terminalでのコピーは**<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>C</kbd>**、貼り付けは**<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>V</kbd>**です。**
テキストエディタやWebブラウザなど、一般的にコピーは<kbd>Ctrl</kbd>+<kbd>C</kbd>、貼り付けは<kbd>Ctrl</kbd>+<kbd>V</kbd>ですが、Terminal上では制御コマンドと被るため、例外的に<kbd>Shift</kbd>を追加で押す必要があります。

その反面Macは<kbd>Ctrl &#8963;</kbd>と<kbd>Cmd &#8984;</kbd>の２つがあり、<kbd>Ctrl</kbd>はTerminal上での制御、<kbd>Cmd</kbd>は汎用ショートカットキーとしての棲み分けがなされています。

MacとLinuxを両方使っている私としては、「Terminal使ってる時だけshift押さないといけないのは面倒」と感じ、LinuxでもMacと同じようなショートカットキーを使い分けれたらどんなに楽かと、「Linux cmd ctrl like mac」みたいな記事を片っ端から読み漁りましたが、私の知る限りでは国内では的を射た記事がありませんでした。
しかしながら、[海外の質問サイト](https://askubuntu.com/questions/10008/how-to-make-keyboard-work-like-osx-system-wide) にて個人的な最適解を発見しましたので、ここに書き置きとして説明を残したいと思います。

## 環境
- Ubuntu 18.04 LTS
- Thinkpad X270

外観はTweaksでMacOS風にしてます（[参考](https://www.noobslab.com/2018/08/macbuntu-1804-transformation-pack-ready.html)）

# 実装方法


## CapsLockをHyperキーに置換
<kbd>CapsLock</kbd>を<kbd>Hyper</kbd>に置き換え、Macで言うところの<kbd>ctrl &#8963;</kbd>として使用します。
使用頻度はさほど高くないため大抵は問題ないかと思いますが、<kbd>CapsLock</kbd>を殺したくない方はキーマップの変更なりをして下さい。
Tweaksが未インストールの場合は

```sh
sudo apt -y install gnome-tweak-tool
```
を叩いてください。

キーボードとマウス
$\rightarrow$追加のレイアウトオプション
$\rightarrow$Caps Lock Behavior
$\rightarrow$Caps Lockを追加のHyperにする

と設定することで<kbd>CapsLock</kbd>を<kbd>Hyper</kbd>に設定します。

## Superキー系ショートカットのコンフリクト対策
<kbd>Hyper</kbd>は<kbd>Super</kbd>（Windowsキー）と似たような動作をし、<kbd>Hyper</kbd>+<kbd>L</kbd>などを入力すると<kbd>Super</kbd>+<kbd>L</kbd>と同じ「画面をロック」が働いてしまいます。
設定次第では完全に分離することも可能かもしれませんが、個人的に<kbd>Super</kbd>はあまり使わないので、Linuxの設定画面で
<kbd>Super</kbd>+<kbd>[A-Z]</kbd>を
<kbd>Super</kbd>+<kbd>Shift</kbd>+<kbd>[A-Z]</kbd>
に変更します。
![Screenshot from 2019-11-19 20-10-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206650/0e12f2e7-2b5a-588b-63d5-10103b9a9ccf.png)

## Autokeyのインストール
**Autokey**とは、予め登録しておいた文字列やショートカットキーを入力することで、それに対応した文字列・スクリプトが出力されるツールです。公式は[ここ](https://github.com/autokey/autokey)。

```sh
 sudo apt -y install autokey-gtk
```
でインストールできます。

## 使用方法
### 前準備
Autokeyは`~/.config/autokey/data`下にデータが保存されます。

```sh
mkdir ~/.config/autokey/data/ctrl-hyper
```
で今回作成するスクリプトのフォルダを作成します。

作成できたらAutokeyを開きます。
![Screenshot from 2019-11-19 18-02-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206650/a7a53da0-61e2-846c-2ab3-c7775f9441f5.png)

### Scriptの登録
`ctrl-hyper`フォルダをクリックし、
新規$\rightarrow$Script
とすることでに上にScriptファイルを作成します。

ここでは**killコマンド**のスクリプトを例として作成します。

1. script code欄に `keyboard.send_keys("<ctrl>+c")`を入力
2. Hotkeyに`<hyper>+c`を設定
3. Window FilterでDetect Wondow Properiesを選択し、常用しているTerminalのウインドウをクリック**（注意！（後述））**  
gnome-terminalを使っている場合は`gnome-terminal-server.Gnome-terminal`と入力してもよいです。

![Screenshot from 2019-11-19 20-13-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206650/f8be88ee-a20b-580b-07e0-c0633d23d3d0.png)

**※注意！**
Detect Wondow Properiesでウインドウをクリックしても`autokey.Autokey`が返ってくる場合があります。そのときは

```sh
xprop | grep WM_CLASS
# >>> WM_CLASS(STRING) = "gnome-terminal-server", "Gnome-terminal"
```
とTerminalに打ち、１つ目の返り値がインスタンス名、２つ目がクラス名に相当しますので、
`インスタンス名.クラス名` をAutoKeyのフォームに入力します。

---

これで<kbd>Hyper</kbd>+<kbd>C</kbd>を押すことは、Terminal上では<kbd>Ctrl</kbd>+<kbd>C</kbd>と同じ扱いとなり、killコマンドが送られることになります。

これを**コピーコマンド**も同様にScriptを新規作成し、
script_code : `keyboard.send_keys("<ctrl>+<shift>+c")`
Hotpey: `<ctrl+c>`
Window Filter: `gnome-terminal-server.Gnome-terminal`
と設定します。

以上の２つのScriptによって、Terminal上では
<kbd>Ctrl</kbd>+<kbd>C</kbd>が**コピー**、<kbd>Hyper</kbd>+<kbd>C</kbd>が**kill**
といった、Macとほぼ同じショートカットが実現します！！

これに加え、<kbd>Ctrl</kbd>+<kbd>V</kbd>や、emacs由来のなどのカーソル移動系ショートカットも同様に２つのScriptを作成します。


# 備考＆手作業の設定が面倒な貴方に
AutoKeyは1つのScriptにつき、pythonとjsonの２ファイルが生成されます。
Window Filterでは正規表現を使ったウインドウの指定が可能ですので、
「TerminalとVScodeでこのScriptを使いたい！」ってときとかは
`gnome-terminal-server.Gnome-terminal|code.Code`
でOKです。

いちいちGuiで登録するのが面倒な人は [GitHub](https://github.com/MTfirst/cmd-ctrl_onLinux) にファイル一式をおいていますので参照してください。

# 参考
- [Linuxで特定のフレーズを自動置換したりショートカットにスクリプト実行を割り当て可能なAutoKeyの使い方](https://www.virment.com/how-to-setup-autokey-in-linux/)
- [AutoKeyを使ってctrl+hにbackspaceを割り当てる[Linux Mint] - seitk’s blog](http://seitk.hatenadiary.jp/entry/2015/05/05/002515)
- [ターミナル 作業効率化 tips集](https://qiita.com/shizuma/items/86470203ac8ea6b4d53f#-ctl--a)