JupyterLabでのショートカットキーの上書き

# 背景
競プロ始めるときのローカル側の実行環境としてJupyterLabを入れてみた[^1]。
下の茶番みたいなことがよく起きて困った。

### 環境
Windows 7
Google Chrome 74.0.3729.169
JupyterLab 0.35.4

### 茶番

[例：ABC092-B Chocolate](https://atcoder.jp/contests/abc092/tasks/abc092_b)
なるほどね、入力はこう……だとしたらこう取るかな[^2]。
とりあえず正しくinputできてるかの確認にprintしてっと。

```Python:ABC-092-B&nbsp;GetInputCheck
n=int(input())
d,x=map(int,input().split())
a=[int(input()) for i in range(n)]
print(n,d,x,a)
```

うん、いい感じだね。続けて書いていこう。
(n分後)
よーし書けた！意図した通りに動くかJupyterLab上でサンプル通してみるぞー。
inputは……、n=5、d,x=……あっ30 44のスペースが入らなくて3044になってしまった！
![rapture_20190524153510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394761/91d9b87e-057a-e696-409d-70c102506f6e.png)
まあもちろんエラーが出るよね……とわかっているけど次の入力を打ち込もうとテンキーを叩いている手はもう止まらない！
![rapture_20190524153551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394761/8025bd59-1a67-f827-2f6c-55e74badeba7.png)
**うわあああああああああああ！！！！**
**入力してたものがCodeではなくてMarkdownになってしまったし先頭に無駄に#が入ってしまった！！！！！！[^3]**

みたいなことが死ぬほど起きていました。

エンジニアの端くれ?としてはそういうのに耐え続けるなんて"ナシ"だと思ったので、
どうにか発生しないように根本的な対処をしようと思って調べたんですが、
完全なる解決策みたいなとこまでの記事は見つからなかったので。

# 原因
インターネット先生に聞いてみたところ、
JupyterLabではショートカットキーとして、6までの数字を入力するとMarkdown形式で書き始める機能があります。
本来ならコード入力中やinput中は発動しないのですが、
エラーが発生したことで入力ウィンドウへのフォーカスが外れ、
コマンド待ちモードになってしまってるようです。

# 解決
エラーが発生するのは仕方ないとすると、ショートカット設定を弄るしかないはず……。
ということでショートカット設定は以下の部分にあります。
Settingタブ -> Advanced Settings Editor -> Raw view -> Keyboards Shortcut

```json:Keyboards&nbsp;Shortcut&nbsp;->&nbsp;System&nbsp;Default
    (略)
    "notebook:change-to-cell-heading-1": {
      "command": "notebook:change-cell-to-heading-1",
      "keys": [
        "1"
      ],
      "selector": ".jp-Notebook:focus",
      "title": "Change to Heading 1",
      "category": "Notebook Cell Operations"
    },
    (略)
```

明らかにこれっぽい、ということで別の入力をキーとすることで上書きしてしまいましょう。
とはいえ完全に別のキーを設定するとそれはそれで面倒なことになりそうなので、[^4]
1を3連打すると発生するようにしてみました。

```json:Keyboards&nbsp;Shortcut&nbsp;->&nbsp;User&nbsp;Overrides
{
    "notebook:change-to-cell-heading-1": {
    "command": "notebook:change-cell-to-heading-1",
    "keys": [
        "1",
        "1",
        "1"
    ],
    "selector": ".jp-Notebook:focus",
    "title": "Change to Heading 1",
    "category": "Notebook Cell Operations"
    }
}
```

さーて保存キーを押して……どうだ……1回じゃ発生しない、3連打で発動するようになった！
やったーこれで変なところで気を揉まなくて済む！！！これで水色コーダー？ってやつにまた近づいたな！！！！[^5]



<details><summary>コピペ用コード全文(クリックで展開)</summary><div>

```json:コピペ用
{
    "notebook:change-to-cell-heading-1": {
    "command": "notebook:change-cell-to-heading-1",
    "keys": [
        "1",
        "1",
        "1"
    ],
    "selector": ".jp-Notebook:focus",
    "title": "Change to Heading 1",
    "category": "Notebook Cell Operations"
    },
    "notebook:change-to-cell-heading-2": {
    "command": "notebook:change-cell-to-heading-2",
    "keys": [
        "2",
        "2",
        "2"
    ],
    "selector": ".jp-Notebook:focus",
    "title": "Change to Heading 2",
    "category": "Notebook Cell Operations"
    },
    "notebook:change-to-cell-heading-3": {
    "command": "notebook:change-cell-to-heading-3",
    "keys": [
        "3",
        "3",
        "3"
    ],
    "selector": ".jp-Notebook:focus",
    "title": "Change to Heading 3",
    "category": "Notebook Cell Operations"
    },
    "notebook:change-to-cell-heading-4": {
    "command": "notebook:change-cell-to-heading-4",
    "keys": [
        "4",
        "4",
        "4"
    ],
    "selector": ".jp-Notebook:focus",
    "title": "Change to Heading 5",
    "category": "Notebook Cell Operations"
    },
    "notebook:change-to-cell-heading-5": {
    "command": "notebook:change-cell-to-heading-5",
    "keys": [
        "5",
        "5",
        "5"
    ],
    "selector": ".jp-Notebook:focus",
    "title": "Change to Heading 5",
    "category": "Notebook Cell Operations"
    },
    "notebook:change-to-cell-heading-6": {
    "command": "notebook:change-cell-to-heading-6",
    "keys": [
        "6",
        "6",
        "6"
    ],
    "selector": ".jp-Notebook:focus",
    "title": "Change to Heading 6",
    "category": "Notebook Cell Operations"
    }
}
```

</div></details>

# あとがき
というわけで、無事に設定を理想に近づけることが出来ました。
Jupyter NotebookではUI付きでいろいろイジれたみたいですが、そっちだともっと楽だったのかな？

いちいち結果をprintして出してるのも自分的には少し引っかかっていて、
その部分もどうにか出来れば～と思っているんですが、
Variable Inspectorはなんかうまくインストールできず……難しいです。

自分的には結構悩んでしまった(インターネットにぴったりな記事が見つけられなかった)のと、
Qiitaに記事を書いてみたかったというのもありこういう記事を作らせていただきました。
エンジニア的には～とか文中に書きましたが、実務的には全くQiitaのターゲット系じゃないことをやっているので、
いろんな暗黙の了解等わかってなかったら申し訳ないです。様々なダメ出しガンガン募集中です。
この記事が少しでも誰かの助けとなれば幸いです。
以上、よろしくお願いします。

# 参考文献
[JupyterLabのショートカットキーを設定する方法](https://qiita.com/sky_jokerxx/items/be0f5dd9fd0dc8e4e9a8)
>デフォルトで設定されているキーと被るものは使えないので確認して設定しましょう。(デフォルトを上書きしてしまえば使えるかもしれない？[未確認])

上書きする方法で大丈夫でした！知見めちゃめちゃ助かりました。ありがとうございます。

[^1]: そもそもJupyterLabが競プロ向きなのかよくわかってない。誰かもっといいのがあったら教えてほしいです。<br>軽い入力なら手元で出力を確認できて助かってるんですが、<br>入力が多くなりすぎると結局本家のコードテストじゃないとつらいのが悩みどころ。
[^2]: 競プロ部分も正直インターネットで自己学習！しかしてないのでもっといい書き方あったら教えてほしい……。
[^3]: 地味にめちゃめちゃダルい。直すのにコードの該当部分選択とモード変更で数手かかってしまう。
[^4]: 本当は超使えるショートカットとかを勝手に上書きしてたら困るし、<br>なんなら本来のこのMarkdownで書き出すショートカットをまた使いたくなるかもしれないし……。
[^5]: そんなわけがあるか。