Compartir a través de


Tutorial: Apertura de una pestaña o panel en el mismo directorio en Terminal Windows

Normalmente, las acciones "Nueva pestaña" y "Split pane" (Dividir panel) siempre abrirán una nueva pestaña o panel en la ubicación startingDirectory para el perfil. Sin embargo, en otras plataformas, es habitual que las nuevas pestañas usen automáticamente el directorio de trabajo de la pestaña actual como directorio de inicio de una nueva pestaña. Esto permite al usuario realizar rápidamente varias tareas en un único directorio.

Desafortunadamente, en Windows, es complicado determinar cuál es el directorio de trabajo actual ("CWD") de un proceso. Aunque podamos buscarlo, no todas las aplicaciones establecen realmente su CWD cuando navegan. En concreto, Windows PowerShell no cambia su CWD al usar cd en el sistema de archivos. Duplicar automáticamente el CWD de PowerShell sería casi siempre incorrecto.

Afortunadamente, hay una solución alternativa. Las aplicaciones pueden emitir una secuencia de escape especial (específicamente el "OSC 9; Formato 9" para indicar manualmente al Terminal cuál debe ser el CWD.

En este tutorial, aprenderá a:

  • Configurar el shell para que informe al terminal sobre su directorio de trabajo actual.
  • Utilizar la acción duplicateTab para abrir una pestaña con el mismo CWD.
  • Utilizar la acción splitPane para abrir un panel con el mismo CWD.
  • Utilizar el menú contextual de la pestaña para abrir pestañas o paneles con el mismo CWD.

Configuración del shell

Para indicar al terminal cuál es el CWD, deberá modificar el shell para emitir una secuencia de escape cuando navega por el sistema operativo. Afortunadamente, la mayoría de los shells tienen un mecanismo para configurar el "símbolo del sistema", que se ejecuta después de cada comando. Es el lugar perfecto para agregar dicha salida.

Windows

Símbolo del sistema: cmd.exe

cmd utiliza la variable de entorno %PROMPT% para configurar el símbolo del sistema. Puede anteponer fácilmente al símbolo del sistema el comando para establecer CWD con el siguiente comando:

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

Esto agregará $e]9;9;$P$e\ al símbolo del sistema actual. Cuando cmd evalúe este símbolo del sistema, reemplazará

  • $e por el carácter de escape.
  • $p por el directorio de trabajo actual.

Tenga en cuenta que el comando anterior solo funcionará para la sesión actual de cmd.exe. Para establecer el valor de forma persistente, DESPUÉS de ejecutar el comando anterior, querrá ejecutar

setx PROMPT "%PROMPT%"

PowerShell: powershell.exe o pwsh.exe

Si nunca ha cambiado el símbolo del sistema de PowerShell, primero debe consultar about_Prompts.

Agregue lo siguiente al perfil de 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

Si utiliza posh-git, este ya modificará el símbolo del sistema. En ese caso, solo querrá agregar la salida necesaria al símbolo del sistema ya modificado. El ejemplo siguiente es una versión ligeramente modificada de este ejemplo de la documentación de 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

Si utiliza Starship, este ya modificará el símbolo del sistema. En ese caso, solo querrá agregar la salida necesaria al símbolo del sistema ya 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

Las distribuciones de Subsistema de Windows para Linux usan principalmente BASH como shell de línea de comandos.

bash

Agregue la línea siguiente al final del archivo de configuración .bash_profile:

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

La variable PROMPT_COMMAND de bash indica a bash qué comando debe ejecutarse antes de mostrar el símbolo del sistema. La instrucción printf es lo que se usa para agregar la secuencia para establecer el directorio de trabajo con el terminal. La parte $(wslpath -w "$PWD") invocará el ejecutable wslpath para convertir el directorio actual en la ruta de acceso de Windows equivalente. La parte ${PROMPT_COMMAND:+"$PROMPT_COMMAND; "} es algo de magia de Bash para asegurarnos de agregar este comando a cualquier comando existente (si ya ha establecido PROMPT_COMMAND en otro lugar).

zsh

Agregue las líneas siguientes al final de archivo .zshrc:

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

El enlace precmd_functions indica a zsh qué comandos ejecutar antes de mostrar el símbolo del sistema. La instrucción printf es lo que se usa para agregar la secuencia para establecer el directorio de trabajo con el terminal. La parte $(wslpath -w "$PWD") invocará el ejecutable wslpath para convertir el directorio actual en la ruta de acceso de Windows equivalente. Con precmd_functions+=, nos aseguramos de anexar la función keep_current_path a cualquier función existente ya definida para este enlace.

Fish

Si usa el shell de Fish, agregue las siguientes líneas al final del archivo de configuración ubicado en ~/.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

Se llamará a esta función cada vez que se cambie la ruta de acceso actual para confirmar que la sesión actual se abre mediante Terminal Windows (comprobando $WT_SESSION) y enviando el comando del sistema operativo (OSC 9;9;), con la ruta de acceso equivalente de Windows (wslpath -w) de la ruta de acceso actual.

MINGW

Para MINGW, el Bash de Git y Cygwin, debe modificar PROMPT_COMMAND; para WSL, sustituya wslpath por cygpath.

Agregue la línea siguiente al final de archivo .bashrc:

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

Nota

¿No ve su shell favorito aquí? Si ha decidido cuál es, no dude en abrir una solicitud de incorporación de cambios para aportar una solución para su shell favorito.

Uso de acciones para duplicar la ruta de acceso

Una vez que haya configurado el shell para que indique al terminal cuál es el directorio actual, es fácil abrir una nueva pestaña o panel con esa ruta de acceso.

Apertura de una nueva pestaña con duplicateTab

Para abrir una nueva pestaña con la misma ruta de acceso (y perfil) que el terminal activo actualmente, utilice la acción "Duplicar pestaña". Está vinculada de forma predeterminada a Ctrl+Mayús+D, como se muestra a continuación:

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

Consulte duplicateTab para obtener más detalles.

Apertura de un nuevo panel con splitPane

Para abrir un nuevo panel con la misma ruta de acceso (y perfil) que el terminal activo actualmente, utilice la acción "Duplicate Pane" (Duplicar panel). NO está vinculada de forma predeterminada. La forma más sencilla de usar esta acción es:

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

Consulte splitPane para obtener más detalles.

Uso del menú para duplicar la ruta de acceso

las acciones anteriores también están disponibles en el menú contextual de la pestaña, en las entradas "Duplicar pestaña" y "Split pane" (Dividir panel).

Imagen duplicate-tab-same-cwdImagen split-pane-same-cwd