ist jetzt verfügbar! Lesen Sie über die neuen Funktionen und Fehlerbehebungen vom November.

Terminal Shell Integration

Visual Studio Code kann mit gängigen Shells integriert werden, sodass das Terminal mehr über das Geschehen in der Shell versteht. Diese zusätzlichen Informationen ermöglichen einige nützliche Funktionen wie die Erkennung des Arbeitsverzeichnisses und die Befehlsfilterung, Dekorationen und Navigation.

Unterstützte Shells

  • Linux/macOS: bash, fish, pwsh, zsh
  • Windows: Git Bash, pwsh

Installation

Automatische Skriptinjektion

Standardmäßig sollte das Shell-Integrationsskript bei von VS Code gestarteten unterstützten Shells automatisch aktiviert werden. Dies geschieht durch das Einfügen von Argumenten und/oder Umgebungsvariablen beim Starten der Shell-Sitzung. Diese automatische Injektion kann deaktiviert werden, indem Sie terminal.integrated.shellIntegration.enabled auf false setzen.

Diese Standardmethode funktioniert möglicherweise nicht für einige fortgeschrittene Anwendungsfälle wie in Sub-Shells, über eine normale ssh-Sitzung (wenn nicht die Remote - SSH-Erweiterung verwendet wird) oder für einige komplexe Shell-Konfigurationen. Die empfohlene Methode, die Shell-Integration für diese Fälle zu aktivieren, ist die manuelle Installation.

Hinweis: Die automatische Injektion funktioniert möglicherweise nicht bei älteren Versionen der Shell. Ältere Versionen von fish unterstützen beispielsweise die Umgebungsvariable $XDG_DATA_DIRS nicht, über die die Injektion erfolgt. Möglicherweise können Sie sie immer noch manuell installieren, um sie zum Laufen zu bringen.

Manuelle Installation

Um die Shell-Integration manuell zu installieren, muss das VS Code-Shell-Integrationsskript während der Initialisierung Ihrer Shell ausgeführt werden. Wo und wie dies geschieht, hängt von der verwendeten Shell und dem Betriebssystem ab. Bei der manuellen Installation wird empfohlen, terminal.integrated.shellIntegration.enabled auf false zu setzen, obwohl dies nicht zwingend erforderlich ist.

Tipp: Wenn Sie die Insiders-Version verwenden, ersetzen Sie code durch code-insiders.

bash

Fügen Sie Folgendes zu Ihrer ~/.bashrc-Datei hinzu. Führen Sie code ~/.bashrc in bash aus, um die Datei in VS Code zu öffnen.

[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path bash)"

fish

Fügen Sie Folgendes zu Ihrer config.fish-Datei hinzu. Führen Sie code $__fish_config_dir/config.fish in fish aus, um die Datei in VS Code zu öffnen.

string match -q "$TERM_PROGRAM" "vscode"
and . (code --locate-shell-integration-path fish)

pwsh

Fügen Sie Folgendes zu Ihrem PowerShell-Profil hinzu. Führen Sie code $Profile in pwsh aus, um die Datei in VS Code zu öffnen.

if ($env:TERM_PROGRAM -eq "vscode") { . "$(code --locate-shell-integration-path pwsh)" }

zsh

Fügen Sie Folgendes zu Ihrer ~/.zshrc-Datei hinzu. Führen Sie code ~/.zshrc in zsh aus, um die Datei in VS Code zu öffnen.

