Jak utworzyć nowe okno w bieżącym katalogu w tmux?

208

Możliwe jest otwarcie new-windowz ustawionym katalogiem roboczym na ten, w którym aktualnie jestem. Używam zsh , jeśli to ma znaczenie.

Shrikant Sharat
źródło

Odpowiedzi:

139

Począwszy od tmux 1.9 default-pathopcja została usunięta, więc trzeba użyć -copcji z new-windowi split-window(na przykład przez ponowna konsolidacja c, "oraz %powiązania obejmuje
-c '#{pane_current_path}'). Szczegółowe informacje można znaleźć w niektórych innych odpowiedziach na to pytanie.


Odpowiednia funkcja pojawiła się w pnia SVN tmux na początku lutego 2012 r. W kompilacjach tmux zawierających ten kod wywoływane powiązania klawiszy tmuxnew-window utworzą nowe okno z tym samym bieżącym katalogiem roboczym, co aktywne procesy bieżącego panelu (tak długo, jak default-pathsesja opcja jest pusta; jest domyślnie). To samo dotyczy panelu utworzonego przez split-windowpolecenie, gdy jest wywoływane przez powiązanie.

Korzysta ze specjalnego kodu specyficznego dla platformy, dlatego obecnie obsługiwane są tylko niektóre systemy operacyjne: Darwin (OS X), FreeBSD, Linux, OpenBSD i Solaris.

Powinno to być dostępne w następnej wersji tmux (1.7?).


Z tmux 1.4 zwykle po prostu używam

tmux neww

w powłoce, która ma już żądany bieżący katalog roboczy.

Jeśli jednak przewiduję potrzebę utworzenia wielu okien z tym samym bieżącym katalogiem roboczym (lub chcę móc je uruchomić za pomocą zwykłego cpowiązania klawiszy <prefix> ), wówczas ustawiam default-pathopcję sesji za pomocą

tmux set-option default-path "$PWD"

w powłoce, która ma już żądany bieżący katalog roboczy (chociaż można to oczywiście zrobić z dowolnego katalogu i po prostu podać wartość).

Jeśli default-pathjest ustawiona na niepustą wartość, jej wartość zostanie użyta zamiast „dziedziczenia” bieżącego katalogu roboczego z wywołań wiersza poleceń z tmux neww.

Tmux FAQ posiada wpis zatytułowany „Jak mogę otworzyć nowe okno w tym samym katalogu co bieżącym oknie?”, Który opisuje kolejne podejście; jest to jednak trochę skomplikowane.

Chris Johnsen
źródło
6
Czy istnieje sposób, w jaki mogę zmapować, <prefix>caby odczytać katalog roboczy bazowej instancji powłoki (jeśli istnieje) i ustawić default-pathprzed uruchomieniem new-window. A może to zbyt wiele, by prosić o tmux :)
Shrikant Sharat
Z drugiej strony, czy w ogóle można odczytać katalog roboczy powłoki? Zabiłbym, żeby wyświetlał to na pasku stanu.
Shrikant Sharat
2
Nie ma przenośnego sposobu na wyodrębnienie cwd innego procesu (chociaż jest to możliwe na niektórych platformach (np. /proc/PID/cwdLinux)). Jest możliwe rozwiązanie częściowe w wpisu na tmux FAQ (ma rekord powłoki jego cwd kiedy drukuje wiersz, a następnie wiąże klucz, który rozpoczyna nową powłokę w nagranej katalogu).
Chris Johnsen
ok, to jest trochę poza zasięgiem mojej wiedzy i nie czuję się zbyt wiarygodny. Coś mi mówi, że lepiej byłoby bez tego wszystkiego ... w każdym razie dzięki.
Shrikant Sharat
1
@paradroid: Cokolwiek zrobione przez powiązanie (domyślnie) użyje cwd serwera tmux lub wartości default-pathopcji sesji (jeśli jest ustawiona). Tmux FAQ posiada wpis opisujący sposób powiązać przycisk, który uruchamia nowe okno z CWD z uruchomionym Shell w bieżącym oknie ( „Jak mogę otworzyć nowe okno w tym samym katalogu co bieżącym oknie?”) , ale metoda jest dość skomplikowana. To samo prawdopodobnie można zrobić dla split-windowi new-session(zamiast neww).
Chris Johnsen,
268

