Tutorial: Öffnen einer Registerkarte oder eines Bereichs im selben Verzeichnis in Windows-Terminal
In der Regel öffnen die Aktionen „Neue Registerkarte“ und „Geteilter Bereich“ immer eine neue Registerkarte bzw. einen neuen Bereich in einem für dieses Profil bestimmten startingDirectory
. Auf anderen Plattformen ist es jedoch üblich, dass neue Registerkarten automatisch das Arbeitsverzeichnis der aktuellen Registerkarte als Startverzeichnis verwenden. Dies ermöglicht dem Benutzer schnelles Multitasking in einem einzelnen Verzeichnis.
Leider ist es unter Windows schwierig, zu bestimmen, was das aktuelle Arbeitsverzeichnis („CWD“) für einen Prozess ist. Selbst wenn wir imstande sind, es nachzuschlagen – nicht alle Anwendungen legen ihr CWD bei der Navigation fest. Insbesondere ändert Windows PowerShell sein CWD nicht, während Sie Ihr cd
im Dateisystem ausführen! Das automatische Duplizieren des CWD von PowerShell wäre fast immer falsch.
Glücklicherweise gibt es eine Problemumgehung. Anwendungen können eine spezielle Escapesequenz (insbesondere die "OSC 9; 9"-Format), um dem Terminal manuell mitzuteilen, was die CWD sein soll.
In diesem Tutorial lernen Sie Folgendes:
- Konfigurieren der Shell, um das Terminal über sein aktuelles Arbeitsverzeichnis zu informieren
- Verwenden der
duplicateTab
-Aktion zum Öffnen einer Registerkarte mit demselben CWD - Verwenden der
splitPane
-Aktion zum Öffnen eines Bereichs mit demselben CWD - Verwenden des Registerkarten-Kontextmenüs, um Registerkarten oder Bereiche mit demselben CWD zu öffnen
Konfigurieren Ihrer Shell
Damit Sie dem Terminal mitteilen können, was das CWD ist, müssen Sie Ihre Shell so ändern, dass sie eine Escapesequenz ausgibt, während Sie im Betriebssystem navigieren. Glücklicherweise verfügen die meisten Shells über einen Mechanismus zum Konfigurieren der „Eingabeaufforderung“, die nach jedem Befehl ausgeführt wird. Dies ist der perfekte Ort, um eine solche Ausgabe hinzuzufügen.
Windows
Eingabeaufforderung: cmd.exe
cmd
verwendet die Umgebungsvariable %PROMPT%
, um die Eingabeaufforderung zu konfigurieren. Sie können der Eingabeaufforderung ganz einfach den Befehl voranstellen, um das CWD mit dem folgenden Befehl festzulegen:
set PROMPT=$e]9;9;$P$e\%PROMPT%
Dadurch wird $e]9;9;$P$e\
an Ihre aktuelle Eingabeaufforderung angefügt. Wenn cmd diese Aufforderung auswertet, ersetzt es
- das
$e
durch das Escapezeichen - das
$p
durch das aktuelle Arbeitsverzeichnis
Beachten Sie, dass der Befehl oben nur für die aktuelle cmd.exe
-Sitzung funktioniert. Wenn Sie den Wert dauerhaft festlegen möchten, sollten Sie NACH dem Ausführen des Befehls oben
setx PROMPT "%PROMPT%"
PowerShell ausführen: powershell.exe
oder pwsh.exe
Wenn Sie Ihre PowerShell-Eingabeaufforderung noch nie geändert haben, sollten Sie zuerst about_Prompts lesen.
Fügen Sie Ihrem PowerShell-Profil Folgendes hinzu:
function prompt {
$loc = $executionContext.SessionState.Path.CurrentLocation;
$out = ""
if ($loc.Provider.Name -eq "FileSystem") {
$out += "$([char]27)]9;9;`"$($loc.ProviderPath)`"$([char]27)\"
}
$out += "PS $loc$('>' * ($nestedPromptLevel + 1)) ";
return $out
}
PowerShell mit posh-git
Wenn Sie posh-git verwenden, ändert dies bereits Ihre Eingabeaufforderung. In diesem Fall sollten Sie der bereits geänderten Eingabeaufforderung nur die erforderliche Ausgabe hinzufügen. Das folgende Beispiel ist eine leicht geänderte Version dieses Beispiels aus der ConEmu-Dokumentation:
function prompt
{
$loc = Get-Location
$prompt = & $GitPromptScriptBlock
$prompt += "$([char]27)]9;12$([char]7)"
if ($loc.Provider.Name -eq "FileSystem")
{
$prompt += "$([char]27)]9;9;`"$($loc.ProviderPath)`"$([char]27)\"
}
$prompt
}
PowerShell mit Starship
Wenn Sie Starship verwenden, ändert dies bereits Ihre Eingabeaufforderung. In diesem Fall sollten Sie der bereits geänderten Eingabeaufforderung nur die erforderliche Ausgabe hinzufügen.
function Invoke-Starship-PreCommand {
$loc = $executionContext.SessionState.Path.CurrentLocation;
$prompt = "$([char]27)]9;12$([char]7)"
if ($loc.Provider.Name -eq "FileSystem")
{
$prompt += "$([char]27)]9;9;`"$($loc.ProviderPath)`"$([char]27)\"
}
$host.ui.Write($prompt)
}
WSL
Windows-Subsystem für Linux-Verteilungen verwenden hauptsächlich BASH als Befehlszeilenshell.
bash
Fügen Sie am Ende Ihrer .bash_profile
-Konfigurationsdatei die folgende Zeile hinzu:
PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND "}'printf "\e]9;9;%s\e\\" "$(wslpath -w "$PWD")"'
Die PROMPT_COMMAND
-Variable in Bash teilt Bash mit, welcher Befehl ausgeführt werden soll, bevor die Eingabeaufforderung angezeigt wird. Die printf
-Anweisung wird verwendet, um die Sequenz zum Festlegen des Arbeitsverzeichnisses für das Terminal anzufügen. Das $(wslpath -w "$PWD")
-Bit ruft die ausführbare Datei wslpath
auf, um das aktuelle Verzeichnis in seinen entsprechenden Windows-Pfad zu konvertieren. Das ${PROMPT_COMMAND:+"$PROMPT_COMMAND; "}
-Bit ist eine Bash-Zauberei, um sicherzustellen, dass wir diesen Befehl an jeden vorhandenen Befehl anfügen (wenn Sie PROMPT_COMMAND
bereits an anderer Stelle festgelegt haben.)
zsh
Fügen Sie am Ende der .zshrc
-Datei die folgenden Zeilen hinzu:
keep_current_path() {
printf "\e]9;9;%s\e\\" "$(wslpath -w "$PWD")"
}
precmd_functions+=(keep_current_path)
Der precmd_functions
Hook teilt Zsh mit, welche Befehle ausgeführt werden sollen, bevor die Eingabeaufforderung angezeigt wird. Die printf
-Anweisung wird verwendet, um die Sequenz zum Festlegen des Arbeitsverzeichnisses für das Terminal anzufügen. Das $(wslpath -w "$PWD")
-Bit ruft die ausführbare Datei wslpath
auf, um das aktuelle Verzeichnis in seinen entsprechenden Windows-Pfad zu konvertieren. Stellen Sie beim Verwenden von precmd_functions+=
sicher, dass wir die keep_current_path
Funktion an eine vorhandene Funktion anfügen, welche bereits für diesen Hook definiert ist.
Fish
Wenn Sie die Fish-Shell verwenden, fügen Sie am Ende Ihrer Konfigurationsdatei unter ~/.config/fish/config.fish
die folgenden Zeilen hinzu:
function storePathForWindowsTerminal --on-variable PWD
if test -n "$WT_SESSION"
printf "\e]9;9;%s\e\\" (wslpath -w "$PWD")
end
end
Diese Funktion wird immer dann aufgerufen, wenn der aktuelle Pfad geändert wird, um zu bestätigen, dass die aktuelle Sitzung von Windows-Terminal (Überprüfung von $WT_SESSION) geöffnet und der Betriebssystembefehl (OSC 9;9;) mit dem Windows-äuqivalenten Pfad (wslpath -w
) des aktuellen Pfads gesendet wird.
MINGW
Für MINGW, Git Bash und Cygwin müssen Sie PROMPT_COMMAND
für WSL ändern: Ersetzen Sie wslpath
durch cygpath
.
Fügen Sie am Ende der .bashrc
-Datei die folgende Zeile hinzu:
PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND; "}'printf "\e]9;9;%s\e\\" "`cygpath -w "$PWD" -C ANSI`"'
Hinweis
Sehen Sie Ihre bevorzugte Shell hier nicht? Wenn Sie es herausfinden, können Sie einen PR öffnen, um eine Lösung für Ihre bevorzugte Shell beizutragen!
Verwenden von Aktionen zum Duplizieren des Pfads
Nachdem Sie die Shell so konfiguriert haben, dass sie dem Terminal das aktuelle Verzeichnis mitteilt, ist es einfach, eine neue Registerkarte oder einen neuen Bereich mit diesem Pfad zu öffnen.
Öffnen einer neuen Registerkarte mit duplicateTab
Zum Öffnen einer neuen Registerkarte mit demselben Pfad (und Profil) wie das derzeit aktive Terminal verwenden Sie die Aktion „Registerkarte duplizieren“. Dies ist standardmäßig an STRG+UMSCHALT+Dgebunden, wie hier zu sehen:
{ "command": "duplicateTab", "keys": "ctrl+shift+d" },
Weitere Informationen finden Sie unter duplicateTab
.
Öffnen eines neuen Bereichs mit splitPane
Zum Öffnen einer neuen Registerkarte mit demselben Pfad (und Profil) wie das derzeit aktive Terminal verwenden Sie die Aktion „Registerkarte duplizieren“. Diese ist standardmäßig NICHT gebunden. Dies ist die einfachste Form dieser Aktion:
{ "command": { "action": "splitPane", "splitMode": "duplicate" } },
Weitere Informationen finden Sie unter splitPane
.
Verwenden des Menüs zum Duplizieren des Pfads
Die oben genannten Aktionen sind auch im Kontextmenü der Registerkarte unter den Einträgen „Registerkarte duplizieren“ und „Bereich teilen“ verfügbar.
Windows Terminal