Como posso abrir um novo terminal no mesmo diretório do último usado em um atalho de teclado do gerenciador de janelas?

25

Estou usando um gerenciador de janelas lado a lado e mudei de gnome-terminalvárias guias para várias urxvtinstâncias gerenciadas pelo gerenciador de janelas. Um dos recursos que sinto falta é a capacidade de abrir um novo terminal que tenha como padrão o diretório de trabalho do último.

Resumindo: preciso de uma maneira de abrir um novo urxvt (bash) que tenha como padrão $ PWD do último usado.

A única solução que me vem à mente é salvar o caminho atual em todos cdcom algo parecido com isto:

echo $PWD > ~/.last_dir

e restaure o caminho no novo terminal desta maneira:

cd `cat ~/.last_dir`

Posso obter o segundo comando, .bashrcmas não sei como executar o primeiro em cada alteração de diretório :)

Qualquer solução mais simples que não envolva screenou tmuxuse é bem-vinda.

Luca
fonte
Você está usando a tabbedextensão " " perl de urxvt?
rozcietrzewiacz 23/02
Sem abas, estou usando novos terminais gerenciados por WM
Luca

Respostas:

9

Eu vejo três soluções usando .last_dir. Você pode colocar o seguinte echo $PWD > ~/.last_dir:

  1. Em uma função especial que seria um wrapper para cd:

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

    Coloque isso em seu ~/.bashrce use em cd_vez de cd toda vez que desejar que seu novo diretório de trabalho seja armazenado.

  2. No seu $PROMPT_COMMAND( não recomendado ):

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

    Você pode testar isso diretamente do terminal ou colocá-lo em ~/.bashrc. Essa solução, no entanto, aciona uma gravação em disco toda vez que o prompt é exibido, o que pode causar problemas - mas, por outro lado, .last_dirconteria o diretório atual, não importa como você chegou lá.

  3. Em um script de extensão perl personalizado para rxvt. Eu nunca criei um, mas você pode encontrar alguns exemplos na web.

rozcietrzewiacz
fonte
PROMPT_COMMAND era o que eu estava procurando. Vou tentar esta solução esperando que não afete o desempenho.
Luca
Bem, é uma maneira bastante grosseira, francamente. Pessoalmente, eu gosto solução de Michael melhor :)
rozcietrzewiacz
11
Eu gosto da maneira de extensão perl, se precisar trabalhar fora do terminal; parece mais limpo do que invadir algo PROMPT_COMMAND, uma das variáveis ​​de ambiente mais abusadas de todos os tempos #
Michael Mrozek
Parece que $ PWD é avaliada apenas na primeira vez
Luca
@neon Aaah ... Desculpe. O problema está em como o PROMPT_COMMAND é citado. (Ou melhor, como não$PWD foi citado.) Deixe-me consertar isso ... Pronto. Isso deve fazer.
rozcietrzewiacz
13

Atualmente, estou usando esta versão da solução 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 do meu .zshrc

Luca
fonte
Estou usando o # 1 solução também e adicione trap "[ -f ~/.last_dir ] && rm ~/.last_dir" EXITeu quero começar sempre na minha casa, exceto quando eu abrir uma nova aba
rkmax
Isso não funciona se você estiver usando o auto_cdrecurso zsh. Acontece que podemos usar um gancho que o zsh fornece: gist.github.com/jonleighton/1f0b96b49247a07dbaa30fbbe70b34f7
jonleighton
12

Isso é realmente bastante trivial; se você executar a urxvtpartir da urxvtjanela existente , a nova janela estará no mesmo diretório. Eu fiz um dupalias urxvt &por esse motivo. Se você deseja vinculá-lo a uma tecla de atalho, use o bindcomando bash . Por exemplo, para vinculá-lo a F1:

$ bind '"\e[11~": "urxvt &\n"'
Michael Mrozek
fonte
Obrigado pela dica. Eu sabia que os processos filho terminais mantinham o estado, mas não sabia que era possível vincular uma chave a um comando no bash. Eu gostaria de fazer isso com a WM para evitar o foco no terminal.
Luca
Eu gosto disso. Nenhum disco grava e a única execução ocorre quando você está prestes a abrir o novo terminal.
rozcietrzewiacz
A única coisa que eu mudaria é usar em ( urxvt & ) &>/dev/nullvez de apenas o plano de fundo.
rozcietrzewiacz
Essa solução é ótima e mais flexível, mas eu não gosto de usar 2 ligações, uma para iniciar o terminal e outra para bifurcar uma nova.
Luca
4

Basta adicionar o . /etc/profile.d/vte.shseu ~/.bashrcpara obter o mesmo recurso

David Villa
fonte
Este trabalho, no entanto, por que se preocupar com isso?
Abdillah
Isso funciona, e parece que é realmente a solução preferida na barra de lançamento / de devs gnome-terminal: bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1132700
Ajax
4

É claro que é uma abordagem funcional para modificar cdo comportamento de uma pessoa, mas eu gostaria de mostrar uma solução mais simples. No man bash (1) , descobri que, se um interativo sair, ele será executado ~/.bash_logoutse existir. Portanto, em vez de armazenar o caminho a cada chamada do cdúltimo caminho, pode ser salvo na saída.

Meu ~/.bash_logouté muito simples:

echo $PWD >~/.lastdir

E em algum lugar do meu .bashrceu coloquei esta linha:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)
TrueY
fonte
11
Observe que .bash_logouté executado apenas quando a login shellssaída é, nem sempre é o caso.
Henfiber 23/06
11
Como alternativa, salve o último caminho ao bashsair com: trap "echo $PWD > ~/.lastdir" EXIT"
henfiber
Obrigado por seus comentários! Eu acho que, neste caso, o shell é um shell de logon, portanto, ele se comportará corretamente. Por outro lado, a trapabordagem também é legal, eu gosto!
TrueY 23/06
2

Muitas vezes eu uso várias janelas de terminal de uma só vez, cada uma com várias guias. Por exemplo: uma janela para guias de desenvolvimento de código-fonte, uma janela para arquivos de látex, uma janela para execução e script de R, etc. Em uma janela, desejo que um novo terminal com guias mude para o diretório usado por último nessa janela específica (isso costumava funcionar no passado, mas com a nova versão do gnome, de alguma forma não funciona). A seguinte solução suja funciona bem para mim. Eu coloquei isso em .bashrc.

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

function cd ()
{
    builtin cd "$@"
    echo $PWD > $dirfilename
}
BartT
fonte
Isso é perfeito ... uau! Obrigado. Eu não sei muito sobre hacking bash, mas o homem já estou amando isso ...
apil.tamang