MENU

VisualStudioCode

【VSCode】キーボードショートカットを編集してみる

更新日:2022/08/29

VSCodeは様々なコマンドが定義されています。
コマンドの一部はキーボードからのショートカットキーで実行できます。
キーを押すだけで実行できるので、ラクチンですね。

 

しかしショートカットが設定されていないものは、メニューやコマンドパレットを経由して実行します。
たまに使うものなら気にならないのですが、よく使うものは手間に感じますね。

 

そこで今回は、ショートカットとして登録されていないコマンドにショートカットキーを登録したり、設定済みのコマンドを変更する方法をお伝えします。

 

キーボードショートカット編集画面を開く

 

VSCodeはキーボードショートカットを編集する画面が用意されています。
サクッと表示してみましょう。

 

メニュー:ファイル → ユーザー設定 → キーボードショートカット の順でクリックしていきます。

 

メニュー:ファイル → ユーザー設定  → キーボードショートカット

 

これで、キーボードショートカット編集画面が表示されます。

 

ここまでできれば、後は説明不要だと思いますが、一応使い方を解説していきます。

キーボードショートカット編集画面の項目

 

キーボードショートカット編集画面には、4つの項目があります。

 

キーボードショートカット編集画面

 

項目内容
コマンド(command)ショートカットで実行されるコマンド
キーバインド(key)コマンドを実行するショートカットキー
いつ(when)ショートカットキーを使用できる条件
ソース「規定」または「ユーザー」

 

「キーバインド」に何も表示されていないものは、ショートカットキーが登録されていません。
「キーバインド」または「いつ」の内容を変更すると、「ソース」は「規定」から「ユーザー」へ変更されます。

 

いつ(when)については、この記事のいつ(when)の値と条件演算子を見てください。

 

拡張機能が登録したコマンドの「ソース」は「拡張機能」と表示されます。

コマンドの検索

 

変更するコマンドは、キーボードショートカット編集画面内の検索欄で検索できます。

 

検索欄に検索したいコマンドの一部を入力

 

現在登録されているショートカットキーで、コマンドを検索することもできます。

 

検索欄の右側にあるキーボードアイコンをクリックします。
「キーを記録しています」が表示されている状態で、ショートカットキーをキーボードに入力します。

 

検索欄に入力したショートカットが文字で表示され、「キーバインド」と一致する項目が表示されます。

 

キーバインドが一致する項目が表示

 

検索の終了は、再度キーボードアイコンを押すか、キーボードでescキーを入力します。

 

検索欄の文字を消そうとしてキーボードdeleteキーを押すと、deleteキーが検索候補になります。
「検索が終了しない!」とパニックになる人がたまにいる(僕です)ので、注意しましょう。

 

「キーを記録しています」状態でなくても、キーを表現する文字列をダブルコーテーションで囲うと「キーバインド」が検索されます。

キーバインドの変更

 

キーバインドの変更は、コマンドを選択して左側の鉛筆アイコンをクリックするか、項目上をダブルクリックします。

 

キーバインドの変更

 

キー入力パネルが表示されます。
設定したいキーを入力して、エンターを押すと登録されます。

 

既存のコマンドがこのキーボードを使用しています

 

「既存のコマンドがこのキーボードを使用しています」と表示されているときは、ショートカットキーが重複しています。
重複していても、エンターを押すと登録されます。

 

間違えて登録したときは、現在登録されているショートカットキーでコマンド検索して修正しましょう。

変更内容の登録先

 

キーボードショートカット編集画面で登録した内容は、keybindings.json に書き込まれています。

 

keybindings.jsonん

 

VSCodeを起動すると、規定値が読み込まれた後に keybindings.json の内容が上書きされます。

 

keybindings.jsonは、キーボードショートカット編集画面の「キーボードショートカットを開く」アイコンをクリックすると表示できます。

 

「キーボードショートカットを開く」アイコン

 

コマンド名がわかれば、手作業でキーボードショートカットを変更できますね。
ただし規定でショートカットが登録されているものは、変更前のキーからのコマンド削除が必要です。

 

次のようにコマンド名の前に "-" を記述すると削除になるようです。
"-" がないものは、追加ですね。

 

[
    {
        "key": "ctrl+s",
        "command": "editor.action.selectAll"
    },
    {
        "key": "ctrl+a",
        "command": "-editor.action.selectAll"
    }
]

キーバインドの削除とリセット

 

変更したショートカットキーを規定に戻すときは、コンテキストメニューから「キーバインドのリセット」を実行します。

 

コマンドからショートカットキーを取り除きたいときは、コンテキストメニューから「キーバインドの削除」を実行します。

 

キーバインドの削除

 

全てを規定値に戻したいときは、全ての変更した項目に「キーバインドのリセット」を実行します。

 

「それはめんどうだ!」という人は、keybindings.jsonを開いて内容を全て消去後、上書きします。
ラクチンなので、こちらがおススメ。

 

