Condividi tramite


Esercitazione: Apertura di una scheda o di un riquadro nella stessa directory in Terminale Windows

In genere, le azioni "nuova scheda" e "riquadro diviso" apriranno sempre una nuova scheda/riquadro in qualsiasi startingDirectory del profilo. Tuttavia, in altre piattaforme, è comune che le nuove schede usino automaticamente la directory di lavoro della scheda corrente come directory iniziale per una nuova scheda. Ciò consente all'utente di eseguire rapidamente il multitasking in una singola directory.

Sfortunatamente, in Windows è difficile determinare la directory di lavoro corrente ("CWD") per un processo. Anche se fossimo in grado di cercarla, non tutte le applicazioni impostano effettivamente la propria CWD mentre navigano. In particolare, Windows PowerShell non cambia la relativa CWD mentre si cd nel file system. La duplicazione automatica di CWD di PowerShell sarebbe quasi sempre errata.

Fortunatamente, esiste una soluzione alternativa. Le applicazioni possono generare una sequenza di escape speciale per indicare manualmente al terminale quale debba essere la CWD.

In questa esercitazione apprenderai a:

  • Configurare la shell per indicare al terminale la relativa directory di lavoro corrente
  • Usare l'azione duplicateTab per aprire una scheda con la stessa CWD
  • Usare l'azione splitPane per aprire un riquadro con la stessa CWD
  • Uso del menu di scelta rapida della scheda per aprire schede o riquadri con la stessa CWD

Configurare la shell

Per indicare al terminale qual è la CWD, è necessario modificare la shell per generare una sequenza di escape mentre si naviga nel sistema operativo. Fortunatamente, la maggior parte delle shell ha un meccanismo per configurare il "prompt", che viene eseguito dopo ogni comando. Questa è la posizione perfetta per aggiungere tale output.

Windows

Prompt dei comandi: cmd.exe

cmd usa la variabile di ambiente %PROMPT% per configurare il prompt. È possibile anteporre facilmente il prompt con il comando per impostare la CWD con il comando seguente:

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

Verrà aggiunto $e]9;9;$P$e\ al prompt corrente. Quando cmd valuta questa richiesta, sostituirà

  • $e con il carattere di escape
  • $p con la cartella di lavoro corrente

Si noti che il comando precedente funzionerà solo per la sessione cmd.exe corrente. Per impostare il valore in modo permanente, DOPO aver eseguito il comando precedente, è necessario eseguire

setx PROMPT "%PROMPT%"

PowerShell: powershell.exe o pwsh.exe

Se il prompt di PowerShell non è mai stato modificato in precedenza, è consigliabile consultare prima about_Prompts.

Aggiungere quanto segue al profilo di 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 con posh-git

Se si usa posh-git, questo modificherà già il prompt. In tal caso, si vuole aggiungere solo l'output necessario al prompt già modificato. L'esempio seguente è una versione leggermente modificata di questo esempio dalla documentazione di 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 con Starship

Se si usa Starship, questo modificherà già il prompt. In tal caso, si vuole aggiungere solo l'output necessario al prompt già modificato.

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

Le distribuzioni sottosistema Windows per Linux usano principalmente BASH come shell della riga di comando.

bash

Aggiungere la riga seguente alla fine del file di configurazione .bash_profile:

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

La variabile PROMPT_COMMAND in bash indica a bash quale comando eseguire prima di visualizzare il prompt. L'istruzione printf è quella usata per aggiungere la sequenza per impostare la directory di lavoro con il terminale. Il bit $(wslpath -w "$PWD") richiamerà l'eseguibile wslpath per convertire la directory corrente nel percorso simile a Windows. Il bit ${PROMPT_COMMAND:+"$PROMPT_COMMAND; "} è un'operazione bash particolare per assicurarsi di aggiungere questo comando a qualsiasi comando esistente (se è già stato impostato PROMPT_COMMAND altrove).

zsh

Aggiungere le righe seguenti alla fine del file .zshrc:

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

L'hook precmd_functions indica a zsh quali comandi eseguire prima di visualizzare il prompt. L'istruzione printf è quella usata per aggiungere la sequenza per impostare la directory di lavoro con il terminale. Il bit $(wslpath -w "$PWD") richiamerà l'eseguibile wslpath per convertire la directory corrente nel percorso simile a Windows. Usando precmd_functions+= ci si assicura di aggiungere la funzione keep_current_path a qualsiasi funzione esistente già definita per questo hook.

Fish

Se si usa la shell Fish, aggiungere le righe seguenti alla fine del file di configurazione che si trova in ~/.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

Questa funzione verrà chiamata ogni volta che il percorso corrente viene modificato per confermare che la sessione corrente viene aperta da Terminale Windows (verificando $WT_SESSION) e inviando il comando del sistema operativo (OSC 9; 9;), con il percorso equivalente di Windows (wslpath -w) del percorso corrente.

MINGW

Per MINGW, Git Bash e Cygwin, è necessario modificare PROMPT_COMMAND per WSL: sostituire wslpath con cygpath.

Aggiungere la riga seguente alla fine del file .bashrc:

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

Nota

La shell preferita non è indicata qui? Se la si scopre, è possibile aprire una richiesta pull per contribuire a una soluzione per la shell preferita.

Uso di azioni per duplicare il percorso

Dopo aver configurato la shell per indicare al terminale qual è la directory corrente, è facile aprire una nuova scheda o un nuovo riquadro con tale percorso.

Aprire una nuova scheda con duplicateTab

Per aprire una nuova scheda con lo stesso percorso (e profilo) del terminale attualmente attivo, usare l'azione "Duplica scheda". Per impostazione predefinita, questa opzione è associata a CTRL+MAIUSC+D, come indicato di seguito:

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

(vedere duplicateTab) per ulteriori informazioni.

Aprire un nuovo riquadro con splitPane

Per aprire un nuovo riquadro con lo stesso percorso (e profilo) del terminale attualmente attivo, usare l'azione "Duplica riquadro". L'operazione NON è associata per impostazione predefinita. La forma più semplice di questa azione è:

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

(vedere splitPane) per ulteriori informazioni.

Uso del menu per duplicare il percorso

le azioni precedenti sono disponibili anche nel menu di scelta rapida della scheda, sotto le voci "Duplica scheda" e "Riquadro di divisione".

Image duplicate-tab-same-cwdImage split-pane-same-cwd