Partilhar via


Tutorial: Abrindo uma guia ou painel no mesmo diretório no Terminal do Windows

Normalmente, as ações "nova guia" e "painel dividido" sempre abrirão uma nova guia/painel em qualquer que seja o startingDirectory perfil desse perfil. No entanto, em outras plataformas, é comum que novas guias usem automaticamente o diretório de trabalho da guia atual como o diretório inicial de uma nova guia. Isso permite que o usuário multitarefa rapidamente em um único diretório.

Infelizmente, no Windows, é complicado determinar qual é o diretório de trabalho atual ("CWD") para um processo. Mesmo que pudéssemos procurá-lo, nem todos os aplicativos realmente configuram seu CWD enquanto navegam. Notavelmente, o Windows PowerShell não altera seu CWD enquanto você cd circula pelo sistema de arquivos! Duplicar o CWD do PowerShell automaticamente seria quase sempre errado.

Felizmente, há uma solução alternativa. As aplicações podem emitir uma sequência de escape especial (especificamente o "OSC 9; 9" format) para dizer manualmente ao Terminal qual deve ser o CWD.

Neste tutorial, você aprenderá a:

  • Configure o shell para informar o Terminal sobre seu diretório de trabalho atual
  • Use a duplicateTab ação para abrir uma guia com o mesmo CWD
  • Use a splitPane ação para abrir um painel com o mesmo CWD
  • Usando o menu de contexto da guia para abrir guias ou painéis com o mesmo CWD

Configure seu shell

Para dizer ao Terminal o que é o CWD, você precisará modificar seu shell para emitir uma sequência de escape enquanto navega pelo sistema operacional. Felizmente, a maioria dos shells tem um mecanismo para configurar o "prompt", que é executado após cada comando. Este é o lugar perfeito para adicionar essa saída.

Windows

Prompt de comando: cmd.exe

cmd usa a %PROMPT% variável de ambiente para configurar o prompt. Você pode facilmente preceder o prompt com o comando para definir o CWD com o seguinte comando:

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

Isso será anexado $e]9;9;$P$e\ ao seu prompt atual. Quando o cmd avaliar esse prompt, ele substituirá

  • o $e com o personagem de fuga
  • o $p com o diretório de trabalho atual

Observe que o comando acima só funcionará para a sessão atual cmd.exe . Para definir o valor permanentemente, DEPOIS de executar o comando acima, você vai querer executar

setx PROMPT "%PROMPT%"

PowerShell: powershell.exe ou pwsh.exe

Se você nunca alterou seu prompt do PowerShell antes, você deve fazer check-out about_Prompts primeiro.

Adicione o seguinte ao seu perfil do PowerShell:

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

Se você estiver usando posh-git, isso já modificará seu prompt. Nesse caso, você desejará adicionar apenas a saída necessária ao prompt já modificado. O exemplo a seguir é uma versão ligeiramente modificada deste exemplo dos documentos 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 com Starship

Se você estiver usando Starship, isso já modificará seu prompt. Nesse caso, você desejará adicionar apenas a saída necessária ao prompt já modificado.

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

O Subsistema Windows para distribuições Linux usa principalmente BASH como shell de linha de comando.

bash

Adicione a seguinte linha ao final do arquivo .bash_profile de configuração:

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

A PROMPT_COMMAND variável em bash informa bash qual comando executar antes de exibir o prompt. A printf instrução é o que estamos usando para anexar a sequência para definir o diretório de trabalho com o Terminal. O $(wslpath -w "$PWD") bit invocará o wslpath executável para converter o diretório atual em seu caminho semelhante ao Windows. O ${PROMPT_COMMAND:+"$PROMPT_COMMAND; "} bit é uma mágica bash para garantir que acrescentamos este comando a qualquer comando existente (se você já tiver definido PROMPT_COMMAND em outro lugar).

zsh

Adicione as seguintes linhas ao final do ficheiro .zshrc :

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

O precmd_functions gancho informa ao zsh quais comandos executar antes de exibir o prompt. A printf instrução é o que estamos usando para anexar a sequência para definir o diretório de trabalho com o Terminal. O $(wslpath -w "$PWD") bit invocará o wslpath executável para converter o diretório atual em seu caminho semelhante ao Windows. Usando precmd_functions+= certifique-se de anexar a keep_current_path função a qualquer função existente já definida para este gancho.

Peixe

Se você estiver usando o Fish shell, adicione as seguintes linhas ao final do arquivo de configuração localizado em ~/.config/fish/config.fish:

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

Esta função será chamada sempre que o caminho atual for alterado para confirmar que a sessão atual é aberta pelo Terminal do Windows (verificando $WT_SESSION) e enviando o Comando do Sistema Operacional (OSC 9; 9;), com o caminho equivalente do Windows (wslpath -w) do caminho atual.

MINGW

Para MINGW, Git Bash e Cygwin, você precisa modificar o PROMPT_COMMAND para WSL: substituir wslpath por cygpath.

Adicione a seguinte linha ao final do ficheiro .bashrc :

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

Observação

Não vê a sua concha favorita aqui? Se você descobrir, sinta-se à vontade para abrir um PR para contribuir com uma solução para o seu shell preferido!

Usando ações para duplicar o caminho

Depois de configurar o shell para informar ao Terminal qual é o diretório atual, abrir uma nova guia ou painel com esse caminho é fácil.

Abra um novo separador com duplicateTab

Para abrir uma nova guia com o mesmo caminho (e perfil) do terminal ativo no momento, use a ação "Duplicar guia". Isso está vinculado por padrão a Ctrl+Shift+D, da seguinte maneira:

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

(ver duplicateTab) para mais detalhes.

Abrir um novo painel com splitPane

Para abrir um novo painel com o mesmo caminho (e perfil) do terminal ativo no momento, use a ação "Painel duplicado". Isso NÃO está vinculado por padrão. A forma mais simples desta ação é:

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

(ver splitPane) para mais detalhes.

Usando o menu para duplicar o caminho

as ações acima também estão disponíveis no menu de contexto da guia, sob as entradas "Guia duplicada" e "Painel dividido".

Imagem duplicada-tab-same-cwd Imagem split-pane-same-cwd