Tmux zapomina katalog, w którym sesja została utworzona


8

Kiedy tworzę wiele sesji w tmux, bieżący katalog dla każdego nowego okna w kolejnych sesjach jest ustawiany jako katalog bieżący dla pierwszej.

Na przykład:

-> 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"

Jak zmusić tmux do ustawienia bieżącego katalogu dla każdego nowego okna w kolejnych sesjach jako katalogu, w którym sesja została utworzona?

tmux 1.6

zsh 4.3

Odpowiedzi:


21

Od wersji tmux 1.9 opcja ścieżki domyślnej została usunięta .

Możesz użyć następujących poleceń, aby otworzyć w katalogu, w którym sesja się otworzyła („klient” w nazwie wskazywałby mi, że jest to bieżący runmin w twojej powłoce, ale wydaje się, że zmienia ścieżki podczas przełączania między sesjami w ten sam klient):

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

W przeciwnym razie skopiuj ścieżkę bieżącego panelu:

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

Istnieje również ścieżka_part_start, która może odwoływać się do niektórych przepływów pracy.

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

Dla poleceń podzielonego okna.

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

1
TO jest poprawna odpowiedź. W szczególności druga opcja w moim przypadku.
Mike Rapadas

na marginesie, nie zapomnij zamknąć wszystkich bieżących działających terminali tmux, w tym tła, przed zmianą pliku konfiguracyjnego, w przeciwnym razie tmux nie załaduje nowych konfiguracji.
przypadkowość2077

@lightmanhk Powinieneś być w stanie po prostu: source ~ / .tmux.conf
David C. Bishop

1
Jest jakiś sposób na uogólnienie tego dla podziałów okien? split-window -h "#{pane_current_path}"nie zadziała ...
Bach

1
@ Bach Spróbuj z -c. split-window -h -c "#{pane_current_path}"
David C. Bishop

3

Zdaję sobie sprawę, że to pytanie jest dość stare, ale pojawiło się jako jedno z niewielu pytań na StackExchange, kiedy sam szukałem odpowiedzi, więc oto, jak rozwiązałem to dla Tmux 1.8.

new-windowKomenda zajmuje -cflagę, która pozwoli na określenie aktualnego katalogu nowym oknie. Domyślnie jest to pusty ciąg, który będzie używał bieżącego katalogu roboczego paneli jako katalogu dla nowego okna. Podanie -jako wartości dla -cflagi ustawi katalog nowego okna na to, w którym sesja została otwarta.

Oto fragment dokumentacji:

-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

Jeśli chcesz zmienić domyślne zachowanie <PREFIX> cklawiszy, aby to odzwierciedlić, oto co zrobiłem w moim ~/.tmux.conf:

bind-key c   new-window -c -

0

tutaj jest sporo odpowiedzi: /unix/12032/create-new-window-with-current-directory-in-tmux

w podsumowaniu:

z tmux FAQ, jeden tępy (ale bardzo ogólny i dość niezależny od powłoki) sposób:

  • Jak mogę otworzyć nowe okno w tym samym katalogu, co bieżące okno?

Jedną z opcji jest po prostu uruchomienie „TMUX = tmux” w oknie. Działa to jednak tylko wtedy, gdy żadne polecenie nie jest uruchomione, aby można było wprowadzić polecenie.

Obejściem problemu jest poinformowanie tmux o bieżącej ścieżce poprzez zmienną środowiskową. Aby to zrobić, użyj następującego polecenia:

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

Który ustawia TMUXPWD_i (gdzie i jest numerem bieżącego okna) na ścieżkę bieżącego katalogu. To polecenie można dodać do PS1, na przykład:

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

Po utworzeniu nowego okna należy poprosić powłokę o zmianę katalogu. Możesz zdefiniować nowe powiązanie (na przykład, jeśli używasz GNU bash):

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

To rozwiązanie będzie działać, nawet jeśli polecenie jest aktualnie uruchomione w terminalu, ale nie będzie działać z okna, które właśnie zostało zamienione na inne, ponieważ program TMUXPWD_i nie zostanie zaktualizowany po zamianie. Jednak po wyświetleniu nowego monitu TMUXPWD_i jest poprawnie aktualizowany.

po prostu zamień wywołania na powłokę odpowiednio do twojego.

także, najwyraźniej nowsze wersje tmux mają to zaadresowane poleceniem

tmux nowe okno

twierdzi się, że starsze wersje działają w ten sposób:

powołanie

tmux neww

z twojej powłoki otworzy tmux w tym reż.

jeśli chcesz mieć możliwość otwierania nowych okien lub paneli z bieżącego katalogu roboczego w tmux, powinieneś zamiast tego:

tmux set-option domyślna ścieżka „$ PWD”


Dzięki za próbę pomocy, mors . Zobaczyłem to pytanie na unix.stackexchange i przeczytałem FAQ. Nie są to jednak odpowiedzi na moje pytanie.
Shamaoke

1
Po utworzeniu nowej sesji bieżącym katalogiem dla każdego nowego okna lub panelu otwieranego w tej sesji będzie katalog, w którym rozpoczyna się sesję . Jest to prawdą, jeśli utworzę jedną sesję. Jednak gdy otworzę nowe okno terminala i rozpocznę w nim kolejną sesję, bieżącym katalogiem roboczym dla każdego nowego okna będzie katalog, w którym rozpoczynam pierwszą sesję, ale nie bieżąca. Jest to najwyraźniej błąd w tmux 1.6, ponieważ kiedy obniżyłem go do wersji 1.3, błąd nie pojawił się.
Shamaoke
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.