【VSCode】Ctrl-mで改行入力

2022-01-28

VSCodeのキーバインドで「Ctrl-m」を改行にしたかったが、一手間必要だった話。

環境:macOS Monterey、VSCode 1.63.2


追記:エクステンション必要なく簡単にできた(ref. Windows-アプリケーション/VSCode/キーバインディング/CTRL-Mで改行 - yanor.net/wiki)、 悩んだのはなんだったんだ…

{
"key": "ctrl+m",
"command": "type",
"args": {
"text": "\n"
},
"when": "editorTextFocus"
}

前口上

改行の入力にreturn(enter)キーを使うのは、ホームポジションから手が離れてしまうのでできれば避けたい。 以前はemacsを使用していたというのと、macのターミナルでもCtrl-mで受け付けるので同じにしたい。

エクステンションでemacsバインディングにできるものもあるが、コピー&ペーストなどの機能はOS標準で使いたかったので、使わないことにした。 キーバインディングで設定できるかと思ったが、そのままではできなかった。

VSCodeのキーバインディング設定

VSCodeでキーバインディングの設定をするにはメニューのPreferences > Keyboard Shortcutsを選んだり、 Shift-Command-pでコマンドパレットから”keyboard”と入力して「Preferences: Open Keyboard Shortcuts」を選ぶなどで開ける。

キーバインディングの編集方法

開いた「Keyboard Shortcuts」は表形式になっていて、設定を検索したりインタラクティブにショートカットキーを設定したりできる。

またそのペイン右上に表示されるアイコン(Open Keyboard Shortcuts (JSON))のクリックで、JSONファイル(keybindings.json)での表示や変更ができる。

使えそうだったコマンド

ショートカットキーはコマンドに対して割り当てるので、どんなコマンドがあるかと、そのコマンド名を知る必要がある。 どういうコマンドがあるのか、一覧をどこで見れるのか、というのはちょっとわからなかったが、 使えそうだった(だけどちょっと違った)ものを少し記述する:

lineBreakInsert

lineBreakInsert コマンドで改行の挿入ができる:

{
"key": "ctrl+m",
"command": "lineBreakInsert",
"when": "textInputFocus && !editorReadonly"
}

これがそのまま使えるかと思ったが、改行をいれるだけでカーソル位置が移動しなかった。

insertLineAfter

Visual Studio CodeでCtrl+MをEnterに割り当てる方法が分からない - ゲームが作れるようになるまでがんばる日記 を見て、 insertLineAfter コマンドが使えそう:

{
"key": "ctrl+m",
"command": "editor.action.insertLineAfter",
"when": "textInputFocus && !editorReadonly"
}

一見うまく動くんだけど行の途中で入力した場合に、その位置に改行挿入で以降が次の行になるんではなく、単に下に新しい行が挿入されてしまう。

解決した方法

標準で return キー入力と同じ動作のコマンドはない?ようなので、別の方法を使う必要があった。 手順は以下の通り:

{
...
"multiCommand.commands": [
{
"command": "multiCommand.insertCarriageReturn",
"sequence": [
"lineBreakInsert",
"cursorRight"
]
}
],
...
}
  • keybindings.json にマルチコマンドを指定する:
{
"key": "ctrl+m",
"command": "extension.multiCommand.execute",
"args": {
"command": "multiCommand.insertCarriageReturn",
},
"when": "textInputFocus && !editorReadonly"
}

これで望みの動作になりました…やりたいことは単純なのにすんなりいかんな…という印象。