Terminal Fortgeschritten
Das integrierte Terminal von Visual Studio Code verfügt über viele erweiterte Funktionen und Einstellungen, wie z. B. Unicode- und Emoji-Unterstützung, benutzerdefinierte Tastenkombinationen und automatische Antworten. Dieses Thema erläutert diese erweiterten Funktionen im Detail. Wenn Sie neu bei VS Code oder dem integrierten Terminal sind, möchten Sie möglicherweise zuerst das Thema Terminal-Grundlagen durchlesen.
Persistente Sitzungen
Das Terminal unterstützt zwei verschiedene Arten von persistenten Sitzungen
- Prozesswiederverbindung: Beim Neuladen eines Fensters (z. B. nach der Installation einer Erweiterung) wird eine Wiederverbindung zum vorherigen Prozess hergestellt und dessen Inhalt wiederhergestellt.
- Prozesswiederherstellung: Beim Neustart von VS Code wird der Inhalt eines Terminals wiederhergestellt und der Prozess mit seiner ursprünglichen Umgebung neu gestartet.
Beide persistenten Sitzungen können deaktiviert werden, indem terminal.integrated.enablePersistentSessions auf false gesetzt wird. Die Menge des wiederhergestellten Scrollbacks wird durch die Einstellung terminal.integrated.persistentSessionScrollback gesteuert. Die Prozesswiederherstellung kann unabhängig mit terminal.integrated.persistentSessionReviveProcess konfiguriert werden.
Terminals zwischen Fenstern verschieben
Terminalregisterkarten können zwischen VS Code-Fenstern gezogen und abgelegt werden. Dies kann auch manuell über die Befehlspalette und die Befehle Terminal: Sitzung trennen und Terminal: Sitzung anhängen erfolgen.
Terminal-Sichtbarkeit konfigurieren
Beim Öffnen eines Fensters, wenn die Terminalansicht sichtbar ist, wird entweder eine Wiederverbindung zum Terminal über persistente Sitzungen hergestellt oder eine neue Shell erstellt. Dieses Verhalten kann mit der Einstellung terminal.integrated.hideOnStartup fein abgestimmt werden.
nie(Standard): Die Terminalansicht wird beim Start nie ausgeblendet.wennLeer: Das Terminal wird nur ausgeblendet, wenn keine persistenten Sitzungen wiederhergestellt wurden.immer: Das Terminal wird immer ausgeblendet, auch wenn persistente Sitzungen wiederhergestellt wurden.
Die Einstellung terminal.integrated.hideOnLastClosed ist ebenfalls verfügbar, um das Standardverhalten des Schließens der Terminalansicht beim Schließen des letzten Terminals zu überschreiben.
Tastenkombinationen und die Shell
Als eingebettete Anwendung sollte das integrierte Terminal einige, aber nicht alle, Tastenkombinationen abfangen, die innerhalb von VS Code ausgelöst werden.
Die konfigurierbare Einstellung terminal.integrated.commandsToSkipShell bestimmt, welche Tastenkombinationen von Befehlen immer die "Shell überspringen" und stattdessen vom Tastenkombinationssystem von VS Code behandelt werden sollen. Standardmäßig enthält sie eine hartcodierte Liste von Befehlen, die für die VS Code-Erfahrung unerlässlich sind, aber Sie können bestimmte Befehle hinzufügen oder entfernen.
{
"terminal.integrated.commandsToSkipShell": [
// Ensure the toggle sidebar visibility keyboard shortcut skips the shell
"workbench.action.toggleSidebarVisibility",
// Send quick open's keyboard shortcut to the shell
"-workbench.action.quickOpen",
]
}
Sehen Sie sich die Details der Einstellung terminal.integrated.commandsToSkipShell an, um die vollständige Liste der Standardbefehle zu sehen.
Tipp: terminal.integrated.sendKeybindingsToShell kann so konfiguriert werden, dass terminal.integrated.commandsToSkipShell überschrieben wird und die meisten Tastenkombinationen an die Shell weitergeleitet werden. Beachten Sie, dass dies Tastenkombinationen wie Strg+F zum Öffnen der Suche deaktiviert.
Akkorde
Akkord-Tastenkombinationen bestehen aus zwei Tastenkombinationen, z. B. Strg+K gefolgt von Strg+C, um die Zeile zu kommentieren. Akkorde überspringen standardmäßig immer die Shell, können aber mit terminal.integrated.allowChords deaktiviert werden.
macOS Bildschirm löschen
Unter macOS ist Cmd+K eine gängige Tastenkombination in Terminals, um den Bildschirm zu löschen. VS Code berücksichtigt dies ebenfalls, was bedeutet, dass Cmd+K-Akkorde nicht funktionieren. Cmd+K-Akkorde können aktiviert werden, indem die Tastenkombination zum Löschen des Bildschirms entfernt wird.
{
"key": "cmd+k",
"command": "-workbench.action.terminal.clear"
}
Zusätzlich wird diese Tastenkombination automatisch überschrieben, wenn Erweiterungen Tastenkombinationen für Cmd+K beisteuern, aufgrund der Funktionsweise der Priorität von Tastenkombinationen. Um die Cmd+K-Tastenkombination zum Löschen des Bildschirms in diesem Fall wieder zu aktivieren, können Sie sie in den Benutzertastenkombinationen neu definieren, die eine höhere Priorität als Erweiterungstastenkombinationen haben.
{
"key": "cmd+k",
"command": "workbench.action.terminal.clear",
"when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
}
Mnemonics
Die Verwendung von Mnemonics zum Zugriff auf das Menü von VS Code (z. B. Alt+F für das Datei-Menü) ist im Terminal standardmäßig deaktiviert, da diese Tastaturereignisse oft wichtige Hotkeys in Shells sind. Setzen Sie terminal.integrated.allowMnemonics, um Mnemonics zu aktivieren, aber beachten Sie, dass dies alle Alt-Tastaturereignisse an die Shell blockiert. Diese Einstellung hat unter macOS keine Auswirkung.
Benutzerdefinierte Sequenz-Tastenkombinationen
Der Befehl workbench.action.terminal.sendSequence kann verwendet werden, um eine bestimmte Textsequenz an das Terminal zu senden, einschließlich Escape-Sequenzen, die von der Shell speziell interpretiert werden. Der Befehl ermöglicht es Ihnen, Pfeiltasten, Enter, Cursor-Bewegungen und mehr zu senden. Führen Sie diesen Befehl über die Befehlspalette aus, die eine manuelle Eingabe ermöglicht, aber am nützlichsten ist er, wenn Sie eine benutzerdefinierte Tastenkombination mit Argumenten zuweisen.
Zum Beispiel springt die folgende Sequenz über das Wort links vom Cursor (Strg+Links) und drückt dann Rücktaste.
{
"key": "ctrl+u",
"command": "workbench.action.terminal.sendSequence",
"args": {
"text": "\u001b[1;5D\u007f"
}
}
Diese Funktion unterstützt Variablenersetzung.
Der Befehl sendSequence funktioniert nur mit dem Format \u0000 zur Verwendung von Zeichen über ihren Zeichencode (nicht \x00). Lesen Sie mehr über diese Hex-Codes und Terminal-Sequenzen in den folgenden Ressourcen:
Ein benutzerdefiniertes Signal senden
Der Befehl workbench.action.terminal.sendSignal kann verwendet werden, um ein beliebiges Signal an den Vordergrundprozess im aktiven Terminal zu senden.
Zum Beispiel sendet die folgende Tastenkombination SIGTERM, was dazu führt, dass sie sich ordnungsgemäß beendet.
{
"key": "ctrl+shift+/",
"command": "workbench.action.terminal.sendSignal",
"args": {
"signal": "SIGTERM"
}
}
Bestätigungsdialoge
Um unnötige Ausgaben und Benutzereingabeaufforderungen zu vermeiden, zeigt das Terminal keine Warnungsdialoge an, wenn Prozesse beendet werden. Wenn Warnungen erwünscht sind, können sie mit den folgenden Einstellungen konfiguriert werden:
- terminal.integrated.confirmOnExit - Steuert, ob beim Schließen des Fensters bestätigt werden soll, wenn aktive Debug-Sitzungen vorhanden sind.
- terminal.integrated.confirmOnKill - Steuert, ob beim Beenden von Terminals, die Kindprozesse haben, bestätigt werden soll.
- terminal.integrated.showExitAlert - Steuert, ob die Benachrichtigung "Der Terminalprozess wurde mit dem Exit-Code beendet" angezeigt werden soll, wenn der Exit-Code nicht null ist.
Automatische Antworten
Das Terminal kann automatisch eine konfigurierbare Eingabeantwort an die Shell senden, wenn eine exakte Ausgabesequenz empfangen wird. Der häufigste Anwendungsfall ist die automatische Beantwortung einer Eingabeaufforderung, wenn Sie in Batch-Skripten Strg+C drücken, die fragen, ob der Benutzer den Batch-Auftrag beenden möchte. Um diese Meldung automatisch zu unterdrücken, fügen Sie diese Einstellung hinzu:
{
"terminal.integrated.autoReplies": {
"Terminate batch job (Y/N)": "Y\r"
}
}
Beachten Sie, dass das hier verwendete Zeichen \r für Enter steht und wie bei benutzerdefinierten Sequenz-Tastenkombinationen unterstützt diese Funktion das Senden von Escape-Sequenzen an die Shell.
Standardmäßig sind keine automatischen Antworten konfiguriert, da die Eingabe an die Shell eine explizite Aktion oder Konfiguration durch den Benutzer sein sollte.
Tabulatorbreite ändern
Die Einstellung terminal.integrated.tabStopWidth ermöglicht die Konfiguration der Tabulatorbreite, wenn ein im Terminal laufendes Programm \t ausgibt. Dies ist normalerweise nicht erforderlich, da Programme den Cursor oft bewegen, anstatt das Zeichen Tab zu verwenden, kann aber in einigen Situationen nützlich sein.
Unicode- und Emoji-Unterstützung
Das Terminal unterstützt sowohl Unicode als auch Emojis. Wenn diese Zeichen im Terminal verwendet werden, gibt es einige Vorbehalte bei dieser Unterstützung:
- Einige Unicode-Symbole haben eine mehrdeutige Breite, die sich zwischen Unicode-Versionen ändern kann. Derzeit unterstützen wir die Breiten von Unicode-Version 6 und 11, die mit der Einstellung terminal.integrated.unicodeVersion konfiguriert werden können. Die angegebene Version sollte mit der Unicode-Version übereinstimmen, die von der Shell/dem Betriebssystem verwendet wird, da es sonst zu Renderproblemen kommen kann. Beachten Sie, dass die Unicode-Version der Shell/des Betriebssystems möglicherweise nicht mit der tatsächlichen Breite der Schriftart übereinstimmt.
- Einige Emojis, die aus mehreren Zeichen bestehen, werden möglicherweise nicht korrekt gerendert, z. B. Hauttonmodifikatoren.
- Die Emoji-Unterstützung ist unter Windows eingeschränkt.
Bildunterstützung
Bilder im Terminal funktionieren, vorausgesetzt, sie verwenden entweder die Sixel- oder iTerm-Inline-Bildprotokolle. Diese Funktion ist standardmäßig deaktiviert und kann mit der Einstellung terminal.integrated.enableImages aktiviert werden.
Aktuelle Einschränkungen
- Die Serialisierung funktioniert nicht, sodass das Neuladen eines Terminals keine Bilder beibehält (jerch/xterm-addon-image#47).
- Das Kopieren der Auswahl als HTML enthält nicht das ausgewählte Bild (jerch/xterm-addon-image#50).
- Animierte GIFs funktionieren nicht (jerch/xterm-addon-image#51).
- Bilder, die kürzer als eine Zelle sind, funktionieren nicht richtig. Dies ist ein Designfehler bei den Sequenzen, der auch in XTerm auftritt.
Prozessumgebung
Die Prozessumgebung der Anwendung, die innerhalb des Terminals läuft, wird von verschiedenen Einstellungen und Erweiterungen beeinflusst und kann dazu führen, dass die Ausgabe im VS Code-Terminal anders aussieht als in anderen Terminals.
Umgebungserbung
Wenn VS Code geöffnet wird, startet es eine Login-Shell-Umgebung, um eine Shell-Umgebung zu laden. Dies geschieht, da Entwicklungswerkzeuge oft zur $PATH in einem Shell-Startskript wie ~/.bash_profile hinzugefügt werden. Standardmäßig erbt das Terminal diese Umgebung, abhängig von Ihren Profil-Shell-Argumenten. Das bedeutet, dass möglicherweise mehrere Profilskripte ausgeführt wurden, was zu unerwartetem Verhalten führen könnte.
Diese Umgebungserbung kann unter macOS und Linux über die Einstellung terminal.integrated.inheritEnv deaktiviert werden.
Umgebungsvariablen zwischen VS Code-Instanzen
Beim Starten mehrerer VS Code-Instanzen werden Umgebungsvariablen zwischen ihnen geteilt.
- Die erste VS Code-Instanz erbt Umgebungsvariablen vom Elternprozess (z. B. der Shell oder der Anwendung, die VS Code gestartet hat).
- Nachfolgende VS Code-Instanzen erben Umgebungsvariablen von der ersten laufenden VS Code-Instanz, nicht vom Elternprozess.
Um Umgebungsvariablen zwischen VS Code-Instanzen zu isolieren, verwenden Sie die --user-data-dir Befehlszeilenoption, um jede Instanz mit einem separaten Benutzerdatenverzeichnis auszuführen. Dies stellt sicher, dass jede Instanz ihre eigenen Umgebungsvariablen, Einstellungen und Erweiterungen behält.
Interaktion mit $LANG
Es gibt spezielle Interaktionen mit der Umgebungsvariable $LANG, die bestimmt, wie Zeichen im Terminal dargestellt werden. Diese Funktion wird mit der Einstellung terminal.integrated.detectLocale konfiguriert.
| Wert | Verhalten |
|---|---|
an |
Setzt $LANG immer auf den am häufigsten gewünschten Wert. Der gewählte Wert basiert auf dem Betriebssystem-Gebietsschema (mit Fallback auf en-US) mit UTF-8-Codierung. |
auto (Standard) |
Setzt $LANG ähnlich wie bei an, wenn $LANG nicht richtig konfiguriert ist (nicht auf eine UTF- oder EUC-Codierung gesetzt ist). |
aus |
Ändert $LANG nicht. |
Erweiterungsbeiträge zur Umgebung
Erweiterungen können zur Terminalumgebung beitragen und ihnen so eine gewisse Integration mit dem Terminal ermöglichen. Beispielsweise fügt die integrierte Git-Erweiterung die Umgebungsvariable GIT_ASKPASS ein, damit VS Code die Authentifizierung bei einem Git-Remote verarbeiten kann.
Wenn eine Erweiterung die Terminalumgebung ändert, werden alle vorhandenen Terminals neu gestartet, wenn dies sicher möglich ist, andernfalls wird eine Warnung in der Terminalstatusleiste angezeigt. Weitere Informationen zu der Änderung können im Hover angezeigt werden, der auch eine Schaltfläche zum Neustart enthält.

Windows und ConPTY
Das VS Code-Terminal basiert auf dem xterm.js-Projekt, um ein Unix-ähnliches Terminal zu implementieren, das alle Daten in eine Zeichenkette serialisiert und über ein "Pseudoterminal" leitet. Historisch gesehen funktionierte das Terminal unter Windows nicht so, sondern verwendete die Console API, um seine Konsole namens "conhost" zu implementieren.
Ein Open-Source-Projekt namens winpty wurde erstellt, um dieses Problem zu lösen, indem eine Emulations-/Übersetzungsschicht zwischen einem Unix-ähnlichen Terminal und einer Windows-Konsole bereitgestellt wird. Das VS Code-Terminal wurde ursprünglich ausschließlich mit winpty implementiert. Das war damals großartig, aber 2018 erhielt Windows 10 die ConPTY API, die die von winpty eingeführte Idee aufgriff und in Windows integrierte, um ein zuverlässigeres und unterstützteres System für die Nutzung von Unix-ähnlichen Terminals und Anwendungen unter Windows bereitzustellen.
VS Code verwendet standardmäßig ConPTY unter Windows 10+ (ab Build-Nummer 18309) und fällt auf winpty als Legacy-Option für ältere Windows-Versionen zurück. ConPTY kann explizit über die Einstellungen terminal.integrated.windowsEnableConpty deaktiviert werden, dies sollte jedoch normalerweise vermieden werden.
Da ConPTY eine Emulationsschicht ist, hat es einige Eigenheiten. Das häufigste ist, dass ConPTY sich als Besitzer des Viewports betrachtet und deshalb manchmal den Bildschirm neu druckt. Dieses erneute Drucken kann zu unerwartetem Verhalten führen, wie z. B. der Anzeige alter Inhalte nach dem Ausführen des Befehls Terminal: Löschen.
Remote-Entwicklung
Dieser Abschnitt beschreibt Themen, die speziell für die Verbindung von VS Code mit einem Remote-Computer über eine VS Code Remote Development-Erweiterung gelten.
Lokale Terminals in Remote-Fenstern
Das standardmäßige lokale Terminalprofil kann in Remote-Fenstern mit dem Befehl Terminal: Neues integriertes Terminal erstellen (Lokal) über die Befehlspalette gestartet werden. Derzeit können Nicht-Standardprofile nicht aus Remote-Fenstern gestartet werden.
Reduzierung der Latenz bei der Remote-Eingabe (Vorschau)
Lokale Echo ist eine Funktion, die hilft, die Eingabelatenz in Remote-Fenstern zu mildern. Sie schreibt die Tastenschläge im Terminal in einer gedimmten Farbe, bevor das Ergebnis vom Remote-System bestätigt wird. Standardmäßig wird die Funktion ausgeführt, wenn eine Latenz von über 30 ms erkannt wird, und die Zeitmessung kann mit terminal.integrated.localEchoLatencyThreshold konfiguriert werden. Die Farbe der nicht bestätigten Zeichen wird durch terminal.integrated.localEchoStyle definiert.
Lokale Echo schaltet sich dynamisch ab, je nach aktivem Programm im Terminal. Dies wird durch terminal.integrated.localEchoExcludePrograms gesteuert, das standardmäßig auf ['vim', 'vi', 'nano', 'tmux'] gesetzt ist. Es wird empfohlen, die Funktion für Anwendungen oder Shells zu deaktivieren, die sehr dynamisch sind und/oder beim Tippen viel vom Bildschirm neu zeichnen.
Um die Funktion vollständig zu deaktivieren, verwenden Sie
{
"terminal.integrated.localEchoEnabled": false
}