Czy jest jakiś sposób na przerysowanie okna tmux przy zmianie mniejszego monitora na większy?

399

Załóżmy, że łączysz się ze zdalnym serwerem przez ssh za pomocą Terminal.app. Kiedy „tmux attach” z monitorem o większej rozdzielczości od mniejszego, który wcześniej zacząłeś tmux, rysuje kropki wokół konsoli. Nie pasuje do nowego rozmiaru okna. Czy jest jakiś sposób na przerysowanie i wyczyszczenie okna? CTRL+ Llub CTRL- B+ Rnie pomaga. Nie mogłem znaleźć właściwego polecenia dla człowieka.

% tmux -V
tmux 1.5
Nobu
źródło
7
Chciałbym wiedzieć, jak przerysować wszystkie sesje bez odłączania żadnej z nich.
PJ Brunet
3
wszyscy się tylko odłączają ... znalazłeś sposób?
Patoshi パ ト シ
Dla szybkiego odniesienia: learnbatta.com/blog/tmux-working-with-split-terminal-95
anjaneyulubatta505
tak, nadal chciałbym znać odpowiedź na pytanie: „Czy jest jakiś sposób, aby przerysować i wyczyścić okno?”
jaydel

Odpowiedzi:

579

tmux ogranicza wymiary okna do najmniejszego z każdego wymiaru we wszystkich sesjach, do których okno jest przyłączone. Gdyby tego nie zrobił, nie byłoby rozsądnego sposobu wyświetlenia całego obszaru okna dla wszystkich dołączonych klientów.

Najłatwiej jest odłączyć innych klientów od sesji po dołączeniu:

tmux attach -d

Alternatywnie możesz przenieść innych klientów do innej sesji przed dołączeniem do sesji:

takeover() {
    # create a temporary session that displays the "how to go back" message
    tmp='takeover temp session'
    if ! tmux has-session -t "$tmp"; then
        tmux new-session -d -s "$tmp"
        tmux set-option -t "$tmp" set-remain-on-exit on
        tmux new-window -kt "$tmp":0 \
            'echo "Use Prefix + L (i.e. ^B L) to return to session."'
    fi

    # switch any clients attached to the target session to the temp session
    session="$1"
    for client in $(tmux list-clients -t "$session" | cut -f 1 -d :); do
        tmux switch-client -c "$client" -t "$tmp"
    done

    # attach to the target session
    tmux attach -t "$session"
}
takeover 'original session' # or the session number if you do not name sessions

Ekran ponownie się zmniejszy, jeśli mniejszy klient przełączy się na sesję.

Istnieje również odmiana, w której „przejmujesz” okno (łączysz okno w nową sesję, ustawiasz aggressive-resizei przełączasz dowolne inne sesje, które mają aktywne okno na inne okno), ale ogólnie trudniej jest napisać skrypt case (i inaczej niż „exit”, ponieważ chcesz rozłączyć okno lub zabić sesję zamiast po prostu odłączyć się od sesji).

Chris Johnsen
źródło
Należy pamiętać, że można uzyskać z bieżącej sesji $(tmux display-message -p '#S'), patrz: superuser.com/questions/410017/... .
GManNickG
3
Ta odpowiedź zawiera rekwizyty dotyczące szczegółów i bazy wiedzy. Ale zobacz odpowiedź Shi B. Ctrl-b + Ddla łatwości użycia (i zapamiętywania).
fbicknel
„tmux detach -a” działało dla mnie; „Tmux attach -d” nie.
mahemoff
(1) włączone nowsze błędy tmux set-option... set-remain-on-exit on. Zobacz tmux # 787 . Teraz można użyć: tmux set-hook -t "$tmp" window-linked 'set remain-on-exit on.
user1902689,
1
(2) na nowszym tmuxie, musisz użyć new-windowostatniego argumentu czegoś podobnego, 'echo "Use Prefix + L (i.e. ^B L) to return to session.'; while(true); do read; done"inaczej nie zobaczysz komunikatu. (W niektórych okolicznościach zobaczysz to, jeśli przewiniesz w górę lub terminal będzie wyższy.) Jeśli go użyjesz, prawdopodobnie lepiej Ci będzie bez mojego komentarza „(1)” lub czegokolwiek innego remain-on-exit.
user1902689,
462

