Kurz: Otevření karty nebo podokna ve stejném adresáři v terminálu Windows

Akce "nová karta" a "rozdělené podokno" obvykle vždy otevřou novou kartu nebo podokno v libovolném startingDirectory případě pro daný profil. Na jiných platformách je ale běžné, že nové karty automaticky používají pracovní adresář aktuální karty jako výchozí adresář nové karty. To umožňuje uživateli rychle provést více úkolů v jednom adresáři.

Ve Windows je bohužel složité určit, jaký je aktuální pracovní adresář (CWD) procesu. I když jsme ho mohli vyhledat, ne všechny aplikace ve skutečnosti nastavily jejich CWD při navigaci. Prostředí Windows PowerShell nemění jeho CWD, protože se pohybujete cd kolem systému souborů! Duplikování CWD PowerShellu by se téměř vždy pokazilo.

Naštěstí existuje alternativní řešení. Aplikace mohou generovat speciální řídicí sekvenci (konkrétně "OSC 9; 9" formát) k ručnímu informovat terminál, co má být CWD.

V tomto kurzu se naučíte:

  • Nakonfigurujte prostředí tak, aby o svém aktuálním pracovním adresáři informovat terminál.
  • duplicateTab Použití akce k otevření karty se stejným CWD
  • splitPane Použití akce k otevření podokna se stejným CWD
  • Použití místní nabídky karet k otevření karet nebo podoken se stejným CWD

Konfigurace prostředí

Pokud chcete terminálu sdělit, co je CWD, budete muset upravit prostředí tak, aby při procházení operačního systému vygenerovala řídicí sekvenci. Většina prostředí má naštěstí mechanismus konfigurace příkazového řádku, který se spouští po každém příkazu. Toto je ideální místo pro přidání takového výstupu.

Windows

Příkazového řádku: cmd.exe

cmd používá proměnnou %PROMPT% prostředí ke konfiguraci výzvy. Pomocí příkazu můžete příkazem snadno nastavit CWD pomocí následujícího příkazu:

set PROMPT=$e]9;9;$P$e\%PROMPT%

Tím se připojí $e]9;9;$P$e\ k aktuální výzvě. Když příkaz cmd vyhodnocuje tuto výzvu, nahradí ji.

  • znak $e s řídicím znakem
  • s $p aktuálním pracovním adresářem

Všimněte si, že výše uvedený příkaz bude fungovat pouze pro aktuální cmd.exe relaci. Pokud chcete hodnotu nastavit trvale, po spuštění výše uvedeného příkazu budete chtít spustit

setx PROMPT "%PROMPT%"

PowerShell: powershell.exe nebo pwsh.exe

Pokud jste ještě nikdy nezměnili příkazový řádek PowerShellu, měli byste si nejdřív prohlédnout about_Prompts .

Do profilu PowerShellu přidejte následující položky:

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 s posh-git

Pokud používáte posh-git, znamená to, že vaše výzva už upraví. V takovém případě budete chtít do již upravené výzvy přidat pouze potřebný výstup. Následující příklad je mírně upravená verze tohoto příkladu z dokumentace ConEmu:

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 s Hvězdnou lodí

Pokud používáte Hvězdicovou loď, bude už tato výzva upravena. V takovém případě budete chtít do již upravené výzvy přidat pouze potřebný výstup.

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

Subsystém Windows pro linuxové distribuce primárně používá BASH jako prostředí příkazového řádku.

bash

Na konec konfiguračního .bash_profile souboru přidejte následující řádek:

PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND ; "}'printf "\e]9;9;%s\e\\" "$(wslpath -w "$PWD")"'

Proměnná PROMPT_COMMAND v Bash říká Bash, jaký příkaz se má spustit před zobrazením výzvy. Příkaz printf je to, co používáme k připojení sekvence pro nastavení pracovního adresáře pomocí terminálu. Bit $(wslpath -w "$PWD") vyvolá wslpath spustitelný soubor, který převede aktuální adresář na jeho cestu typu Windows. Bit ${PROMPT_COMMAND:+"$PROMPT_COMMAND; "} je nějaká magie Bash , abychom se ujistili, že tento příkaz připojíme k jakémukoli existujícímu příkazu (pokud jste už někde jinde nastavili PROMPT_COMMAND .)

zsh

Na konec .zshrc souboru přidejte následující řádky:

keep_current_path() {
  printf "\e]9;9;%s\e\\" "$(wslpath -w "$PWD")"
}
precmd_functions+=(keep_current_path)

Háček precmd_functions řekne zsh, jaké příkazy se mají spustit před zobrazením výzvy. Příkaz printf je to, co používáme k připojení sekvence pro nastavení pracovního adresáře pomocí terminálu. Bit $(wslpath -w "$PWD") vyvolá wslpath spustitelný soubor, který převede aktuální adresář na jeho cestu typu Windows. Ujistěte precmd_functions+= se, že funkci připojíme keep_current_path k jakékoli existující funkci, která už je pro tento háček definovaná.

Ryba

Pokud používáte Fish shell, přidejte na konec konfiguračního souboru následující řádky umístěné na ~/.config/fish/config.fishadrese:

function storePathForWindowsTerminal --on-variable PWD
    if test -n "$WT_SESSION"
      printf "\e]9;9;%s\e\\" (wslpath -w "$PWD")
    end
end

Tato funkce bude volána při každé změně aktuální cesty, aby se ověřilo, že je aktuální relace otevřena terminálem Windows (ověřením $WT_SESSION) a odesláním příkazu operačního systému (OSC 9; 9;), s ekvivalentní cestou Windows (wslpath -w) aktuální cesty.

MINGW

Pro MINGW, Git Bash a Cygwin, musíte upravit PROMPT_COMMAND hodnotu WSL: nahradit wslpath .cygpath

Na konec .bashrc souboru přidejte následující řádek:

PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND; "}'printf "\e]9;9;%s\e\\" "`cygpath -w "$PWD" -C ANSI`"'

Poznámka:

Nevidíte tady vaše oblíbené prostředí? Pokud to zjistíte, můžete otevřít žádost o přijetí změn , abyste přispěli řešením pro vaše upřednostňované prostředí!

Použití akcí k duplikování cesty

Jakmile máte prostředí nakonfigurované tak, aby terminálu řeklo, co je aktuální adresář, otevření nové karty nebo podokna s touto cestou je snadné.

Otevření nové karty pomocí duplicateTab

Pokud chcete otevřít novou kartu se stejnou cestou (a profilem) jako aktuálně aktivní terminál, použijte akci Duplikovat kartu. Toto je ve výchozím nastavení vázané na Ctrl+Shift+D, a to následujícím způsobem:

        { "command": "duplicateTab", "keys": "ctrl+shift+d" },

(viz duplicateTab) další podrobnosti.

Otevření nového podokna pomocí splitPane

Pokud chcete otevřít nové podokno se stejnou cestou (a profilem) jako aktuálně aktivní terminál, použijte akci Duplikovat podokno. Toto není ve výchozím nastavení vázáno. Nejjednodušší forma této akce je:

        { "command": { "action": "splitPane", "splitMode": "duplicate" } },

(viz splitPane) další podrobnosti.

Duplikování cesty pomocí nabídky

výše uvedené akce jsou k dispozici také v místní nabídce karty pod položkami "Duplikovat kartu" a "Rozdělené podokno".

Obrázek duplicate-tab-same-cwd Image split-pane-same-cwd