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 envoyer une séquence d’échappement spéciale 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 ».

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