when clause Kontexte
Visual Studio Code setzt verschiedene Kontextschlüssel und spezifische Werte, abhängig davon, welche Elemente in der VS Code UI sichtbar und aktiv sind. Diese Kontexte können verwendet werden, um Erweiterungsbefehle und UI-Elemente, wie Menüs und Ansichten, selektiv zu aktivieren oder zu deaktivieren.
Zum Beispiel verwendet VS Code when clauses, um Tastenkombinationen für Befehle zu aktivieren oder zu deaktivieren, was Sie in der JSON-Datei für Standardtastenkombinationen sehen können (Einstellungen: Standardtastenkombinationen (JSON) öffnen).
{ "key": "f5", "command": "workbench.action.debug.start",
"when": "debuggersAvailable && !inDebugMode" },
Oben hat der integrierte Befehl Debuggen starten die Tastenkombination F5, die nur aktiviert ist, wenn ein geeigneter Debugger verfügbar ist (Kontextschlüssel debuggersAvailable ist true) und der Editor sich nicht im Debug-Modus befindet (Kontextschlüssel inDebugMode ist false).
Bedingte Operatoren
Eine when clause kann aus einem Kontextschlüssel (z.B. inDebugMode) bestehen oder verschiedene Operatoren verwenden, um nuanciertere Editorzustände auszudrücken.
Logische Operatoren
Logische Operatoren ermöglichen die Kombination einfacher Kontextschlüssel oder when-clause-Ausdrücke, die andere logische Operatoren, Gleichheitsoperatoren, Vergleichsoperatoren, Match-Operatoren, in/not in Operatoren oder geklammerte Ausdrücke enthalten.
| Operator | Symbol | Beispiel |
|---|---|---|
| Nicht | ! |
"!editorReadonly" oder "!(editorReadonly || inDebugMode)" |
| Und | && |
"textInputFocus && !editorReadonly" |
| Oder | || |
"isLinux || isWindows" |
Hinweis zur Priorität logischer Operatoren: Die obige Tabelle listet Operatoren in absteigender Reihenfolge der Priorität auf. Beispiele
| Geschrieben als | Interpretiert als |
|---|---|
!foo && bar |
(!foo) && bar |
!foo || bar |
(!foo) || bar |
foo || bar && baz |
foo || (bar && baz) |
!foo && bar || baz |
(!foo && bar) || baz |
!(foo || bar) && baz |
(bleibt gleich) !(foo || bar) && baz |
Gleichheitsoperatoren
Sie können die Gleichheit eines Kontextschlüsselwerts mit einem angegebenen Wert prüfen. Beachten Sie, dass die rechte Seite ein Wert ist und nicht als Kontextschlüssel interpretiert wird, d.h., sie wird nicht im Kontext nachgeschlagen.
| Operator | Symbol | Beispiel |
|---|---|---|
| Gleichheit | == |
"editorLangId == typescript" oder "editorLangId == 'typescript'" |
| Ungleichheit | != |
"resourceExtname != .js" oder "resourceExtname != '.js'" |
Hinweise
- Wenn der Wert auf der rechten Seite ein String ist, der Leerzeichen enthält, muss er in einfache Anführungszeichen gesetzt werden -
"resourceFilename == 'My New File.md'". ===hat das gleiche Verhalten wie==und!==hat das gleiche Verhalten wie!=
Vergleichsoperatoren
Sie können den Wert eines Kontextschlüssels mit einer Zahl vergleichen. Beachten Sie, dass die linke und die rechte Seite des Operators durch ein Leerzeichen getrennt sein müssen - foo < 1, aber nicht foo<1.
| Operator | Symbole | Beispiel |
|---|---|---|
| Größer als | >, >= |
"gitOpenRepositoryCount >= 1" aber nicht "gitOpenRepositoryCount>=1" |
| Kleiner als | <, <= |
"workspaceFolderCount < 2" aber nicht "workspaceFolderCount<2" |
Match-Operator
(früherer Name: Key-Value-Pair-Match-Operator)
| Operator | Symbol | Beispiel |
|---|---|---|
| Übereinstimmung | =~ |
"resourceScheme =~ /^untitled$|^file$/" |
Es gibt einen Match-Operator (=~) für when clauses. Der Ausdruck key =~ regularExpressionLiteral behandelt die rechte Seite als regulären Ausdrucksliteral zum Abgleich mit der linken Seite. Um beispielsweise Kontextmenüeinträge für alle Docker-Dateien beizutragen, könnte man verwenden
"when": "resourceFilename =~ /docker/"
Hinweise
- Die rechte Seite des
=~Operators folgt den gleichen Regeln wie reguläre Ausdruckliterale (Referenz) in JavaScript, mit der Ausnahme, dass Zeichen sowohl den Escape-Regeln von JSON-Strings als auch regulären Ausdrücken folgen müssen. Zum Beispiel wäre ein regulärer Ausdrucksliteral zum Abgleich eines Substringsfile:///file:\/\//in JavaScript, aber/file:\\/\\//in einer when clause, da ein Backslash in einem JSON-String und ein Schrägstrich in einem regulären Ausdrucksmuster escaped werden muss. - Es gibt keinen Operator
!=~, aber Sie können den Match-Ausdruck negieren -!(foo =~ /baz/).
Reguläre Ausdruck-Flags
Es ist möglich, Flags mit den regulären Ausdrucksliteralen zu verwenden. Zum Beispiel resourceFilename =~ /json/i oder myContextKey =~ /baz/si.
Unterstützte Flags: i, s, m, u.
Ignorierte Flags: g, y.
'in' und 'not in' bedingte Operatoren
Der in Operator für when clauses ermöglicht die dynamische Suche nach dem Wert eines Kontextschlüssels innerhalb des Werts eines anderen Kontextschlüssels. Wenn Sie beispielsweise einen Kontextmenübefehl zu Ordnern hinzufügen möchten, die einen bestimmten Dateityp enthalten (oder etwas, das nicht statisch bekannt ist), können Sie nun den in Operator verwenden, um dies zu erreichen. Sie können den not in Operator verwenden, um die entgegengesetzte Bedingung zu prüfen.
| Operator | Symbol | Beispiel |
|---|---|---|
| In | in |
"resourceFilename in supportedFolders" |
| Nicht in | not in |
"resourceFilename not in supportedFolders" |
Bestimmen Sie zuerst, welche Ordner den Befehl unterstützen sollen, und fügen Sie die Ordnernamen zu einem Array hinzu. Verwenden Sie dann den setContext Befehl, um das Array in einen Kontextschlüssel umzuwandeln.
vscode.commands.executeCommand('setContext', 'ext.supportedFolders', [
'test',
'foo',
'bar'
]);
// or
// Note in this case (using an object), the value doesn't matter, it is based on the existence of the key in the object
// The value must be of a simple type
vscode.commands.executeCommand('setContext', 'ext.supportedFolders', {
test: true,
foo: 'anything',
bar: false
});
Dann können Sie in der package.json eine Menübeitragung für das explorer/context Menü hinzufügen.
// Note, this assumes you have already defined a command called ext.doSpecial
"menus": {
"explorer/context": [
{
"command": "ext.doSpecial",
"when": "explorerResourceIsFolder && resourceFilename in ext.supportedFolders"
}
]
}
In diesem Beispiel nehmen wir den Wert von resourceFilename (was in diesem Fall der Ordnername ist) und prüfen dessen Existenz im Wert von ext.supportedFolders. Wenn er existiert, wird das Menü angezeigt. Dieser leistungsstarke Operator sollte reichhaltigere bedingte und dynamische Beiträge ermöglichen, die when clauses unterstützen, z.B. Menüs, Ansichten usw.
Verfügbare Kontextschlüssel
Nachfolgend sind einige der verfügbaren Kontextschlüssel aufgeführt, die zu Boolean true/false ausgewertet werden.
Die Liste hier ist nicht vollständig und Sie können andere when clause Kontexte finden, indem Sie im Tastenkombinationen-Editor suchen und filtern (Einstellungen: Tastenkombinationen öffnen) oder die JSON-Datei für Standardtastenkombinationen überprüfen (Einstellungen: Standardtastenkombinationen (JSON) öffnen). Sie können auch Kontextschlüssel identifizieren, an denen Sie interessiert sind, mit dem Inspect Context Keys Utility.
| Kontextname | True wenn |
|---|---|
| Editor-Kontexte | |
editorFocus |
Ein Editor hat den Fokus, entweder Text oder ein Widget. |
editorTextFocus |
Der Text in einem Editor hat den Fokus (Cursor blinkt). |
textInputFocus |
Jeder Editor hat den Fokus (regulärer Editor, Debug REPL usw.). |
inputFocus |
Jeder Texteingabebereich hat den Fokus (Editoren oder Textfelder). |
editorTabMovesFocus |
Ob Tab den Fokus aus dem Editor verschiebt. |
editorHasSelection |
Text ist im Editor ausgewählt. |
editorHasMultipleSelections |
Mehrere Textbereiche sind ausgewählt (mehrere Cursor). |
editorReadonly |
Der Editor ist schreibgeschützt. |
editorLangId |
True, wenn die zugehörige Sprachkennung des Editors übereinstimmt. Beispiel: "editorLangId == typescript". |
isInDiffEditor |
Der aktive Editor ist ein Diff-Editor. |
isInEmbeddedEditor |
True, wenn der Fokus sich innerhalb eines eingebetteten Editors befindet. |
| Betriebssystem-Kontexte | |
isLinux |
True, wenn das Betriebssystem Linux ist. |
isMac |
True, wenn das Betriebssystem macOS ist. |
isWindows |
True, wenn das Betriebssystem Windows ist. |
isWeb |
True, wenn über das Web auf den Editor zugegriffen wird. |
| Listen-Kontexte | |
listFocus |
Eine Liste hat den Fokus. |
listSupportsMultiselect |
Eine Liste unterstützt Mehrfachauswahl. |
listHasSelectionOrFocus |
Eine Liste hat eine Auswahl oder den Fokus. |
listDoubleSelection |
Eine Liste hat eine Auswahl von 2 Elementen. |
listMultiSelection |
Eine Liste hat eine Auswahl von mehreren Elementen. |
| Modus-Kontexte | |
inSnippetMode |
Der Editor befindet sich im Snippet-Modus. |
inQuickOpen |
Das Quick Open Dropdown hat den Fokus. |
| Ressourcen-Kontexte | |
resourceScheme |
True, wenn das Ressourcenschema der URI übereinstimmt. Beispiel: "resourceScheme == file" |
resourceFilename |
True, wenn der Dateiname im Explorer oder Editor übereinstimmt. Beispiel: "resourceFilename == gulpfile.js" |
resourceExtname |
True, wenn die Dateinamenerweiterung im Explorer oder Editor übereinstimmt. Beispiel: "resourceExtname == .js" |
resourceDirname |
True, wenn der absolute Ordnerpfad der Ressource im Explorer oder Editor übereinstimmt. Beispiel: "resourceDirname == /users/alice/project/src" |
resourcePath |
True, wenn der absolute Pfad der Ressource im Explorer oder Editor übereinstimmt. Beispiel: "resourcePath == /users/alice/project/gulpfile.js" |
resourceLangId |
True, wenn die Sprachkennung des Titels im Explorer oder Editor übereinstimmt (Sprachkennung). Beispiel: "resourceLangId == markdown" |
isFileSystemResource |
True, wenn die Datei im Explorer oder Editor eine Dateisystemressource ist, die von einem Dateisystemanbieter gehandhabt werden kann. |
resourceSet |
True, wenn eine Datei im Explorer oder Editor gesetzt ist. |
resource |
Die vollständige URI der Datei im Explorer oder Editor. |
| Explorer-Kontexte | |
explorerViewletVisible |
True, wenn die Explorer-Ansicht sichtbar ist. |
explorerViewletFocus |
True, wenn die Explorer-Ansicht den Tastaturfokus hat. |
filesExplorerFocus |
True, wenn der Datei-Explorer-Bereich den Tastaturfokus hat. |
openEditorsFocus |
True, wenn der Abschnitt OFFENE EDITOREN den Tastaturfokus hat. |
explorerResourceIsFolder |
True, wenn ein Ordner im Explorer ausgewählt ist. |
| Editor-Widget-Kontexte | |
findWidgetVisible |
Das Editor-Such-Widget ist sichtbar. |
suggestWidgetVisible |
Das Vorschlags-Widget (IntelliSense) ist sichtbar. |
suggestWidgetMultipleSuggestions |
Mehrere Vorschläge werden angezeigt. |
renameInputVisible |
Das Umbenennungs-Eingabefeld ist sichtbar. |
referenceSearchVisible |
Das Fenster "Referenzen suchen" ist geöffnet. |
inReferenceSearchEditor |
Der Editor des Fensters "Referenzen suchen" hat den Fokus. |
config.editor.stablePeek |
Peek-Editoren offen halten (gesteuert durch die Einstellung editor.stablePeek). |
codeActionMenuVisible |
Das Menü "Code-Aktion" ist sichtbar. |
parameterHintsVisible |
Parameter-Hinweise sind sichtbar (gesteuert durch die Einstellung editor.parameterHints.enabled). |
parameterHintsMultipleSignatures |
Mehrere Parameter-Hinweise werden angezeigt. |
| Debugger-Kontexte | |
debuggersAvailable |
Eine geeignete Debugger-Erweiterung ist verfügbar. |
inDebugMode |
Eine Debug-Sitzung läuft. |
debugState |
Aktueller Debugger-Status. Mögliche Werte sind inactive, initializing, stopped, running. |
debugType |
True, wenn der Debug-Typ übereinstimmt. Beispiel: "debugType == 'node'". |
inDebugRepl |
Fokus liegt in der Debug-Konsole REPL. |
| Integrierte Terminal-Kontexte | |
terminalFocus |
Ein integriertes Terminal hat den Fokus. |
terminalIsOpen |
Ein integriertes Terminal ist geöffnet. |
| Timeline-Ansicht-Kontexte | |
timelineFollowActiveEditor |
True, wenn die Timeline-Ansicht dem aktiven Editor folgt. |
| Timeline-Ansicht-Element-Kontexte | |
timelineItem |
True, wenn der Kontextwert des Timeline-Elements übereinstimmt. Beispiel: "timelineItem =~ /git:file:commit\\b/". |
| Erweiterungs-Kontexte | |
extension |
True, wenn die ID der Erweiterung übereinstimmt. Beispiel: "extension == eamodio.gitlens". |
extensionStatus |
True, wenn die Erweiterung installiert ist. Beispiel: "extensionStatus == installed". |
extensionHasConfiguration |
True, wenn die Erweiterung eine Konfiguration hat. |
| Globale UI-Kontexte | |
notificationFocus |
Benachrichtigung hat den Tastaturfokus. |
notificationCenterVisible |
Das Benachrichtigungszentrum ist unten rechts in VS Code sichtbar. |
notificationToastsVisible |
Toast-Benachrichtigungen sind unten rechts in VS Code sichtbar. |
searchViewletVisible |
Die Suchansicht ist geöffnet. |
sideBarVisible |
Die Seitenleiste ist angezeigt. |
sideBarFocus |
Die Seitenleiste hat den Fokus. |
panelFocus |
Das Panel hat den Fokus. |
inZenMode |
Das Fenster befindet sich im Zen-Modus. |
isCenteredLayout |
Der Editor befindet sich im zentrierten Layout-Modus. |
workbenchState |
Kann empty, folder (1 Ordner) oder workspace sein. |
workspaceFolderCount |
Anzahl der Arbeitsbereichsordner. |
replaceActive |
Das Ersetzen-Textfeld der Suchansicht ist geöffnet. |
view |
Für view/title und view/item/context, die Ansicht, in der der Befehl angezeigt wird.Beispiel: "view == myViewsExplorerID". |
viewItem |
Für view/item/context, der contextValue des Baum-Elements.Beispiel: "viewItem == someContextValue". |
webviewId |
Für webview/context, die Webview-ID, in der der Befehl angezeigt wird.Beispiel: "webviewId == catCoding". |
isFullscreen |
True, wenn das Fenster im Vollbildmodus ist. |
focusedView |
Die Kennung der aktuell fokussierten Ansicht. |
canNavigateBack |
True, wenn die Navigation zurück möglich ist. |
canNavigateForward |
True, wenn die Navigation vorwärts möglich ist. |
canNavigateToLastEditLocation |
True, wenn die Navigation zur letzten Bearbeitungsposition möglich ist. |
| Globale Editor-UI-Kontexte | |
textCompareEditorVisible |
Mindestens ein Diff- (Vergleichs-) Editor ist sichtbar. |
textCompareEditorActive |
Ein Diff- (Vergleichs-) Editor ist aktiv. |
editorIsOpen |
True, wenn ein Editor geöffnet ist. |
groupEditorsCount |
Anzahl der Editoren in einer Gruppe. |
activeEditorGroupEmpty |
True, wenn die aktive Editorgruppe keine Editoren enthält. |
activeEditorGroupIndex |
Eine Zahl beginnend mit 1, die die Position einer Editorgruppe im Editorraster widerspiegelt.Die Gruppe mit dem Index 1 ist die erste in der oberen linken Ecke. |
activeEditorGroupLast |
Ist true für die letzte Editorgruppe im Editorraster. |
multipleEditorGroups |
True, wenn mehrere Editorgruppen vorhanden sind. |
activeEditor |
Die Kennung des aktiven Editors in einer Gruppe. |
activeEditorIsDirty |
True, wenn der aktive Editor in einer Gruppe beschmutzt (dirty) ist. |
activeEditorIsNotPreview |
True, wenn der aktive Editor in einer Gruppe nicht im Vorschau-Modus ist. |
activeEditorIsPinned |
True, wenn der aktive Editor in einer Gruppe angeheftet ist. |
inSearchEditor |
True, wenn der Fokus sich innerhalb eines Sucheditors befindet. |
activeWebviewPanelId |
Die ID des aktuell aktiven Webview-Panels. |
activeCustomEditorId |
Die ID des aktuell aktiven Benutzerdefinierten Editors. |
| Konfigurations-Einstellungen-Kontexte | |
config.editor.minimap.enabled |
True, wenn die Einstellung editor.minimap.enabled auf true gesetzt ist. |
Hinweis: Sie können jede Benutzer- oder Arbeitsbereichseinstellung, die zu einem booleschen Wert ausgewertet wird, hier mit dem Präfix
"config."verwenden.
Sichtbare/Fokussierte Ansicht bei when clause Kontext
Sie können eine when clause haben, die prüft, ob eine bestimmte Ansicht sichtbar oder fokussiert ist.
| Kontextname | True wenn |
|---|---|
view.${viewId}.visible |
True, wenn eine bestimmte Ansicht sichtbar ist. Beispiel: "view.workbench.explorer.fileView.visible" |
focusedView |
True, wenn eine bestimmte Ansicht fokussiert ist. Beispiel: "focusedView == 'workbench.explorer.fileView'" |
Ansicht-Identifikatoren
workbench.explorer.fileView- Datei-Explorerworkbench.explorer.openEditorsView- Geöffnete Editorenoutline- Gliederungsansichttimeline- Timeline-Ansichtworkbench.scm- Quellcodeverwaltungworkbench.scm.repositories- Quellcodeverwaltung Repositoriesworkbench.debug.variablesView- Variablenworkbench.debug.watchExpressionsView- Überwachungworkbench.debug.callStackView- Aufrufstapelworkbench.debug.loadedScriptsView- Geladene Skripteworkbench.debug.breakPointsView- Haltepunkteworkbench.debug.disassemblyView- Disassemblierungworkbench.views.extensions.installed- Installierte Erweiterungenextensions.recommendedList- Empfohlene Erweiterungenworkbench.panel.markers.view- Problemeworkbench.panel.output- Ausgabeworkbench.panel.repl.view- Debug-Konsoleterminal- Integriertes Terminalworkbench.panel.comments- Kommentare
Sichtbare Ansichtscontainer bei when clause Kontext
Sie können eine when clause haben, die prüft, ob ein bestimmter Ansichtscontainer sichtbar ist.
| Kontextname | True wenn |
|---|---|
activeViewlet |
True, wenn der Ansichtscontainer in der Seitenleiste sichtbar ist. Beispiel: "activeViewlet == 'workbench.view.explorer'" |
activePanel |
True, wenn der Ansichtscontainer im Panel sichtbar ist. Beispiel: "activePanel == 'workbench.panel.output'" |
activeAuxiliary |
True, wenn der Ansichtscontainer in der sekundären Seitenleiste sichtbar ist. Beispiel: "activeAuxiliary == 'workbench.view.debug'" |
Ansichtscontainer-Identifikatoren
workbench.view.explorer- Datei-Explorerworkbench.view.search- Sucheworkbench.view.scm- Quellcodeverwaltungworkbench.view.debug- Ausführenworkbench.view.extensions- Erweiterungenworkbench.panel.markers- Problemeworkbench.panel.output- Ausgabeworkbench.panel.repl- Debug-Konsoleterminal- Integriertes Terminalworkbench.panel.comments- Kommentare
Wenn Sie eine when clause wünschen, die nur aktiviert ist, wenn ein bestimmter Ansichtscontainer den Fokus hat, verwenden Sie sideBarFocus oder panelFocus oder auxiliaryBarFocus in Kombination mit den Kontextschlüsseln activeViewlet oder activePanel oder activeAuxiliary.
Zum Beispiel ist die folgende when clause nur dann wahr, wenn der Datei-Explorer den Fokus hat.
"sideBarFocus && activeViewlet == 'workbench.view.explorer'"
Eine Einstellung in einer when clause prüfen
In einer when clause können Sie auf einen Konfigurationswert (Einstellung) verweisen, indem Sie ihm das Präfix config. voranstellen, z.B. config.editor.tabCompletion oder config.breadcrumbs.enabled.
Einen benutzerdefinierten when clause Kontext hinzufügen
Wenn Sie Ihre eigene VS Code-Erweiterung erstellen und Befehle, Menüs oder Ansichten mithilfe eines when clause Kontexts aktivieren/deaktivieren müssen und keine der vorhandenen Schlüssel Ihren Anforderungen entspricht, können Sie Ihren eigenen Kontextschlüssel mit dem setContext Befehl hinzufügen.
Das erste Beispiel unten setzt den Schlüssel myExtension.showMyCommand auf true, den Sie bei der Aktivierung von Befehlen oder mit der when Eigenschaft verwenden können. Das zweite Beispiel speichert einen Wert, den Sie mit einer when clause verwenden könnten, um zu prüfen, ob die Anzahl der coolen offenen Dinge größer als 2 ist.
vscode.commands.executeCommand('setContext', 'myExtension.showMyCommand', true);
vscode.commands.executeCommand('setContext', 'myExtension.numberOfCoolOpenThings', 4);
Inspect Context Keys Utility
Wenn Sie alle aktuell aktiven Kontextschlüssel zur Laufzeit sehen möchten, können Sie den Befehl Entwickler: Kontextschlüssel inspizieren aus der Befehlspalette (⇧⌘P (Windows, Linux Ctrl+Shift+P)) verwenden. Kontextschlüssel inspizieren zeigt Kontextschlüssel und ihre Werte in der **Konsole** der VS Code Developer Tools an (Hilfe > Entwicklertools umschalten).
Wenn Sie Entwickler: Kontextschlüssel inspizieren ausführen, hebt Ihr Cursor Elemente in der VS Code UI hervor, und wenn Sie auf ein Element klicken, werden die aktuellen Kontextschlüssel und ihre Zustände als Objekt in der Konsole ausgegeben.

Die Liste der aktiven Kontextschlüssel ist umfangreich und kann benutzerdefinierte Kontextschlüssel von installierten Erweiterungen enthalten.
Hinweis: Einige Kontextschlüssel sind für die interne Verwendung von VS Code bestimmt und können sich in Zukunft ändern.