¿Cómo puedo abrir un nuevo terminal en el mismo directorio del último utilizado desde una combinación de teclas del administrador de ventanas?

25

Estoy usando un administrador de ventanas en mosaico y cambié de gnome-terminalmúltiples pestañas a múltiples urxvtinstancias administradas por el administrador de ventanas. Una de las características que echo de menos es la capacidad de abrir un nuevo terminal que por defecto es el directorio de trabajo del último.

En resumen: necesito una forma de abrir un nuevo urxvt (bash) que tenga como valor predeterminado $ PWD del último utilizado.

La única solución que viene a mi mente es guardar la ruta actual en cada uno cdcon algo como esto:

echo $PWD > ~/.last_dir

y restaurar la ruta en la nueva terminal de esta manera:

cd `cat ~/.last_dir`

Puedo obtener el segundo comando .bashrcpero no sé cómo ejecutar el primero en cada cambio de directorio :)

Cualquier solución más simple que no implique screeno tmuxuso es bienvenida.

Luca
fuente
¿Estás utilizando la tabbedextensión " " perl de urxvt?
rozcietrzewiacz
Sin pestañas, estoy usando nuevos terminales administrados por WM
Luca

Respuestas:

9

Veo tres soluciones usando .last_dir. Puede colocar echo $PWD > ~/.last_dircualquiera:

  1. En una función especial que sería un contenedor para cd:

    function cd_
    {
      [[ -d "$@" ]] || return 1
      echo "$@" > ~/.last_dir
      cd "$@"
    }

    Coloque esto en su ~/.bashrcy luego use en cd_lugar de cd cada vez que desee que se almacene su nuevo directorio de trabajo.

  2. En su $PROMPT_COMMAND( no recomendado ):

    PROMPT_COMMAND="$PROMPT_COMMAND; pwd > ~/.last_dir"

    Puede probar esto directamente desde la terminal o colocarlo ~/.bashrc. Sin embargo, esta solución desencadena una escritura de disco cada vez que aparece el mensaje, lo que podría causar problemas, pero por otro lado, .last_dircontendría el directorio actual sin importar cómo llegaste allí.

  3. En un script de extensión perl personalizado para rxvt. Nunca he creado uno yo mismo, pero puedes encontrar bastantes ejemplos en la web.

rozcietrzewiacz
fuente
PROMPT_COMMAND eso es lo que estaba buscando. Probaré esta solución con la esperanza de que no afecte el rendimiento.
Luca
Bueno, es una forma bastante cruda, francamente. Personalmente, me gusta más la solución de Michael :)
rozcietrzewiacz
1
Me gusta la forma de extensión perl, si necesita trabajar fuera de la terminal; parece más limpio que piratear algo PROMPT_COMMAND, una de las variables de entorno más abusadas de todos los tiempos
Michael Mrozek
Parece que $ PWD se evalúa solo la primera vez
Luca
@ Neon Aaah ... Lo siento. El problema está en cómo se cita PROMPT_COMMAND. (O más bien, cómo no$PWD fue citado). Permítanme arreglar esto ... Ahí. Eso debería hacerlo.
rozcietrzewiacz
13

Actualmente estoy usando esta versión de la solución # 1

# save path on cd
function cd {
    builtin cd $@
    pwd > ~/.last_dir
}

# restore last saved path
if [ -f ~/.last_dir ]
    then cd `cat ~/.last_dir`
fi

dentro de mi .zshrc

Luca
fuente
También estoy usando la solución # 1 y agrego que trap "[ -f ~/.last_dir ] && rm ~/.last_dir" EXITquiero comenzar siempre en mi casa, excepto cuando abro una nueva pestaña
rkmax
Esto no funciona si usa la auto_cdfunción de zsh. Resulta que podemos usar un gancho que proporciona zsh: gist.github.com/jonleighton/1f0b96b49247a07dbaa30fbbe70b34f7
jonleighton
12

Esto es realmente bastante trivial; si ejecuta urxvtdesde su urxvtventana existente , la nueva ventana estará en el mismo directorio. Me he dupalias urxvt &por esta razón. Si desea vincularlo a una tecla de acceso rápido, puede usar el bindcomando de bash . Por ejemplo, para vincularlo a F1:

$ bind '"\e[11~": "urxvt &\n"'
Michael Mrozek
fuente
Gracias por el consejo. Sabía que los procesos secundarios de la terminal mantenían el estado, pero no sabía que puede vincular una clave a un comando en bash. Me gustaría hacer esto desde WM para evitar enfocar el terminal.
Luca
Me gusta eso. No hay escrituras en el disco y la única ejecución se lleva a cabo cuando está a punto de abrir la nueva terminal.
rozcietrzewiacz
Lo único que cambiaría es usar en ( urxvt & ) &>/dev/nulllugar de solo fondo.
rozcietrzewiacz
Esta solución es excelente y más flexible, pero no me gusta usar 2 enlaces, uno para iniciar el terminal y otro para bifurcar uno nuevo.
Luca
4

Simplemente agregue . /etc/profile.d/vte.shsu ~/.bashrcpara obtener la misma función

David Villa
fuente
Este trabajo, sin embargo, ¿por qué molestarse -1 esto?
Abdillah
Esto funciona, y parece que en realidad es la solución preferida en launchpad / de gnome-terminal devs: bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1132700
Ajax
4

Por supuesto, es un enfoque funcional para modificar cdel comportamiento, pero me gustaría mostrar una solución más simple. En man bash (1) descubrí que si una interactiva sale, se ejecuta ~/.bash_logoutsi existe. Entonces, en lugar de almacenar la ruta en cada invocación de cdla última ruta, se puede guardar en la salida.

Mi ~/.bash_logoutes muy simple:

echo $PWD >~/.lastdir

Y en algún lugar de mi .bashrcpuse esta línea:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)
Verdad
fuente
1
Solo tenga en cuenta que .bash_logoutsolo se ejecuta al login shellssalir, ese no es siempre el caso.
henfiber
1
Alternativamente, guarde la última ruta cuando bashsalga con: trap "echo $PWD > ~/.lastdir" EXIT"
henfiber
@henfiber ¡Gracias por tus comentarios! Creo que en este caso el shell es un shell de inicio de sesión, por lo que se comportará correctamente. Por otro lado, el trapenfoque también es bueno, ¡me gusta!
Verdadero
2

Muy a menudo uso múltiples ventanas de terminal a la vez, cada una con múltiples pestañas. Por ejemplo: una ventana para pestañas de desarrollo de código fuente, una ventana para archivos de látex, una ventana para ejecución de R y scripting, etc. Dentro de una ventana, quiero que un nuevo terminal con pestañas cambie al directorio que se usa en último lugar en esa ventana en particular (esto solía funcionar en el pasado, pero con la nueva versión de gnome, de alguna manera no funciona). La siguiente solución sucia funciona bien para mí. He puesto esto en .bashrc.

dirfilename="/tmp/.lastdir-$WINDOWID"
[ -r "$dirfilename" ] &&  {
    savdir=`cat $dirfilename`
    cd "$savdir"
}

function cd ()
{
    builtin cd "$@"
    echo $PWD > $dirfilename
}
BartT
fuente
Esto es perfecto ... ¡guau! Gracias. No sé mucho sobre hackear bash, pero hombre, ya me encanta ...
apil.tamang