Come creare una nuova finestra sulla directory corrente in tmux?


209

È possibile aprire un new-windowcon la sua directory di lavoro impostata su quella in cui mi trovo attualmente. Sto usando zsh , se è importante.

Risposte:


140

A partire dal tmux 1.9 l' default-pathopzione è stata rimossa, quindi è necessario utilizzare l' -copzione con new-window, e split-window(ad esempio rebinding il c, "e %attacchi per includere
-c '#{pane_current_path}'). Vedi alcune delle altre risposte a questa domanda per i dettagli.


Una caratteristica pertinente è approdata nel trunk SVN di tmux all'inizio di febbraio 2012. Nelle build di tmux che includono questo codice, i bind dei tasti tmux che invocano new-windowcreeranno una nuova finestra con la stessa directory di lavoro corrente dei processi attivi del riquadro corrente (purché la default-pathsessione l'opzione è vuota; è di default). Lo stesso vale per il riquadro creato dal split-windowcomando quando viene richiamato tramite un'associazione.

Questo utilizza un codice speciale specifico per la piattaforma, quindi al momento sono supportati solo determinati sistemi operativi: Darwin (OS X), FreeBSD, Linux, OpenBSD e Solaris.

Questo dovrebbe essere disponibile nella prossima versione di tmux (1.7?).


Con tmux 1.4, di solito uso solo

tmux neww

in una shell che ha già la directory di lavoro corrente desiderata.

Se, tuttavia, prevedo la necessità di creare molte finestre con la stessa directory di lavoro corrente (o voglio essere in grado di avviarle con la solita cassociazione di tasti <prefix> ), quindi ho impostato l' default-pathopzione di sessione tramite

tmux set-option default-path "$PWD"

in una shell che ha già la directory di lavoro corrente desiderata (anche se ovviamente è possibile farlo da qualsiasi directory e specificare semplicemente il valore).

Se default-pathè impostato su un valore non vuoto, verrà utilizzato il suo valore anziché "ereditare" la directory di lavoro corrente dalle invocazioni della riga di comando di tmux neww.

Le FAQ di tmux hanno una voce intitolata "Come posso aprire una nuova finestra nella stessa directory della finestra corrente?" Che descrive un altro approccio; è un po 'contorto però.


6
Esiste un modo <prefix>cper mappare per leggere la directory di lavoro dell'istanza della shell sottostante (se presente) e impostare il default-pathprecedente all'esecuzione new-window. O è troppo chiedere di tmux :)
Shrikant Sharat,

In un'altra nota, è anche possibile leggere la directory di lavoro della shell sottostante? Ucciderei per averlo visualizzato nella mia barra di stato.
Shrikant Sharat,

2
Non esiste un modo portatile per estrarre il cd di un altro processo (anche se è possibile su alcune piattaforme (ad esempio /proc/PID/cwdsu Linux)). Esiste una possibile soluzione parziale in una voce delle FAQ di tmux (ha la shell che registra il suo cwd quando stampa un prompt, quindi associa una chiave che avvia una nuova shell nella directory registrata).
Chris Johnsen,

ok, questo è un po 'fuori portata per le mie conoscenze e non mi sento molto affidabile. Qualcosa mi dice che potrei stare meglio senza tutto questo ... grazie comunque.
Shrikant Sharat,

1
@paradroid: tutto ciò che viene fatto tramite un'associazione utilizzerà (per impostazione predefinita) il cwd del server tmux o il valore default-pathdell'opzione sessione (se impostato). Le FAQ di tmux hanno una voce che descrive un modo per associare una chiave che avvia una nuova finestra con il cwd della shell in esecuzione nella finestra corrente ("Come posso aprire una nuova finestra nella stessa directory della finestra corrente?") , ma il metodo è piuttosto contorto. Lo stesso potrebbe probabilmente essere fatto per split-windowe new-session(invece di neww).
Chris Johnsen,

268

