【JetBrains】 Linux でも macOS キーバインドを使いたい ！

初めまして、kitakkunといいます。最近インターンを始めて、エンジニアの世界に`"Hello, World!"`したばかりの新参者です。何気にこれ、初投稿です。

みなさん、好きなOSはなんでしょうか。Windows？ macOS？ それとも、、、Linux ？
僕は用途別に全部使い分けていますが、 macOS ≒ Linux > Windows って感じですね。

1,2ヶ月前は Linux が一番好きだったのですが、あることをきっかけに macOS を好きになってしまったんです。それは何か。

「**Ctrlキーの他に、Commandキーがあること**」

他にも mac に魅力を感じる理由はありますが、最大の理由はズバリこれなんです。今回目指すことは、この**CommandキーをLinuxでも（できるだけ）使えるように再現すること**。無理だったら mac のデスクトップを買おうと思っていました。そのくらい本気で死活問題でした。

## 何が問題だったか

前置きが長くなりました。ここから更に前置きが入ります。覚悟してください。いいえ、**興味なければ飛ばしてください**。

みなさん。**Vim** というエディタをご存知でしょうか。ホームポジションを崩すことなくキーボードのみで完結し、豊富な機能で普通のエディタだと骨の折れる作業でもサクッとできてしまう。それがVimです。

察しの良い方はお気づきのことでしょう。**Vim は Ctrlキーを専有します。** 編集操作を快適に素早く行うために、たくさんショートカットが用意されています。

そして、LinuxやWindowsのショートカットは Ctrlキーがベースになっています。つまり、Vimを使っている状態で `<Ctrl>+C`でコピーしたり、`<Ctrl>+V`でペーストしたり、`<Ctrl>+W`でタブを閉じたり、ということができません。困った困った。

でも実は、macだと**ショートカットがCommandキーに設定されているので、衝突せず使えてしまう**んです。なんてこった〜〜。mac買うしかないやん！！

、、、でも「今は時期が悪いおじさん」が僕の中にいらっしゃって、、、彼はこう語りかけてきました。

**「それ、Linuxでなんとかならんか？」**

確かに、Linuxってカスタマイズ性が高いし、なんとかなるかもしれない・・！ そう思った僕は 「linux command key like macOS」など片っ端から調べまくりました。が、案外これが見つかんなくてとても苦労しました。
見つかったと思っても、結局Commandキーの位置にあるキーをCtrlキー扱いにする系のものしか出てこなくて、ひたすらに、

**違う、そうじゃない**

の繰り返しでした。それで最終的に、JetBrainsのIDEに「macOS Keymap Plugin」がある。ということを知ります。期待を込めて深夜眠気を抑えながらインストールしてみたものの、、、、動かんやん！！

そう思ったそのとき、そのキーマッププラグインページの下の方を見てみると、こんなレビューを見つけたんですね。
> This plugin works like a charm on Ubuntu 20.10 (or 20.04)! A huge shout out to developers! :)
>
>To make (cmd/windows key) key mappable in Ubuntu (Gnome 3), you have to install & run gnome-tweaks tool, and go to Keyboard & Mouse -> Additional Layout settings. There should you modify this:
>
>Alt/Win key behavior set to Meta is mapped to Left Win
>If you have smaller (without numeric keys) keyboard, set Miscellaneous compatibility options to Default numeric keypad keys - to disable automatic enabling Num Keys which makes smaller Apple keyboard unusable in system.
>Now you can map your (Win, CMD) key to PHPStorm. I recommend to disable all useless shortcuts in Gnome shortcuts (Ubuntu settings) to not interfere with PHPStorm.
>
> [Peter Burianさんのありがたすぎるレビュー] https://plugins.jetbrains.com/plugin/13258-macos-keymap

何を言っているのかというと、**「SuperキーをMetaキーにしたら動いたよ」** ってことらしいです。OSもUbuntuだし、丁寧だし、凄く信頼度の高い情報が出てきてもう泣けてきました。Peter Burianさん、マジでありがとう。

何の脈略もなくJetBrainsのプラグインの話を出してしまいましたが、コマンドキーがなくて一番困ってたのはIdeaVim使うとIDEのショートカットがほとんど使えなくなることでした。後付ですみません。つい熱くなっちゃいました。

# 解決策

前節を飛ばしてここに来たあなたは正解です。手順はたったの2ステップ。サクッとやってしまいましょう。

