Come posso aprire un nuovo terminale nella stessa directory dell'ultimo utilizzato da un keybind del gestore delle finestre?


25

Sto usando un gestore di finestre di affiancamento e sono passato da gnome-terminalpiù schede a più urxvtistanze gestite dal gestore di finestre. Una delle caratteristiche che mi manca è la possibilità di aprire un nuovo terminale che passa alla directory di lavoro dell'ultima.

In breve: ho bisogno di un modo per aprire un nuovo urxvt (bash) che per impostazione predefinita è $ PWD dell'ultimo utilizzato.

L'unica soluzione che mi viene in mente è quella di salvare il percorso corrente su ognuno cdcon qualcosa del genere:

echo $PWD > ~/.last_dir

e ripristinare il percorso sul nuovo terminale in questo modo:

cd `cat ~/.last_dir`

Posso generare il secondo comando .bashrcma non so come eseguire il primo su ogni cambio di directory :)

Qualsiasi soluzione più semplice che non comporta screeno l' tmuxutilizzo è il benvenuto.


Stai utilizzando l' tabbedestensione " " perl di urxvt?
rozcietrzewiacz,

Nessuna scheda, sto usando nuovi terminali gestiti da WM
Luca,

Risposte:


9

Vedo tre soluzioni usando .last_dir. Puoi posizionare echo $PWD > ~/.last_diruno dei due:

  1. In una funzione speciale che sarebbe un wrapper per cd:

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

    Inseriscilo nel tuo ~/.bashrce poi usa cd_invece di cd ogni volta che vuoi che la tua nuova directory di lavoro sia memorizzata.

  2. Nel tuo $PROMPT_COMMAND( non consigliato ):

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

    Puoi testarlo direttamente dal terminale o inserirlo ~/.bashrc. Questa soluzione, tuttavia, innesca una scrittura su disco ogni volta che viene visualizzato il prompt, il che potrebbe causare problemi, ma d'altra parte, .last_dirconterrebbe la directory corrente, indipendentemente da come ci sei arrivato.

  3. In uno script di estensione perl personalizzato per rxvt. Non ne ho mai creato uno da solo, ma puoi trovare alcuni esempi sul web.


PROMPT_COMMAND è quello che stavo cercando. Proverò questa soluzione sperando che non influisca sulle prestazioni.
Luca

Bene, è un modo piuttosto rozzo, francamente. Personalmente, mi piace la soluzione di Michael :)
rozcietrzewiacz,

1
Mi piace il modo di estensione perl, se deve funzionare al di fuori del terminale; sembra più pulito che hackerare qualcosa PROMPT_COMMAND, una delle variabili d'ambiente più abusate di tutti i tempi
Michael Mrozek

Sembra che $ PWD sia valutato solo la prima volta
Luca

@neon Aaah ... Siamo spiacenti. Il problema è con come viene quotato PROMPT_COMMAND. (O meglio, come non$PWD è stato citato.) Vorrei risolvere questo ... Ecco. Questo dovrebbe farlo.
rozcietrzewiacz,

13

Attualmente sto usando questa versione della soluzione 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 il mio .zshrc


sto usando anche la soluzione n. 1 e aggiungo che trap "[ -f ~/.last_dir ] && rm ~/.last_dir" EXITvoglio iniziare sempre a casa mia, tranne quando apro una nuova scheda
rkmax,

Questo non funziona se si utilizza la auto_cdfunzione di zsh. Si scopre che possiamo usare un hook fornito da zsh: gist.github.com/jonleighton/1f0b96b49247a07dbaa30fbbe70b34f7
jonleighton

12

Questo è in realtà piuttosto banale; se corri urxvtdalla tua urxvtfinestra esistente , la nuova finestra sarà nella stessa directory. Ho fatto dupun'alleanza urxvt &per questo motivo. Se lo si desidera associato a un tasto di scelta rapida, è possibile utilizzare il bindcomando bash . Ad esempio, per associarlo a F1:

$ bind '"\e[11~": "urxvt &\n"'

Grazie per il consiglio. Sapevo che i processi secondari secondari mantenevano lo stato, ma non sapevo che si potesse associare una chiave a un comando in bash. Mi piacerebbe farlo da WM per evitare di focalizzare il terminale.
Luca,

Mi piace. Nessun disco scrive e l'unica esecuzione ha luogo quando stai per aprire il nuovo terminale.
rozcietrzewiacz,

L'unica cosa che cambierei è usare ( urxvt & ) &>/dev/nullinvece di solo lo sfondo.
rozcietrzewiacz,

Questa soluzione è ottima e più flessibile, ma non mi piace usare 2 attacchi, uno per lanciare il terminale e uno per rovesciarne uno nuovo.
Luca,


4

Ovviamente si tratta di un approccio di lavoro per modificare cdil comportamento, ma vorrei mostrare una soluzione più semplice. In man bash (1) ho scoperto che se esce un interattivo se funziona ~/.bash_logout. Quindi, invece di memorizzare il percorso ad ogni invocazione cddell'ultimo percorso, può essere salvato all'uscita.

Il mio ~/.bash_logoutè molto semplice:

echo $PWD >~/.lastdir

E da qualche parte nel mio .bashrcho inserito questa linea:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)

1
Basta notare che .bash_logoutfunziona solo quando login shellsesce, non è sempre così.
henfiber,

1
In alternativa, salva l'ultimo percorso quando bashesce con: trap "echo $PWD > ~/.lastdir" EXIT"
henfiber il

@henfiber Grazie per i tuoi commenti! Penso che in questo caso la shell sia una shell di login, quindi questo si comporterà correttamente. D'altra parte l' trapapproccio è anche bello, mi piace!
Vero

2

Molto spesso uso più finestre contemporaneamente, ognuna con più schede. Ad esempio: una finestra per le schede di sviluppo del codice sorgente, una finestra per i file in lattice, una finestra per l'esecuzione e lo scripting di R, ecc. All'interno di una finestra, voglio che un nuovo terminale a schede cambi nella directory utilizzata l'ultima volta in quella particolare finestra (questo funzionava in passato, ma con la nuova versione di gnome, in qualche modo non funziona). La seguente soluzione sporca funziona bene per me. Ho inserito questo in .bashrc.

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

function cd ()
{
    builtin cd "$@"
    echo $PWD > $dirfilename
}

Questo è perfetto ... wohoo! Grazie. Non so molto sull'hacking di bash, ma amico, lo sto già amando ...
apil.tamang
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.