La pagina man attuale di Tmux (1.9a) elenca un -c start-directoryparametro opzionale per alcuni comandi, incluso new-windowe split-window. Contiene anche la variabile di formato pane_current_path, che fa riferimento a Current path if available.

Combinando questi, possiamo aprire una nuova finestra con la directory di lavoro corrente usando
new-window -c "#{pane_current_path}"
Le quotazioni sono necessarie nel caso in cui il percorso corrente contenga spazi.

Se si desidera dividere verticalmente il riquadro corrente, utilizzare
split-window -c "#{pane_current_path}"
o, per una divisione orizzontale
split-window -h -c "#{pane_current_path}"

Per fare in modo che le associazioni di tasti aprano nuove divisioni e finestre con la directory di lavoro corrente per impostazione predefinita, aggiungi quanto segue a .tmux.conf. Le "citazioni circostanti devono dire a Tmux che non dovrebbe iniziare una stringa ma piuttosto associare la "chiave.

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

1
Questo non funziona su tmux 1.9? Non riesco a farlo come previsto.
Erik Garrison,

1
bind-key -r Immettere new-window -c "# {pane_current_path}", funziona per tmux 2.1
Marslo

5
Funziona in tmux 2.3 su OSX. Non dimenticare di interrompere / uccidere tutte le sessioni esistenti per vedere questi collegamenti applicati.
jmgarnier,

1
@jmgarnier o reinstalla il profilo: prefix- :, quindi digitasource ~/.tmux.conf
ijoseph

8
@jmgarnier o semplicemente tmux source-file .tmux.conf.
phil294,

37

Sì, usa new-window -c "#{pane_current_path}". È possibile aggiungere quanto segue al proprio ~/.tmux.confper renderlo persistente (assumendo i tasti di scelta predefinita):

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

L' default-pathimpostazione del percorso è stata rimossa dal codice upstream e tmux author raccomandato in quel messaggio di commit usando -c "#{pane_current_path}"o -c "$PWDnei comandi new-windowe split-window.

Ho anche risposto a questa duplice domanda .


10

Con le versioni recenti di tmux (v1.8, ma forse anche nella v1.7):

tmux new-window -c "$PWD"

Questo sembra funzionare anche con split-window, ad estmux split-window -v -c "$PWD"
User7089

3
$PWDnon sembra funzionare per me in tmux 1.9a. Ho dovuto usare pane_current_pathcome suggerito sopra.
jordelver,

3

Le altre risposte non funzionano per me quando provo a metterle come attacchi (in particolare tmux split-window -c). Ma ho inventato la mia soluzione che sto usando da più di un anno che funziona sia per la nuova finestra che per le divisioni:

~/.bashrc:

PS1="$PS1"'$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#D" | tr -d %) "$PWD")'

~/.tmux.conf:

unbind-key c
bind-key c run-shell 'tmux new-window "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"'
bind-key C new-window

bind-key - run-shell 'tmux split-window -v "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"'
bind-key | run-shell 'tmux split-window -h "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"

Funziona, almeno, con $ (tmux -V) 1.8. Vedi le righe commentate qui per una versione che funziona per i vecchi tmux che non hanno il comando show-environment.


0

tmux lo ha fatto nella versione 1.8 ma in 1.9 questa funzione è stata rimossa a favore dell'uso di -cflag.

Questo può essere risolto ma rilegato, new-windowma nel caso in cui desideri eseguire qualcos'altro diventa troppo prolisso: invece di digitare neww man tmuxdovrai digitare neww -c "#{pane_current_path}" man tmuxciò che molto probabilmente non vuoi fare.

C'è una mod di tmux (io sono l'autore) per aggiungere un linguaggio di scripting appropriato a tmux per consentire l'uso di alias, l'associazione di più comandi in 'mode', variabili, loop, ecc ... E inoltre, riporta quel comportamento : nuove finestre e riquadri vengono aperti nella directory corrente.

Può essere costruito da fonti qui: http://ershov.github.io/tmux/

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.