1. SuperキーをMetaキーに割り当てる
2. JetBrains IDEにmacOS Keymapプラグインをインストール

これだけです。ただ1の手順を行う上で、少なくともUbuntuでは`gnome-tweaks`というツールを導入し実行する必要があるようですので注意が必要です。多分そこまで難しくないですしPeterさんが書いてくれてますのでこちらは省略させていただきます。

# 環境

筆者は Linux Mint が大好きですので、Linux Mintでの設定方法を説明します。前述のようにUbuntuでは追加で`gnome-tweaks`のインストールが必要となるようですが、Linux Mintには標準でSuperキーの割り当てを変更する機能がありますので省略します。多分そんなに難しくない、と思う。

# Superキー を Metaキー に割り当てる

### ①システム環境設定を開く
ちょっとカスタマイズしちゃってるので見た目が少しばかり違うと思います。すみません。
![Screenshot from 2022-09-21 08-06-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971624/60243639-20f3-8789-4e17-6bd0b8fe77fa.png)

### ②キーボードの環境設定を開く
スクロールするか検索バーに打ち込むなどして、キーボード設定画面に行きます。レイアウト（Layouts）の設定に移動してください。移動したら右下の「Options...」をクリックします。
![Screenshot from 2022-09-21 08-07-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971624/a57c0d00-f862-2a83-0fca-0e9cafb1dff7.png)

### ③「Alt/Win key behavior」を探す
何やら色々設定が出てきますが、この中で上から3つ目にある「**Alt/Win key behavior**」をクリックします。
![Screenshot from 2022-09-21 08-07-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971624/dcc24fcc-33f2-b2af-69b4-882249366649.png)

### ④MetaをWin(Super)に割り当てる
「Meta is mapped to Left Win」もしくは「Meta is mapped to Win」を選びます。これで、SuperキーがMetaキーになりました！
![Screenshot from 2022-09-21 08-08-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971624/1c565725-ec0b-8ffb-5203-975e74dfeac7.png)


# JetBrains IDEにmacOS Keymapプラグインを入れる

次に、macOS Keymap（ https://plugins.jetbrains.com/plugin/13258-macos-keymap ) という公式プラグインをJetBrains IDEにインストールします。

File->Settings->Plugins から macOS Keymap で検索し青っぽいアイコンのやつをインストールします。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971624/084fbe62-44e6-53f2-6e72-497cc231a1af.png)

インストールが終わったら、忘れずにKeymapを「macOS」に変更しましょう。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971624/bae647b2-69a6-c1b2-fd4c-6b09ea5e77d3.png)

# コマンドキーが使える！！

なんとこれだけで、macと同じバインディングでJetBrains IDEが使えます。めでたし、めでたし。
ちなみに、Keymapの詳細を見てみると、確かにMetaキーに色々ショートカットが割り振られているのがわかると思います！
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971624/9167feac-c799-a22d-f284-dc37bfa00206.png)

# さいごに
まあでもこれ、コマンドキーが使えるようになったわけではないんですよね。macと同じように操作できるようになったのはあくまでJetBrains IDEに限った話で。（まあこれが僕にとっては一番重要なのですが）

一応、間に入ってキー入力を変換してくれるAutoKeyというものがあります。このAutoKeyに`<meta>+X`系のショートカットを`<ctrl>+X`に変換するような設定をすれば、概ねmacと似た感じで他のアプリケーションも使うことができます。
ウィンドウ名の条件に応じてどのバインディングを有効にするか選べるようになっていますので、僕はウィンドウ名が`jetbrains`にマッチしないという条件のもと`<meta> → <ctrl>`の変換を設定して使っています。

AutoKeyはキー入力に応じてPythonスクリプトをトリガーする形式になっていて、例えば
```python
keyboard.send_keys("<ctrl>+c")
```
と書けば、`<ctrl>+c`に変換されます。詳しくは公式のリファレンスを参照してください！
ただこれ、3つ以上のキー入れると動かないんですよね。。。GitHubにIssue（https://github.com/autokey/autokey/issues/98 ）上がってて載っていた解決策試してみたものの僕の環境ではダメでした。

# 参考文献

- macOS Keymap - IntelliJ IDEs Plugin | Marketplace ( https://plugins.jetbrains.com/plugin/13258-macos-keymap )
- AutoKeyのGitHubリポジトリ ( https://github.com/autokey/autokey )
- AutoKeyで使えるスクリプトのリファレンス ( https://autokey.github.io/index.html )