Zawsze możesz nacisnąć CTRL- B+ SHIFT-, Daby wybrać klienta, którego chcesz odłączyć od sesji.

tmux wyświetli listę wszystkich sesji z ich bieżącym wymiarem. Następnie po prostu odłączasz się od wszystkich mniejszych sesji.

Shi B.
źródło
6
Wyjaśnienie. Jest to kapitał D. Małe „d” odrywa klienta.
Raghuram Murthy P
2
CTRL-Bjeśli to twój prefiks. Mój był, CTRL-Aodkąd przełączyłem się z ekranu.
Blaskovicz
1
W rzeczywistości musisz odłączyć się od wszystkich mniejszych sesji z tej samej grupy sesji. Jednak CTRL-B + SHIFT-D nie pokazuje, że każda sesja należy do której grupy. Wolę uruchomić, tmux list-sessionsktóry pokazuje nazwę sesji, rozmiar i informacje o grupie, a następnie tmux kill-session -t <session_name>zabić sesje tej samej grupy.
Zhichang Yu
180

Prostsze rozwiązanie w najnowszych wersjach tmux (testowane w wersji 1.9) możesz teraz:

tmux detach -a

-a jest dla wszystkich innych klientów w tej sesji oprócz bieżącego

Możesz to zrobić w swoim aliasie. [Bash | zsh] rc

alias takeover="tmux detach -a"

Przepływ pracy: Możesz połączyć się z sesją normalnie, a jeśli przeszkadza ci inna sesja, która zmusiła rozmiar twojego okna Tmux, możesz po prostu zadzwonić takeover.

gbin
źródło
13
Dzięki wielkie! pracował Jeśli robisz to w aktywnej sesji tmux, po prostu naciśnij CTRL + B (lub dowolną inną niestandardową komendę tmux), a następnie:detach -a
Iacchus
Lub po prostu uruchom tmux detach -aw linii poleceń powłoki w Tmux.
jdhao
4

Pozostałe odpowiedzi nie pomogły mi, ponieważ miałem tylko klienta podłączonego (poprzednia, która rozpoczęła sesję, była już odłączona).

Aby to naprawić, postępowałem zgodnie z odpowiedzią tutaj (nie używałem xterm).

Który po prostu powiedział:

  1. Odłącz od sesji tmux
  2. Uruchom resizekomendę Linux
  3. Dołącz ponownie do sesji tmux
pev.hall
źródło
3

Właśnie natrafiłem na ten problem i natknąłem się na inną sytuację. Chociaż to chyba jednorożec, pomyślałem, że go ułożę.

Miałem jedną sesję, która była mniejsza, i zauważyłem, że rozmiary czcionek były różne: mniejsza sesja miała mniejsze czcionki. Najwyraźniej z jakiegoś powodu zmieniłem rozmiary czcionek w oknie.

Tak więc w OS X właśnie zrobiłem Cmd-+sesję o mniejszym rozmiarze i wróciła ona na swoje miejsce.

JESii
źródło
To naprawiono dziwne umieszczanie paska stanu tmux w terminalu macOS. Kiedy mam otwarte zakładki terminala, zmienia on pozycję paska statusu tmux. Gra z zoomem przez cmd-+lub -go naprawia.
Paul
0
ps ax | grep tmux
17685 pts/22   S+     0:00 tmux a -t 13g2
17920 pts/11   S+     0:00 tmux a -t 13g2
18065 pts/19   S+     0:00 grep tmux

zabij drugiego.

Balamadras
źródło
8
Wydaje się, że jest to prawidłowa odpowiedź na pytanie tytułowe, pomimo lepszych odpowiedzi. Nie rozumiem, dlaczego stało się tak zapomniane.
JoL
tak, to jedyna odpowiedź, która zadziałała dla mnie
Yasir Hantoush
0

Używam Ctrl- b+, qco powoduje, że jest to numer flash dla każdego panelu, przerysowując je po drodze.

auselen
źródło