Tmux dimentica la directory in cui è stata creata la sessione


8

Quando creo più sessioni in tmux, la directory corrente per ogni nuova finestra nelle sessioni successive viene impostata come directory corrente per la prima.

Per esempio:

-> cd /home/one && tmux new-session -n one\; new-window -n two
   # /home/one is the current directory for each window

-> cd /home/two && tmux new-session -n three\; new-window -n four #\; etc.
   # "/home/two" is the current directory for the window "three"
   # but for the window "four" and other created windows it is "/home/one"

Come posso forzare tmux a impostare la directory corrente per ogni nuova finestra nelle sessioni successive come directory in cui è stata creata la sessione?

tmux 1.6

zsh 4.3

Risposte:


21

A partire da tmux 1.9 è stata rimossa l'opzione del percorso predefinito .

È possibile utilizzare quanto segue per aprire nella directory in cui è stata aperta la sessione (il "client" nel nome mi indica che è l'attuale tmux runnin nella shell, ma sembra cambiare i percorsi quando si passa da una sessione all'altra stesso cliente):

bind-key c  new-window -c "#{client_cwd}"

Altrimenti per copiare il percorso del riquadro corrente:

bind-key c  new-window -c "#{pane_current_path}"

C'è anche pane_start_path che potrebbe fare appello ad alcuni flussi di lavoro.

bind-key c  new-window -c "#{pane_start_path}"

Per i comandi della finestra divisa.

bind-key % split-window -h -c "#{pane_current_path}"
bind-key '"' split-window -c "#{pane_current_path}"

1
Questa è la risposta corretta. In particolare la seconda opzione nel mio caso.
Mike Rapadas,

a parte questo, non dimenticare di chiudere tutti i terminali tmux funzionanti, incluso lo sfondo, prima di modificare il file di configurazione, altrimenti tmux non caricherà nuove configurazioni.
casualness2077

@lightmanhk Dovresti essere in grado di: source ~ / .tmux.conf
David C. Bishop

1
Un modo per generalizzare questo per le suddivisioni dei riquadri? split-window -h "#{pane_current_path}"non funzionerà ...
Bach,

1
@Bach Prova con un -c. split-window -h -c "#{pane_current_path}"
David C. Bishop,

3

Mi rendo conto che questa domanda è piuttosto vecchia, ma è emersa come una delle uniche domande su StackExchange quando stavo cercando la risposta da solo, quindi ecco come l'ho risolta per tmux 1.8.

Il new-windowcomando prende il -cflag che ti permetterà di specificare la directory corrente della nuova finestra. Per impostazione predefinita, è una stringa vuota, che utilizzerà la directory di lavoro dei riquadri correnti come directory per la nuova finestra. Passando a -come valore per il -cflag, la directory della nuova finestra verrà impostata su come è stata aperta la sessione.

Ecco un estratto dai documenti:

-c specifies the working directory in which the new window is created.  It may 
have an absolute path or one of the following values (or a subdirectory):

       Empty string    Current pane's directory
       ~               User's home directory
       -               Where session was started
       .               Where server was started

Se vuoi cambiare il comportamento predefinito del <PREFIX> ckeybinding per riflettere questo, ecco cosa ho fatto nel mio ~/.tmux.conf:

bind-key c   new-window -c -

0

ci sono alcune risposte qui: /unix/12032/create-new-window-with-current-directory-in-tmux

In sintesi:

dalle FAQ di tmux, un modo ottuso (ma molto generale e indipendente dalla shell):

  • Come posso aprire una nuova finestra nella stessa directory della finestra corrente?

Un'opzione è semplicemente eseguire "TMUX = tmux" nella finestra. Tuttavia, questo funziona solo se non è in esecuzione alcun comando, quindi è possibile immettere il comando.

Una soluzione alternativa consiste nel far conoscere a tmux il percorso corrente attraverso una variabile di ambiente. Per fare ciò, utilizzare il seguente comando:

[ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD

Che imposta TMUXPWD_i (dove i è il numero della finestra corrente) sul percorso della directory corrente. Questo comando può essere aggiunto a PS1, ad esempio:

PS1='$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD)\h$ '

Quando viene creata una nuova finestra, alla shell dovrebbe essere chiesto di cambiare directory. È possibile definire un nuovo binding (ad esempio, se si utilizza GNU bash):

bind-key C-c run-shell 'tmux neww "cd $(tmux display -p "\$TMUXPWD_#I"); exec bash"'

Questa soluzione funzionerà anche se un comando è attualmente in esecuzione nel terminale, ma non funzionerà da una finestra che è stata appena scambiata con un'altra perché TMUXPWD_i non verrà aggiornato dopo uno scambio. Tuttavia, una volta visualizzato un nuovo prompt, TMUXPWD_i viene aggiornato correttamente.

sostituisci semplicemente le chiamate alla shell secondo le tue esigenze.

inoltre, le versioni apparentemente più recenti di tmux hanno risolto questo problema con un comando

tmux new-window

si dice che le versioni precedenti funzionino così:

chiamata

tmux neww

dalla tua shell si aprirà tmux in quella directory.

se si desidera poter aprire nuove finestre o riquadri dalla directory di lavoro corrente in tmux, è necessario invece:

tmux set-option default-path "$ PWD"


Grazie per aver cercato di aiutare, tricheco . Ho visto quella domanda su unix.stackexchange e ho letto le FAQ. Tuttavia, queste non sono le risposte alla mia domanda.
Shamaoke,

1
Quando crei una nuova sessione, la directory corrente per ogni nuova finestra o riquadro che apri in quella sessione sarà quella directory in cui inizi la sessione . Questo è vero se creo una singola sessione. Tuttavia, quando apro una nuova finestra del terminale e inizio un'altra sessione in essa la directory di lavoro corrente per ogni nuova finestra sarà quella directory in cui inizio la prima sessione ma non quella corrente. Questo è apparentemente un bug in tmux 1.6 da quando l'ho passato alla versione 1.3 il bug non appariva.
Shamaoke,
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.