いつ(when)の値と条件演算子

 

キーボードショートカット編集画面の「いつ」項目は様々なコンテキスト(ここでは変数のようなもの)を指定でき、条件演算子で細かい条件付けができます。
一覧で挙げておきます。

 

 

条件演算子

 

「いつ」項目は、次のような条件演算子が使用できます。

 

条件演算子意味
==一致"editorLangId == javascript"
!=不一致"editorLangId != javascript"
||OR"editorLangId == javascript || editorLangId == typescript"
&&AND"editorLangId == javascript && resourceExtname == .js"
!否定"!editorFocus"
=~正規表現マッチ"editorLangId =~ /^javascript$|^typescript$/"
>、>=より大きい、以上"workspaceFolderCount > 1"
in含む左辺はオブジェクトまたは配列。

右辺の値と、オブジェクトのキーまたは配列の要素のどれかが一致するときtrue。

 

例:

 

settings.json

{ "abc.def":{ 
      "test.js" : true ,
      "test2.js" : false
   } 
}

 

keybindings.json

"when": "resourceFilename in config.abc.def"

 

現在のエディターのフィル名が test.js または test2.js のとき、ショートカットが有効になります。

 

 

 

コンテキスト

 

VS Codeのドキュメントで挙げられている、「いつ」項目で使用できるコンテキストの一覧です。

 

キーボードショートカット編集画面にはこれ以外にも設定されていますが、一部はVSCode内部で使用するのが目的で将来変更される可能性があるようです。

 

エディター関連

 

コンテキスト意味
editorFocus真偽値テキストまたはウィジェットにフォーカスがある
editorTextFocus真偽値テキストにフォーカスがある
textInputFocus真偽値エディターにもフォーカスがある
inputFocus真偽値テキスト入力領域 (エディターまたはテキスト ボックス) にフォーカスがある
editorHasSelection真偽値テキストが選択されいる
editorHasMultipleSelections真偽値複数のテキスト領域が選択されている
editorReadonly真偽値エディターが読み取り専用
editorLangId文字列エディターに関連付けられた言語 ID。

typescript、javascript、cppなど

isInDiffEditor真偽値差分エディターかどうか
isInEmbeddedEditor真偽値フォーカスが埋め込みエディター内にある

 

エクスプローラー関連

 

コンテキスト意味
explorerViewletVisible真偽値エクスプローラーが表示されている
explorerViewletFocus真偽値エクスプローラーにフォーカスがある
filesExplorerFocus真偽値ファイルエクスプローラーセクションにフォーカスがある
openEditorsFocus真偽値オープンエディターセクションにフォーカスがある
explorerResourceIsFolder真偽値エクスプローラーでフォルダーが選択されている

 

エディター ウィジェット関連

 

コンテキスト意味
findWidgetVisible真偽値エディター検索ウィジェットが表示されている
suggestWidgetVisible真偽値提案ウィジェット (IntelliSense) が表示されている
suggestWidgetMultipleSuggestions真偽値複数の候補が表示されている
renameInputVisible真偽値名前変更入力テキストボックスが表示されている
referenceSearchVisible真偽値Peek References のピーク ウィンドウが開いている
inReferenceSearchEditor真偽値Peek References のピークウィンドウエディターにフォーカスがある
config.editor.stablePeek真偽値ピークエディターを開いたまま (editor.stablePeek設定で制御)
quickFixWidgetVisible真偽値Quick Fixウィジェットが表示されている
parameterHintsVisible真偽値パラメーターのヒントが表示表示されている (editor.parameterHints.enabled設定によって制御)
parameterHintsMultipleSignatures真偽値複数のパラメーターのヒントが表示されている

 

デバッガ―関連

 

コンテキスト意味
debuggersAvailable真偽値適切なデバッガ拡張機能が利用可能
inDebugMode真偽値デバッグセッション実行中
debugState文字列デバッガーの状態。inactive、initializing、stopped、runningのどれか
debugType文字列デバッグタイプ。 launch.jsonのタイプ?
inDebugRepl真偽値フォーカスはデバッグコンソールREPL(式を入力できるところ)にある

 

OS判定

 

コンテキスト意味
isLinux真偽値OSがLinux
isMac真偽値OSがmacOS
isWindows真偽値OSがWindows
isWeb真偽値Web からエディターにアクセス

 

リスト関連

 

コンテキスト意味
listFocus真偽値リストにフォーカスがある
listSupportsMultiselect真偽値リストが複数選択をサポートしている
listHasSelectionOrFocus真偽値リスが選択またはフォーカスがある
listDoubleSelection真偽値リストは2つの要素が選択されている
listMultiSelection真偽値リストは複数の要素が選択されている

 

モード関連

 