[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"

Git Bash

Fügen Sie Folgendes zu Ihrer ~/.bashrc-Datei hinzu. Führen Sie code ~/.bashrc in Git Bash aus, um die Datei in VS Code zu öffnen.

[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path bash)"

Portabilität vs. Leistung

Die obige Shell-Integrationsinstallation ist plattformübergreifend und mit jeder Installation kompatibel, wenn code im $PATH ist. Dieser empfohlene Ansatz startet jedoch Node.js, um den Skriptpfad abzurufen, was zu einer leichten Verzögerung beim Shell-Start führt. Um diese Verzögerung zu mildern, können Sie das obige Skript direkt einbetten, indem Sie den Pfad vorab auflösen und direkt in Ihr Init-Skript einfügen.

# Output the executable's path first:
code --locate-shell-integration-path bash

# Add the result of the above to the source statement:
[[ "$TERM_PROGRAM" == "vscode" ]] && . "/path/to/shell/integration/script.sh"

Qualität der Shell-Integration

Wenn Sie die Shell-Integration verwenden, ist ihr eine "Qualität" zugeordnet, die ihre Fähigkeiten beschreibt. Diese Qualitäten werden davon bestimmt, wie das Shell-Integrationsskript funktioniert.

  • Keine: Keine Shell-Integration ist aktiv.
  • Reichhaltig: Die Shell-Integration ist aktiv und die Befehlserkennung funktioniert ideal.
  • Basis: Die Shell-Integration ist aktiv, aber die Befehlserkennung unterstützt möglicherweise nicht alle Funktionen. Zum Beispiel wird der Ausführungsort des Befehls erkannt, aber nicht sein Exit-Status.

Um die Qualität der Shell-Integration anzuzeigen, fahren Sie mit dem Mauszeiger über den Terminal-Tab. Wählen Sie optional Details anzeigen beim Hovern aus, um detailliertere Informationen anzuzeigen.

IntelliSense

IntelliSense im Terminal ermöglicht Ihnen, Vorschläge für Dateien, Ordner, Befehle, Befehlsargumente und Optionen zu erhalten. Diese Funktion kann mit der Einstellung terminal.integrated.suggest.enabled aktiviert oder deaktiviert werden.

Screenshot of the terminal showing a user has typed git checkout and receives suggestions for the branch name.

Während Sie tippen, erscheint eine Liste von Vorschlägen. Um die Vorschläge manuell auszulösen, verwenden Sie die Tastenkombination .

Standardmäßig fügt Tab den Vorschlag ein. Nachdem Sie die Liste durchsucht haben, fügt Enter den Vorschlag ein. Sie können dieses Verhalten mit der Einstellung terminal.integrated.suggest.selectionMode konfigurieren.

Es gibt verschiedene Einstellungen, um das Verhalten von IntelliSense im Terminal zu konfigurieren.

Globale Abschluss-Zwischenspeicherung

Zur Verbesserung der Leistung speichert VS Code global gültige Elemente für eine bestimmte Shell aggressiv zwischen. Wenn Sie Änderungen an der Shell-Startlogik vornehmen, die Befehle hinzufügt, aktualisieren Sie den Cache manuell mit dem Befehl Terminal: Zwischengespeicherte Globale Abschlüsse löschen (terminal.integrated.suggest.clearCachedGlobals), falls sie nicht automatisch übernommen wurden.

Befehlsdekorationen und die Übersichtslineal

Eines der Dinge, die die Shell-Integration ermöglicht, ist die Möglichkeit, die Exit-Codes von im Terminal ausgeführten Befehlen zu erhalten. Mithilfe dieser Informationen werden Dekorationen links von der Zeile hinzugefügt, um anzuzeigen, ob der Befehl erfolgreich war oder fehlgeschlagen ist. Diese Dekorationen erscheinen auch im relativ neuen Übersichtslineal in der Bildlaufleiste, genau wie im Editor.

Blue circles appear next to successful commands, red circles with crosses appear next to failed commands. The color of the circles appears in the scroll bar

Mit den Dekorationen kann interagiert werden, um einige kontextbezogene Aktionen wie das erneute Ausführen des Befehls durchzuführen.

Clicking a successful command decoration shows a context menu containing items: Copy Output, Copy Output as HTML, Rerun Command and How does this work?

Die Dekorationen für Befehle und das Übersichtslineal können mit der Einstellung terminal.integrated.shellIntegration.decorationsEnabled konfiguriert werden.

Befehlsnavigation

Die von der Shell-Integration erkannten Befehle fließen in die Befehlsnavigationsfunktion (Strg/Cmd+Oben, Strg/Cmd+Unten) ein, um zuverlässigere Befehlspositionen zu erhalten. Diese Funktion ermöglicht eine schnelle Navigation zwischen Befehlen und die Auswahl ihrer Ausgabe. Um vom aktuellen Standort bis zum Befehl auszuwählen, können Sie auch die Umschaltaste gedrückt halten und Umschalt+Strg/Cmd+Oben und Umschalt+Strg/Cmd+Unten drücken.

Befehlsführer

Der Befehlsführer ist eine Leiste, die neben einem Befehl und seiner Ausgabe erscheint, wenn mit der Maus darüber gefahren wird. Dies hilft, den Befehl schneller zu identifizieren und ist auch eine Möglichkeit zu überprüfen, ob die Shell-Integration ordnungsgemäß funktioniert.

Screenshot of the terminal, highlighting the command guide vertical bar on the left-hand side to indicate the boundary of a command.

Sie können die Farbe des Befehlsführers mit Farbschemata anpassen. Um den Befehlsführer ein- oder auszublenden, konfigurieren Sie die Einstellung terminal.integrated.shellIntegration.showCommandGuide.

Sticky Scroll

Die Sticky-Scroll-Funktion "haftet" den teilweise sichtbaren Befehl am oberen Rand des Terminals an, wodurch es viel einfacher wird, zu sehen, zu welchem Befehl diese Ausgabe gehört. Ein Klick auf die Sticky-Scroll-Komponente scrollt zur Position des Befehls im Terminalpuffer.

Sticky scroll will show the command at the top of the terminal viewport

Dies kann mit der Einstellung terminal.integrated.stickyScroll.enabled aktiviert werden.

Schnellkorrekturen

VS Code scannt die Ausgabe eines Befehls und präsentiert eine Schnellkorrektur mit Aktionen, die mit hoher Wahrscheinlichkeit das sind, was der Benutzer als nächstes tun möchte.

Running 'git push --set-upstream' will present a lightbulb that opens a dropdown with an option to open a new PR on github.com

Hier sind einige der integrierten Schnellkorrekturen

  • Wenn erkannt wird, dass ein Port bereits belegt ist, schlagen Sie vor, den Prozess zu beenden und den vorherigen Befehl erneut auszuführen.
  • Wenn git push aufgrund eines nicht festgelegten Upstreams fehlschlägt, schlagen Sie vor, mit festgelegtem Upstream zu pushen.
  • Wenn ein git-Unterbefehl mit einem ähnlichen Befehlsfehler fehlschlägt, schlagen Sie vor, den/die ähnlichen Befehle zu verwenden.
  • Wenn git push zu einem Vorschlag zur Erstellung eines GitHub PR führt, schlagen Sie vor, den Link zu öffnen.
  • Wenn ein PowerShell-Feedbackanbieter vom Typ General oder cmd-not-found ausgelöst wird, schlagen Sie jeden Vorschlag vor.

Die Schnellkorrekturfunktion unterstützt auch Barrierefreiheitssignale für zusätzliches Feedback, wenn eine Schnellkorrektur verfügbar ist.

Neuesten Befehl ausführen

Der Befehl Terminal: Letzten Befehl ausführen zeigt den Verlauf aus verschiedenen Quellen in einer Schnellauswahl an und bietet ähnliche Funktionalität wie die Rückwärtssuche der Shell (Strg+R). Die Quellen sind der Verlauf der aktuellen Sitzung, der Verlauf der vorherigen Sitzung für diesen Shell-Typ und die allgemeine Shell-Verlaufsdatei.

The "run recent command" command shows a quick pick with previously run commands that can be filtered similar to the go to file command

Einige weitere Funktionen des Befehls

  • Standardmäßig ist der Suchmodus "kontinuierliche Suche", was bedeutet, dass der Suchbegriff genau übereinstimmen muss. Die Schaltfläche rechts vom Suchfeld ermöglicht den Wechsel zur Fuzzy-Suche.
  • Im Abschnitt der aktuellen Sitzung gibt es ein Clipboard-Symbol rechts von der Schnellauswahl, das die Befehlsausgabe in einem Editor öffnet.
  • Die Pin-Aktion rechts von der Schnellauswahl kann den Befehl oben in der Liste anheften.
  • Wenn Sie die Alt-Taste gedrückt halten, wird der Text in das Terminal geschrieben, ohne ihn auszuführen.
  • Die Menge des im Abschnitt "Vorherige Sitzung" gespeicherten Verlaufs wird durch die Einstellung terminal.integrated.shellIntegration.history bestimmt.

Die Standardtastenkombination für diesen Befehl ist Strg+Alt+R. Wenn der Barrierefreiheitsmodus aktiviert ist, werden diese jedoch vertauscht; Strg+R führt einen letzten Befehl aus und Strg+Alt+R sendet Strg+R an die Shell.

Die Tastenkombinationen können umgeschaltet werden, wenn der Barrierefreiheitsmodus deaktiviert ist, mit den folgenden Tastenkombinationen.

{
    "key": "ctrl+r",
    "command": "workbench.action.terminal.runRecentCommand",
    "when": "terminalFocus"
},
{
  "key": "ctrl+alt+r",
  "command": "workbench.action.terminal.sendSequence",
  "args": { "text": "\u0012"/*^R*/ },
  "when": "terminalFocus"
}

Zum letzten Verzeichnis wechseln

Ähnlich wie die Funktion "Letzten Befehl ausführen" erfasst der Befehl Terminal: Zum letzten Verzeichnis wechseln besuchte Verzeichnisse und ermöglicht das schnelle Filtern und Navigieren (cd) zu ihnen. Wenn Sie die Alt-Taste gedrückt halten, wird der Text in das Terminal geschrieben, ohne ihn auszuführen.

Die Standardtastenkombination für diesen Befehl ist ⌘G (Windows, Linux Strg+G), da sie ähnlich wie der Befehl Gehe zu Zeile/Spalte im Editor funktioniert. Strg+G kann mit Strg+Alt+G an die Shell gesendet werden.

Erkennung des aktuellen Arbeitsverzeichnisses

Die Shell-Integration teilt VS Code mit, was das aktuelle Arbeitsverzeichnis der Shell ist. Diese Information ist unter Windows nicht ohne Regex-basierte Erkennung zu erhalten und erfordert unter macOS und Linux Abfragen, was die Leistung beeinträchtigt.

Eine der größten Funktionen, die dies ermöglicht, ist die verbesserte Auflösung von Links im Terminal. Nehmen Sie zum Beispiel den Link package.json. Wenn der Link aktiviert wird, während die Shell-Integration deaktiviert ist, wird ein Schnellwahlfenster mit package.json als Filter geöffnet, wenn mehrere package.json-Dateien im Arbeitsbereich vorhanden sind. Wenn die Shell-Integration aktiviert ist, wird die Datei package.json im aktuellen Ordner direkt geöffnet, da der aktuelle Standort bekannt ist. Dies ermöglicht es der Ausgabe von ls beispielsweise, die richtige Datei zuverlässig zu öffnen.

Das aktuelle Arbeitsverzeichnis wird auch verwendet, um das Verzeichnis im Terminal-Tab, in der Schnellauswahl für zuletzt ausgeführte Befehle und für die Funktion "terminal.integrated.splitCwd": "inherited" anzuzeigen.

Erweiterte PowerShell-Tastenkombinationen

Die Windows-Konsolen-API bietet mehr Tastenkombinationen als Linux/macOS-Terminals. Da VS Codes Terminal letztere auch unter Windows emuliert, gibt es einige PowerShell-Tastenkombinationen, die mit Standardmitteln aufgrund fehlender VT-Kodierung nicht möglich sind, z. B. Strg+Leertaste. Die Shell-Integration ermöglicht es VS Code, benutzerdefinierte Tastenkombinationen anzuhängen, um eine spezielle Sequenz an PowerShell zu senden, die dann im Shell-Integrationsskript behandelt und an den entsprechenden Tastenhandler weitergeleitet wird.

Die folgenden Tastenkombinationen sollten in PowerShell funktionieren, wenn die Shell-Integration aktiviert ist.

  • Strg+Leertaste: Standardmäßig MenuComplete nur unter Windows.
  • Alt+Leertaste: Standardmäßig SetMark auf allen Plattformen.
  • Umschalt+Enter: Standardmäßig AddLine auf allen Plattformen.
  • Umschalt+Ende: Standardmäßig SelectLine auf allen Plattformen.
  • Umschalt+Pos1: Standardmäßig SelectBackwardsLine auf allen Plattformen.

Verbesserte Barrierefreiheit

Die Informationen, die die Shell-Integration an VS Code liefert, werden verwendet, um die Barrierefreiheit im Terminal zu verbessern. Einige Beispiele für Verbesserungen sind:

  • Navigation durch erkannte Befehle im zugänglichen Puffer (⌥F2 (Windows Alt+F2, Linux Umschalt+Alt+F2))
  • Ein Audio-Signal wird abgespielt, wenn ein Befehl fehlschlägt.
  • Synchronisation der zugrunde liegenden Textbox, sodass die Verwendung der Pfeil- und Rücklöschungstasten korrekter funktioniert.

Unterstützte Escape-Sequenzen

VS Code unterstützt mehrere benutzerdefinierte Escape-Sequenzen.

VS Code benutzerdefinierte Sequenzen 'OSC 633 ; ... ST'

VS Code verfügt über eine Reihe benutzerdefinierter Escape-Sequenzen, die dazu dienen, die Shell-Integrationsfunktion zu aktivieren, wenn sie im VS Code-Terminal ausgeführt werden. Diese werden von den integrierten Skripten verwendet, können aber auch von jeder Anwendung verwendet werden, die in der Lage ist, Sequenzen an das Terminal zu senden. Zum Beispiel verwendet die Julia-Erweiterung diese, um die Shell-Integration in der Julia REPL zu unterstützen.

Diese Sequenzen sollten von anderen Terminals ignoriert werden. Da andere Terminals die Sequenzen jedoch nicht breiter übernehmen, wird empfohlen, zu überprüfen, ob $TERM_PROGRAM vscode ist, bevor Sie sie schreiben.

  • OSC 633 ; A ST: Markiere Prompt-Start.

  • OSC 633 ; B ST: Markiere Prompt-Ende.

  • OSC 633 ; C ST: Markiere Vor-Ausführung.

  • OSC 633 ; D [; <exitcode>] ST: Markiere Ausführung beendet mit optionalem Exit-Code.

  • OSC 633 ; E ; <commandline> [; <nonce>] ST: Setze explizit die Kommandozeile mit einer optionalen Nonce.

    Die E-Sequenz ermöglicht es dem Terminal, die vom Interpreter der Shell genaue Kommandozeile zuverlässig zu erhalten. Wenn dies nicht angegeben ist, kann das Terminal auf die Verwendung der Sequenzen A, B und C zurückfallen, um den Befehl zu erhalten, oder die Erkennung ganz deaktivieren, wenn sie unzuverlässig ist.

    Die optionale Nonce kann verwendet werden, um zu überprüfen, ob die Sequenz vom Shell-Integrationsskript stammt, um die Befehlsverfälschung zu verhindern. Wenn die Nonce erfolgreich verifiziert wird, werden einige Schutzmaßnahmen vor der Verwendung der Befehle zur Verbesserung der Benutzererfahrung entfernt.

    Die Kommandozeile kann ASCII-Zeichen mit dem Format \xAB maskieren, wobei AB die hexadezimale Darstellung des Zeichencodes ist (Groß-/Kleinschreibung wird nicht beachtet), und das \-Zeichen mit \\ maskieren. Es ist erforderlich, Semikolon (0x3b) und Zeichen 0x20 und darunter zu maskieren, und dies ist besonders wichtig für neue Zeilen und Semikolons.

    Einige Beispiele

    "\"  -> "\\"
    "\n" -> "\x0a"
    ";"  -> "\x3b"
    
  • OSC 633 ; P ; <Property>=<Value> ST: Setzt eine Eigenschaft auf dem Terminal, nur bekannte Eigenschaften werden behandelt.

    Bekannte Eigenschaften

    • Cwd: Meldet das aktuelle Arbeitsverzeichnis an das Terminal.
    • IsWindows: Gibt an, ob das Terminal ein Windows-Backend wie winpty oder conpty verwendet. Dies kann verwendet werden, um zusätzliche Heuristiken zu aktivieren, da die Positionierung der Shell-Integrationssequenzen nicht garantiert korrekt ist. Gültige Werte sind True und False.
    • HasRichCommandDetection: Gibt an, ob das Terminal über erweiterte Befehlserkennungsfunktionen verfügt. Diese Eigenschaft wird auf True gesetzt, wenn das Shell-Integrationsskript ideal wie von VS Code erwartet funktioniert, insbesondere wenn die Sequenzen an den erwarteten Positionen in der Reihenfolge A, B, E, C, D eintreffen.

Final Term Shell Integration

VS Code unterstützt die Shell-Integrationssequenzen von Final Term, die es Nicht-VS-Code-Shell-Integrationsskripten ermöglichen, in VS Code zu arbeiten. Dies führt zu einer etwas eingeschränkten Erfahrung, da es nicht so viele Funktionen unterstützt wie OSC 633. Hier sind die unterstützten Sequenzen:

  • OSC 133 ; A ST: Markiere Prompt-Start.
  • OSC 133 ; B ST: Markiere Prompt-Ende.
  • OSC 133 ; C ST: Markiere Vor-Ausführung.
  • OSC 133 ; D [; <exitcode>] ST: Markiere Ausführung beendet mit optionalem Exit-Code.

iTerm2 Shell Integration

Die folgenden von iTerm2 eingeführten Sequenzen werden unterstützt:

  • OSC 1337 ; CurrentDir=<Cwd> S: Setzt das aktuelle Arbeitsverzeichnis des Terminals, ähnlich wie OSC 633 ; P ; Cwd=<Cwd> ST.

  • OSC 1337 ; SetMark ST: Fügt eine Markierung links von der Zeile hinzu, auf der sie ausgelöst wurde, und fügt eine Anmerkung zur Bildlaufleiste hinzu.

    When the sequence is written to the terminal a small grey circle will appear to the left of the command, with a matching annotation in the scroll bar

    Diese Markierungen integrieren sich mit der Befehlsnavigation, um sie einfach über ⌘↑ (Windows, Linux Strg+Oben) und ⌘↓ (Windows, Linux Strg+Unten) anspringen zu können.

Häufig gestellte Fragen

Wann funktioniert die automatische Injektion nicht?

Es gibt mehrere Fälle, in denen die automatische Injektion nicht funktioniert. Hier sind einige häufige Fälle:

  • $PROMPT_COMMAND hat ein nicht unterstütztes Format. Die Änderung, um auf eine einzelne Funktion zu verweisen, ist eine einfache Möglichkeit, dies zu umgehen. Zum Beispiel:

    prompt() {
      printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"
    }
    PROMPT_COMMAND=prompt
    
  • Einige Shell-Plugins können die VS Code-Shell-Integration explizit deaktivieren, indem sie $VSCODE_SHELL_INTEGRATION beim Initialisieren aufheben.

Warum werden Befehlsdekorationen angezeigt, wenn die Funktion deaktiviert ist?

Die wahrscheinliche Ursache dafür ist, dass Ihr System eine Shell-Integration für ein anderes Terminal installiert hat, das VS Code versteht. Wenn Sie keine Dekorationen wünschen, können Sie diese mit der folgenden Einstellung ausblenden:

"terminal.integrated.shellIntegration.decorationsEnabled": never

Alternativ könnten Sie das Shell-Integrationsskript aus Ihrem Shell-RC/Startup-Skript entfernen, verlieren aber den Zugriff auf befehlsbezogene Funktionen wie die Befehlsnavigation.

Warum springt die Befehlsdekoration unter Windows herum?

Windows verwendet ein emuliertes Pseudoterminal (pty) Backend namens ConPTY. Es funktioniert etwas anders als ein reguläres pty, da es die Kompatibilität mit der Windows-Konsolen-API aufrechterhalten muss. Eine der Auswirkungen davon ist, dass das pty die Darstellung speziell behandelt, sodass die Shell-Integrationssequenzen, die die Befehle im Terminalpuffer identifizieren, falsch platziert sein können. Wenn der Befehl springt, geschieht dies typischerweise nach der Ausführung eines Befehls, und die Heuristiken von VS Code greifen, um die Position der Befehlsdekorationen zu verbessern.

© . This site is unofficial and not affiliated with Microsoft.