Tutoriel : Ouverture d’un onglet ou d’un volet dans le même répertoire au sein de Terminal Windows
En règle générale, les actions « nouvel onglet » et « volet fractionné » ouvrent toujours un nouvel onglet/volet dans le startingDirectory
de ce profil. Toutefois, sur d’autres plateformes, il est courant que les nouveaux onglets utilisent automatiquement le répertoire de travail de l’onglet actuel comme répertoire de départ pour un nouvel onglet. Cela permet à l’utilisateur d’effectuer rapidement plusieurs tâches dans un même répertoire.
Malheureusement, sur Windows, il est difficile de déterminer le répertoire de travail actuel (« CWD ») d’un processus. Même si nous pouvons le rechercher, toutes les applications ne définissent pas réellement leur CWD pendant la navigation. En particulier, Windows PowerShell ne change pas son CWD quand vous utilisez cd
dans le système de fichiers ! La duplication automatique du CWD de PowerShell serait presque toujours incorrecte.
Heureusement, il existe une solution de contournement. Les applications peuvent émettre une séquence d’échappement spéciale (en particulier la « OSC 9 ; Format 9 pouces) pour indiquer manuellement au Terminal ce que doit être le CWD.
Dans ce tutoriel, vous allez apprendre à :
- Configurer l’interpréteur de commandes pour indiquer au terminal son répertoire de travail actif
- Utiliser l’action
duplicateTab
pour ouvrir un onglet avec le même CWD - Utiliser l’action
splitPane
pour ouvrir un volet avec le même CWD - Utilisation du menu contextuel de l’onglet pour ouvrir des onglets ou des volets avec le même CWD
Configurer votre interpréteur de commandes
Pour indiquer le CWD au terminal, vous devez modifier votre interpréteur de commandes pour qu’il envoie une séquence d’échappement quand vous naviguez dans le système d’exploitation. Heureusement, la plupart des interpréteurs de commandes ont un mécanisme pour configurer l’« invite », qui est exécuté après chaque commande. C’est l’endroit idéal pour ajouter une sortie de ce type.
Windows
Invite de commandes : cmd.exe
cmd
utilise la variable d’environnement %PROMPT%
pour configurer l’invite de commandes. Vous pouvez facilement ajouter l’invite avec la commande pour définir CWD en utilisant la commande suivante :
set PROMPT=$e]9;9;$P$e\%PROMPT%
Cela ajoute $e]9;9;$P$e\
à votre invite actuelle. Quand cmd évalue cette invite, il remplace
$e
par le caractère d’échappement$p
par le répertoire de travail actuel
Notez que la commande ci-dessus fonctionne seulement pour la session cmd.exe
actuelle. Pour définir la valeur de manière permanente, APRÈS avoir exécuté la commande ci-dessus, vous pouvez exécuter
setx PROMPT "%PROMPT%"
PowerShell : powershell.exe
ou pwsh.exe
Si vous n’avez jamais changé votre invite PowerShell auparavant, vous devez d’abord consulter about_Prompts.
Ajoutez ce qui suit à votre profil 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 avec posh-git
Si vous utilisez posh-git, l’invite est déjà modifiée. Dans ce cas, vous ajoutez seulement la sortie nécessaire à l’invite déjà modifiée. L’exemple suivant est une version légèrement modifiée de cet exemple dans la documentation 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 avec Starship
Si vous utilisez Starship, l’invite est déjà modifiée. Dans ce cas, vous ajoutez seulement la sortie nécessaire à l’invite déjà modifiée.
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
Les distributions du Sous-système Windows pour Linux utilisent principalement BASH comme interpréteur de commandes.
bash
Ajoutez la ligne suivante à la fin de votre fichier de configuration .bash_profile
:
PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND "}'printf "\e]9;9;%s\e\\" "$(wslpath -w "$PWD")"'
La variable PROMPT_COMMAND
dans bash indique à bash quelle commande exécuter avant d’afficher l’invite. Nous utilisons l’instruction printf
pour ajouter la séquence qui définit le répertoire de travail avec le terminal. Le bit $(wslpath -w "$PWD")
appelle l’exécutable wslpath
pour convertir le répertoire actuel en chemin de type Windows. Le bit ${PROMPT_COMMAND:+"$PROMPT_COMMAND; "}
est une commande magique bash qui garantit que nous ajoutons cette commande à toutes les commandes existantes (si vous avez déjà défini PROMPT_COMMAND
ailleurs).
zsh
Ajoutez les lignes suivantes à la fin de votre fichier .zshrc
:
keep_current_path() {
printf "\e]9;9;%s\e\\" "$(wslpath -w "$PWD")"
}
precmd_functions+=(keep_current_path)
Le hook precmd_functions
indique à zsh quelles commandes exécuter avant d'afficher l'invite. Nous utilisons l’instruction printf
pour ajouter la séquence qui définit le répertoire de travail avec le terminal. Le bit $(wslpath -w "$PWD")
appelle l’exécutable wslpath
pour convertir le répertoire actuel en chemin de type Windows. À l’aide de precmd_functions+=
assurez-vous que nous ajoutons la fonction keep_current_path
à toute fonction existante déjà définie pour ce crochet.
Fish
Si vous utilisez l’interpréteur de commandes Fish, ajoutez les lignes suivantes à la fin de votre fichier config situé sur ~/.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
Cette fonction est appelée chaque fois que le chemin actuel change pour vérifier que la session actuelle est ouverte par l’application Terminal Windows (vérification de $WT_SESSION), et qu’elle envoie la commande de système d’exploitation (OSC 9;9;) avec le chemin équivalent Windows (wslpath -w
) du chemin actuel.
MINGW
Pour MINGW, Git Bash et Cygwin, vous devez modifier PROMPT_COMMAND
. Pour WSL, remplacez wslpath
par cygpath
.
Ajoutez la ligne suivante à la fin de votre fichier .bashrc
:
PROMPT_COMMAND=${PROMPT_COMMAND:+"$PROMPT_COMMAND; "}'printf "\e]9;9;%s\e\\" "`cygpath -w "$PWD" -C ANSI`"'
Notes
Vous ne voyez pas votre interpréteur de commandes favori ici ? N’hésitez pas à ouvrir une demande de tirage afin de contribuer à l’ajout d’une solution pour votre interpréteur de commandes préféré.
Utilisation d’actions pour dupliquer le chemin
Une fois que vous avez configuré l’interpréteur de commandes pour indiquer au terminal le répertoire actuel, vous ouvrez facilement un nouvel onglet ou un nouveau volet avec ce chemin.
Ouvrir un nouvel onglet avec duplicateTab
Pour ouvrir un nouvel onglet avec le même chemin (et profil) que celui du terminal actuellement actif, utilisez l’action « Dupliquer l’onglet ». Elle est liée par défaut à Ctrl+Maj+D, de la façon suivante :
{ "command": "duplicateTab", "keys": "ctrl+shift+d" },
(Voir duplicateTab
) pour plus d’informations.
Ouvrir un nouveau volet avec splitPane
Pour ouvrir un nouveau volet avec le même chemin (et le même profil) que celui du terminal actuellement actif, utilisez l’action « Dupliquer le volet ». Elle n’est PAS liée par défaut. La forme la plus simple de cette action est :
{ "command": { "action": "splitPane", "splitMode": "duplicate" } },
(Voir splitPane
) pour plus d’informations.
Utilisation du menu pour dupliquer le chemin
les actions ci-dessus sont également disponibles dans le menu contextuel de l’onglet, sous les entrées « Dupliquer l’onglet » et « Fractionner le volet ».