🍰

VSCodeでCmd+Xの「何も選択していない時の1行カット」を無効化する

に公開

VSCodeでCmd+Xを押すと、テキストを何も選択していない状態でも現在行が丸ごとカットされます。
この挙動は標準のテキストエディタと異なるため、意図せず行を消してしまうことがあります。
この記事では、選択時のみカットが動作するようにキーバインドを変更する方法を説明します。

問題

VSCodeでは、何も選択していない状態でCmd+X(Windowsの場合はCtrl+X)を押すと、現在のカーソル行が丸ごとカットされてクリップボードに入ります。
最近keyball39を使い始めましたが、慣れていないせいでcmd+zでUndoしたつもりが、行を削除してしまうことが続き面倒でした。

解決策

keybindings.jsonに以下を追記することで、選択時のみCmd+Xが動作するようになります。

{
  // Windowsの場合は "ctrl+x"
  "key": "cmd+x",
  "command": "noop"
},
{
  // Windowsの場合は "ctrl+x"
  "key": "cmd+x",
  "command": "editor.action.clipboardCutAction",
  "when": "editorHasSelection"
}

Windowsの場合は"key"を"ctrl+x"に変更してください。
keybindings.jsonを開く方法

Cmd+Shift+P(Windowsの場合Ctrl+Shift+P)でコマンドパレットを開く
Preferences: Open Keyboard Shortcuts (JSON)を選択
上記の設定を追記して保存

なぜこれで動くのか

VSCodeのキーバインドは上から順に評価され、条件に合致した最初のコマンドが実行されます。

{
  "key": "cmd+x",
  "command": "noop"
}

この設定で、Cmd+Xを押したときのデフォルト動作を無効化(noop = no operation)します。

{
  "key": "cmd+x",
  "command": "editor.action.clipboardCutAction",
  "when": "editorHasSelection"
}

そのあと、"when": "editorHasSelection"という条件付きでカットコマンドを定義します。
これにより「テキストが選択されている場合のみカットが動作する」ようになります。

参考

https://github.com/microsoft/vscode/issues/122518#issuecomment-829321550

Discussion