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).