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 ,in particolare "OSC 9; Formato da 9" per indicare manualmente al terminale quale deve essere il 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".