Bieżąca strona podręcznika Tmux (1.9a) zawiera opcjonalny -c start-directoryparametr dla niektórych poleceń, w tym new-windowi split-window. Zawiera także zmienną formatu pane_current_path, która odnosi się do Current path if available.

Łącząc je, możemy otworzyć nowe okno z bieżącym katalogiem roboczym, używając
new-window -c "#{pane_current_path}"
cytatu, jeśli bieżąca ścieżka zawiera spacje.

Jeśli chcesz podzielić bieżący panel pionowo, użyj
split-window -c "#{pane_current_path}"
lub, aby podzielić poziomo
split-window -h -c "#{pane_current_path}"

Aby domyślne powiązania otwierały nowe podziały i okna z bieżącym katalogiem roboczym, dodaj następujące elementy do swojego .tmux.conf. "Z okolic cytatów jest powiedzieć tmux nie powinien rozpocząć ciąg lecz wiążą "klucz.

bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"
Simon Kohlmeyer
źródło
1
Czy to nie działa na Tmux 1.9? Nie mogę tego zrobić zgodnie z oczekiwaniami.
Erik Garrison,
1
bind-key -r Wpisz nowe okno -c "# {pane_current_path}", działa na tmux 2.1
Marslo
5
Działa w tmux 2.3 na OSX. Nie zapomnij zatrzymać / zabić wszystkich istniejących sesji, aby zastosować te powiązania.
jmgarnier
1
@jmgarnier lub uzupełnij profil: prefix- :, a następnie wpiszsource ~/.tmux.conf
ijoseph,
8
@jmgarnier lub po prostu tmux source-file .tmux.conf.
Blauhirn
37

Tak, użyj new-window -c "#{pane_current_path}". Możesz dodać następujące elementy, aby były ~/.tmux.conftrwałe (przyjmując domyślne skróty klawiszowe):

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

default-pathUstawienie ścieżka została usunięta z kodu przed i tmux autora zalecanych w tej wiadomości popełnienia pomocą jednej -c "#{pane_current_path}"lub -c "$PWDw new-windowi split-windowpolecenia.

Odpowiedziałem również w tym zduplikowanym pytaniu .

mmoya
źródło
10

W najnowszych wersjach tmux (v1.8, ale może także w v1.7):

tmux new-window -c "$PWD"
mislav
źródło
Wydaje się, że działa to również w podzielonym oknie, np.tmux split-window -v -c "$PWD"
user7089
3
$PWDnie wydaje się działać dla mnie w tmux 1.9a. Musiałem użyć pane_current_pathzgodnie z sugestią powyżej.
jordelver
3

Inne odpowiedzi nie działają dla mnie, gdy próbuję umieścić je jako powiązania (konkretnie tmux split-window -c). Ale stworzyłem własne rozwiązanie, którego używam od ponad roku, które działa zarówno dla nowego okna, jak i dla podziałów:

~/.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"

Działa przynajmniej z $ (tmux -V) 1.8. Zobacz nieskomentowane wiersze tutaj dla wersji działającej dla starszych tmux, które nie mają polecenia show-environment.

Erik Westrup
źródło
0

tmux zrobił to w wersji 1.8, ale w wersji 1.9 ta funkcja została usunięta na korzyść użycia -cflagi.

Można to rozwiązać, ale ponownie powiązać, new-windowale w przypadku, gdy chcesz uruchomić coś innego, staje się to zbyt trudne: zamiast pisać neww man tmuxbędziesz musiał pisać, neww -c "#{pane_current_path}" man tmuxczego najprawdopodobniej nie chcesz.

Istnieje mod tmux (jestem autorem), aby dodać odpowiedni język skryptowy do tmux, aby umożliwić używanie aliasów, wiązanie wielu poleceń w „trybie”, zmiennych, pętli itp. A także przywraca to zachowanie : nowe okna i panele są otwierane w bieżącym katalogu.

Można go zbudować ze źródeł tutaj: http://ershov.github.io/tmux/

Jurij Erszow
źródło