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.

Abbildung: duplicate-tab-same-cwdAbbildung: split-pane-same-cwd