誤爆防止！Mac でアプリ終了ショートカットを長押し時のみ有効にする

# Overview
この記事のリメイク版として [Macユーザ必見！アプリ終了の誤爆ショートカットを防ぐ方法！](https://wariichi.com/how-to-prevent-erroneous-input-for-mac/) を別途公開しています。こちらも是非ご覧下さい！

Mac で Command キーを組み合わせたショートカットをすると、「タグを閉じる(⌘ + W)」 と 「アプリの終了(⌘ + Q)」 を押し間違えるという悲しい事故を誰もが経験したことがあるはずである。
この記事は、その様な不測な事態を避けるために試行錯誤をした際の記録となる。

結論として、この記事では必要最低限の設定のみで Karabiner-Elements を採用した。
また、私個人の環境は以下となる。

* MacBook Pro(13インチ, 2016年モデル、TouchBar搭載）
    * Mac OS Mojave 10.14.6, JISキーボード
* QBlocker 1.2
* Karabiner-Elements 12.9.0

# アプリ導入
## QBlocker
真っ先に導入したのが、こちらの QBlocker。
http://qblocker.com/

機能は非常にシンプルで、「アプリの終了(⌘ + Q)を長押し時のみ有効にする」 という、今回の要件をミニマムで満たしてくれる。

ただし、厄介なのが私の環境ではアプリメニューを開くだけでアプリが強制終了してしまう。。。 調べてみると最終更新は2016年らしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/88b9cf00-5420-0cdc-da06-727e9e0c3ca5.png)

この状態でもアプリ立ち上げ自体は可能なので、細かい設定項目を指定できないことに目を瞑れば、導入自体はとても簡単。
ただし、初期設定ではログイン時に自動起動がされないため、毎回立ち上げる必要がある。こういう細かい操作を毎回要求されるのは個人的に鬱陶しいので今回は採用を見送り。

もし詳細な導入手順を知りたい場合は、先人がまとめて下さった記事があるので、こちらを参照すべし。MacOS が古ければ問題なく利用できるかもしれない。
https://pc-karuma.net/mac-app-qblocker/

## Karabiner-Elements
こちらが本命。Macユーザなら耳にしたことがあるだろう。
https://karabiner-elements.pqrs.org/
こちらからdmg形式でダウンロードでき、従来のMacアプリ同様に解凍+インストールが可能なのでここの手順は割愛する。

インストール時、以下の様に「ダウンロードしたアプリケーションの実行許可」 で弾かれてしまったため、鍵アイコン押下で鍵を外す > 許可押下、の手順で実行許可を与える必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/db5691d8-7cfd-8f26-897c-b5f641ffe83d.png)

### Command + Q の挙動設定
https://chat-rate.com/oyakudachi/4230/ を参考に、設定を有効にする。

まず、Safari(Chromeだとダメらしい)で以下のURLを入力して実行

```
karabiner://karabiner/assets/complex_modifications/import?url=https%3A%2F%2Fpqrs.org%2Fosx%2Fkarabiner%2Fcomplex_modifications%2Fjson%2Fcommand_q.json
```

その後、以下のポップアップが表示されるため「許可」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/1a4da39e-3a2c-e699-dbdf-1f0b68b5ef6b.png)

すると、Karabinerが立ち上がり以下の表示になる。Command + Q ショートカットの設定をインポートしたいので、'Import'を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/6469ffc7-96cb-a818-d799-899de9e0897c.png)

その後、以下の画面の様になるので、'Quit application by holding command-q'のEnableを選択。
'Quit application by pressing command-q twice' を選択すると、長押しではなく二度押しで終了設定ができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/5f3622a5-3667-9fbb-3aca-90fd765e1181.png)

上記手順で、'Complex Modification'に選択した設定が表示されていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/c0f8af59-4024-f9a7-a9fb-696515526908.png)

### 詰まりポイント
インストールと設定は簡単に済ませられたものの、細かい挙動が異なってしまう現象がいくつか発生したため、その解決方法を以下に記す。

#### 一部キーボード入力で異なる文字が反映される
Chromeのタブ移動の際に、左移動が右移動に、右移動が無効になっていることで気付いた。
原因はJISキーボードがUSキーボードとして認識されることだったので、以下を参考に解決した。
https://qiita.com/kenmaz/items/0ff152af776a3e6e5f6e

まずは、'Virtual keybord'から、Countery code を 45 で指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/f699ae45-a722-e6c9-ffdb-6e10dd100010.png)

その後、システム環境設定 > キーボード から 左下の「キーボードの種類を変更」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/0cca422e-c07d-52e6-6e63-6d4f693de484.png)

その後、画面の指示に従ってキーを入力し、最終的にJIS（日本語）を選択する。USの場合はこの辺の設定は不要なのかもしれない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/21abcf5e-06e9-baab-db1b-df3a2d304a43.png)

#### Cmd + F1　で画面切り替えができない。
ファンクションキー単体押下時には問題ないのだが、「Command + F1」の様に修飾キーと組み合わせたショートカットが効かなくなってしまった。
https://a-records.info/touch-bar-command-f1-not-working-with-karabinar-elements/ を見るに、キーボードとTouchBarは内部的に別デバイスとして認識されている様で、Karabiner上でTouchBarの方が無効化されていたらしい。

したがって、TouchBarを有効化することで解消する。具体的には、'Devices'の'No product name(No manufacturer name)'のチェックを有効化する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/09233158-86fa-eaa9-4d2d-d7795a2f0006.png)

その後、参考記事には記載されていないが、'Function keys'の'Use all F1, F2, etc. keys as standard function keys' を有効にする必要があった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/dda4232d-22cf-a13e-e779-1a41d6d46a32.png)

参考までに、システム環境設定 > キーボード の設定は以下。無入力時の TouchBar はファンクションキーが表示されている状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/702916bc-f9fd-d5a5-6018-3ec0983979c0.png)

#### 修飾キーの設定が適用されない
自分はcaps不要論者過激派なのでcaps を control に置き換えているのだが、これの設定が無効になっていた。 ~~capsは滅ぶべし~~
具体的には、おなじみ システム環境設定 > キーボード の「修飾キー」から修飾キー設定画面を開いた際に、「キーボードを選択」から Karabiner を指定して再設定する必要があった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/c8139874-ef4f-4312-6996-02c5920da7e8.png)

### 最終手段のアンインストール
もし上記以外の問題が解決できずに困り果てた場合は、導入を一旦見送ったほうが良いかもしれない。
Misc > Uninstall Karabiner-Elements を選択すればアンインストールをして導入前の状態に戻すことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38277/6b7ea1db-ab54-4708-d5a1-5c9caacd8abd.png)


# おわりに
これでアプリ終了ショートカットの長押し化のみ有効 + それ以外のキーボード入力は従来通り、という今回の要件を満たすことができた。
Karabinerは使いこなすと変態キーバインドを堪能できるよのことなので、機会があればカスタマイズしてみるとする。効率厨を名乗る以上、いつか通る道となるだろう。



# 20200718 追記: emacs　キーバインドを有効にする
方向キーを使うことが苦痛でたまらないため、emacsバインドの方向キーを導入してみた。
Complex modifications > Rules > Add rule > Import more rules from the Internet (open a web browser)を選択 。

その後、検索欄に「Emacs」と入力 > 「Emacs key bindings (rev 12, @tekezo)」　を選択 > import

その後、Karabiner-Elements が開くので、 control+keys をEnableする。

参考：https://chiilabo.com/2020/04/macos-emacs-key-binding-karabiner-control-key/