コンテキスト意味
inSnippetMode真偽値エディターがスニペットモード
inQuickOpen真偽値Quick Openドロップダウンにフォーカスがある

 

リソース関連

 

コンテキスト意味
resourceScheme文字列リソースのUriスキーム。file,httpなど
resourceFilename文字列エクスプローラーまたはエディターのファイル名
resourceExtname文字列クスプローラーまたはエディターのファイル名拡張子
resourceDirname文字列エクスプローラーまたはエディターのリソースの絶対フォルダーパス
resourcePath文字列エクスプローラーまたはエディターのリソースの絶対パス
resourceLangId文字列エクスプローラーまたはエディターの言語 ID
isFileSystemResource真偽値エクスプローラーまたはエディターのファイルがファイルシステムプロバイダーで処理可能
resourceSet真偽値エクスプローラーまたはエディターにファイルが設定されている
resource文字列エクスプローラーまたはエディターのファイルの完全なURI

 

統合ターミナル関連

 

コンテキスト意味
terminalFocus真偽値統合ターミナルにフォーカスがある
terminalIsOpen真偽値統合ターミナルが開いている

 

タイムライン ビュー関連

 

コンテキスト意味
timelineFollowActiveEditor真偽値タイムライン ビューがアクティブなエディターに従っている
timelineItem文字列タイムラインアイテムの値

 

拡張機能関連

 

コンテキスト意味
extension文字列拡張機能のID
extensionStatus真偽値拡張機能がインストールされている
extensionHasConfiguration真偽値拡張機能に構成がある

 

グローバルUI関連

 

コンテキスト意味
notificationFocus真偽値通知にキーボードフォーカスがある
notificationCenterVisible真偽値通知センターが VS Codeの右下に表示されている
notificationToastsVisible真偽値VS Code の右下に通知トーストが表示されている
searchViewletVisible真偽値検索ビューが開いている
sideBarVisible真偽値サイドバーが表示されている
sideBarFocus真偽値サイドバーにフォーカスがある
panelFocus真偽値パネルにフォーカスがある
inZenMode真偽値ウィンドウは禅モード(集中モード)
isCenteredLayout真偽値エディタは中央配置
workbenchState文字列empty、folder(1 フォルダ)、または workspaceのどれか
workspaceFolderCount数値ワークスペースフォルダーの数
replaceActive真偽値検索ビュー置換テキストボックスが開いている
view文字列ビュー識別子
viewItem文字列viewItem コンテキスト
isFullscreen真偽値ウィンドウが全画面表示
focusedView文字列現在フォーカスされているビューの識別子
canNavigateBack真偽値戻ることができるかどうか
canNavigateForward真偽値前方にナビゲートできるかどうか
canNavigateToLastEditLocation真偽値最後の編集場所に移動できるかどうか

 

グローバルエディターUI関連

 

コンテキスト意味
textCompareEditorVisible真偽値1つ以上の差分 (比較) エディターが表示されている
textCompareEditorActive真偽値差分 (比較) エディターがアクティブ
editorIsOpen真偽値エディターが1つ開いている
groupEditorsCount文字列グループ内の編集者の数
activeEditorGroupEmpty真偽値アクティブな編集者グループに編集者がいない
activeEditorGroupIndex数値エディターグリッド内のエディター グループの位置を反映して始まる番号。

(インデックス1を持つグループは左上隅の最初)

activeEditorGroupLast真偽値エディターグリッドの最後のエディターグループかどうか
multipleEditorGroups真偽値複数のエディター グループが存在するかどうか
activeEditor文字列グループ内のアクティブなエディターの識別子
activeEditorIsDirty真偽値グループ内のアクティブなエディターがダーティかどうか
activeEditorIsNotPreview真偽値グループ内のアクティブなエディターがプレビューモードでない
activeEditorIsPinned真偽値グループ内のアクティブなエディターが固定されているかどうか
inSearchEditor真偽値フォーカスが検索エディター内にあるかどうか

 

構成設定の値

 

setteing.jsonなどで設定されている構成設定の名前の前に "config."を付けることで いつ(when)の値として使用できます。

 

例:

 

editor.autoIndent → config.editor.autoIndent

 

 

 

引数が必要なコマンド

 

キーボードショートカット編集画面は引数が必要なコマンドの設定ができませんが、keybindings.jsonを直接編集することで引数を渡すことができます。

 

引数は、"args"で指定します。

 

次のコードは、Ctrl+Shift+Alt+pを押すと5行スクロールするショートカット定義です。

 

[
    {
        "key": "Ctrl+Shift+Alt+p",
        "command": "editorScroll",
        "args": { 
            "to": "down",
            "by": "line",
            "value": 5
        },
    },
]

 

コマンドについては、次のリンク先を読んでみてください。

 

https://code.visualstudio.com/api/references/commands

スポンサーリンク

記事の内容について

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

OFUSEを設置してみました。
応援いただけると嬉しいです。