Przewiń wyjście powłoki myszą w tmux

255

Przewijanie myszą nie działa w tmuxie tak, jak działa, gdy uruchamiam powłokę bez tmux (w Gnome Terminal). Wygląda na to, że tmux wysyła zdarzenia przewijania myszą, tak jakbym naciskał klawisze góra / dół. Ale chcę, aby przewijał historię wyników powłoki . Czy istnieje sposób, aby Tmux działał w ten sposób?

Uwaga: Wiem, jak przewijać za pomocą klawiatury (dzięki kolejnemu pytaniu tutaj).

Próbowałem przewijania myszy w dwóch wersjach tmux:

użytkownik31494
źródło
1
Myślę, że odpowiedź bukzora rozwiązuje twój problem dla Tmux 1.5 i nowszych.
kynan

Odpowiedzi:

252

Aby przewijać w historii wyników Użyj ^b+. [ Następnie możesz użyć M + V, aby przewinąć w górę, a ^ V, aby przewinąć w dół. Nie wiem, czy możesz użyć prawdziwego PgUpi PgDownchociaż. Mój terminal nie wysyła tych kluczy do Tmux. Zamiast tego przewija się sama, a nie historia Tmux.

Aby wyjść z trybu kopiowania, naciśnij ESC

Aby używać myszy w tym trybie (nazywanym trybem kopiowania), naciśnij ^b+ : i wprowadź następujące informacje:

setw -g mouse on

Uwaga: W tmux <2.1 opcja została nazwana mode-mouse, a niemouse

Teraz, gdy przejdziesz do trybu kopiowania, możesz przewijać go za pomocą myszy. Możesz umieścić to polecenie w ~ / .tmux.conf, jeśli chcesz, więc ładuje się przy każdym uruchomieniu tmux.

Aktualizacja: Począwszy od tmux 1.5 ta opcja powoduje, że użycie kółka przewijania automatycznie przełącza się w tryb kopiowania i przewija bufor bufora przewijania tmux do tyłu. Nie jest już konieczne, aby najpierw uderzyć Ctrl-B+ [. Przewinięcie z powrotem do monitu powoduje również automatyczne wyłączenie trybu kopiowania.

Pavlo
źródło
1
Pamiętaj, że może być konieczne ponowne załadowanie pliku konfiguracyjnego, jeśli masz już działający serwer Tmux. blog.sanctum.geek.nz/reloading-tmux-config tmux plik źródłowy ~ / .tmux.conf
Allan Nienhuis
7
Nie działa dla mnie na OS X.
Ain
2
@Ain - Istnieje obecnie 11 głównych wersji OS X. O której wersji mówimy dokładnie?
Ramhound
10
Dla tmux> = 2.1, patrz odpowiedź @ DannyRe (obecnie dość daleko w dół).
joelostblom
3
set -g mouse onpracował dla mnie na macOS tmux 2.1
Miguel Mota
123

Istnieją pewne zmiany dla Tmux 2.1

  • Tryb myszy został przepisany. Nie ma już opcji dla:

    • okienko zmiany rozmiaru myszy
    • okienko wyboru myszy
    • okno wyboru myszy
    • tryb myszy

    Zamiast tego istnieje tylko jedna opcja: „mysz”, która całkowicie włącza obsługę myszy.

To by było

set -g mouse on
# to enable mouse scroll, see https://github.com/tmux/tmux/issues/145#issuecomment-150736967
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
DannyRe
źródło
6
Dzięki, teraz wybieram panele itp., Ale przewijanie nie działa. Aby ponownie włączyć przewijanie, użyj tego: github.com/NHDaly/tmux-scroll-copy-mode
Mahdi
1
niesamowite - działa nawet na cygwin - tmux na WINDOWS 7
GWD
@Mahdi Wydaje się, że to nie działa na osx. Jakieś wskazówki?
DiTTiD
2
bindnie wydaje się już potrzebny na tmux 2.3
Theron Luhn
2
+1 dla set -g mouse on. Poprzedni komentarz jest poprawny. Wiązanie nie jest już potrzebne.
Dakusan
63

Obecna wersja tmux (1.5) pozwala po prostu włączyć opcję mode-mouse i umożliwia przewijanie za pomocą kółka myszy.

         mode-mouse [on | off]
                 Mouse state in modes.  If on, the mouse may be used to
                 enter copy mode and copy a selection by dragging, to
                 enter copy mode and scroll with the mouse wheel, or to
                 select an option in choice mode.

W moim pliku .tmux.conf:

set-window-option -g mode-mouse on
bukzor
źródło
Takie zachowanie naprawdę chcesz! Przewijanie myszą umożliwiające tryb kopiowania, a nie tylko przewijanie alternatywnego bufora powłoki. To była dla mnie zachęta do przejścia z ekranu na tmux . Czy istnieje opcja uzyskania takiego samego zachowania również w przypadku Shift + PgUp?
kynan
1
@kynan: Osobiście po prostu naciskam, C-A PgUpaby to zrobić. Możesz powiązać klawisz page-up bezpośrednio tmux bind-key -n PPage copy-mode -u. Podobne polecenie powinno działać dla shift + pageup, jeśli odłączysz go od lokalnego terminalu.
bukzor 12.12.12
1
Powoduje to dziwne zachowanie, gdy po przewinięciu z powrotem do wiersza polecenia pojawia się dodatkowy znak wstawiany do interfejsu CLI, co zwykle skutkuje zniekształceniem pierwszego polecenia. To dość denerwujące.
Chris R
Zauważ, że jednak działa to dobrze w przypadku uruchamiania przewijania za pomocą myszy, powoduje dziwne zachowanie podczas wybierania tekstu do wklejenia środkowym kliknięciem. Skończyło się na tym, że preferowałem Cb pg-up / down (domyślnie), ponieważ kompromis był nie do zaakceptowania.
h7r
@ChrisR Też trochę to rozumiem i nie jest to spójne. Czy jest to typ [M [M # M # [M [M # [M [M] M # [M [M # [M]?
Elijah Lynn
53

Spróbuj tego w swoim .tmux.conf

# Make mouse useful in copy mode
setw -g mode-mouse on

# Allow mouse to select which pane to use
set -g mouse-select-pane on

# Allow xterm titles in terminal window, terminal scrolling with scrollbar, and setting overrides of C-Up, C-Down, C-Left, C-Right
set -g terminal-overrides "xterm*:XT:smcup@:rmcup@:kUP5=\eOA:kDN5=\eOB:kLFT5=\eOD:kRIT5=\eOC"

# Scroll History
set -g history-limit 30000

# Set ability to capture on start and restore on exit window data when running an application
setw -g alternate-screen on

# Lower escape timing from 500ms to 50ms for quicker response to scroll-buffer access.
set -s escape-time 50

Zaczerpnięte z http://brainscraps.wikia.com/wiki/Extreme_Multitasking_with_tmux_and_PuTTY

John L. Jegutanis
źródło
+1 za escape-timeustawienie
Dakusan
Dla wszystkich, którzy się zastanawiają, plik .tmux.conf znajduje się w katalogu domowym.
user2647513
15

Ktoś (z utraconego źródła) zasugerował dodanie następujących elementów do ~.tmux.conf:

set -g terminal-overrides 'xterm*:smcup@:rmcup@'

Nie mam pojęcia, jak to działa ani co robi, ale teraz pozwala mi to przewijać kółkiem myszy w sesji tmux bez konieczności wchodzenia w tryb kopiowania tmux; Po prostu przewijam koło i BAM! to działa. Zauważ, że używam terminal.app, ale pamiętam, że OP dał odpowiedź specjalnie do użycia z gnome-terminal.

Jed Daniels
źródło
1
Jed, dziękuję! Twoja rada działa również w terminalu gnome. Spróbuję użyć tej konfiguracji przez jakiś czas. Ma to jednak wadę: przewijanie myszy nie działa teraz zgodnie z oczekiwaniami less. Jeśli załaduję do lessśrodka tmux, przewijanie myszy nie przewija pliku otwartego w less. Przewija cały terminal. O dziwo, vimzachowuje się zgodnie z oczekiwaniami w tmuxtwojej konfiguracji.
user31494
2
Zauważ, że od wersji tmux 1.5 jest to zastępowane przez setw -g mode-mouse onopcję, która przewija tryb kopiowania za pomocą kółka myszy.
kynan
3
Wyjaśnienie jest takie, że ta opcja wyłącza blokadę przewijania na alternatywnym ekranie terminala, co jest pożądane w większości przypadków, ponieważ aplikacje żądające bufora alternatywnego ekranu (vi, mniej, tmux itp.) Zapewniają własne możliwości przewijania. Przesłonięcie tej blokady w tmux pozwala na przewijanie alternatywnego bufora ekranu terminala, co nie daje pożądanego rezultatu we wszystkich przypadkach poza kilkoma. Zobacz tę odpowiedź, aby uzyskać cytat z man xtermobjaśniania alternatywnego ekranu.
kynan
Niestety, to nie działa w iTerm
Suan
Mam z tym pozytywne wyniki w iTerm 2
Keith Smiley
5

tmux 2.1 wprowadza nowe wiązania myszy.

Napisałem te wiązania właśnie dzisiaj. Bezproblemowo wiąże kółko myszy ze strzałkami, gdy nie jest w Vimie, ponieważ Vim jest w stanie interpretować nieprzetworzone kody kół myszy (w celach takich jak wybór okna Vima do przewijania w zależności od tego, nad którym znajduje się Twoja mysz).

Oznacza to, że możemy w końcu używać myszy tylko do przeglądania wielu stron podręcznika i cokolwiek innego akceptuje klawisze strzałek. W razie potrzeby możesz rozszerzyć i połączyć iflogikę, aby zaimplementować większą logikę dla swoich aplikacji.

bind -n WheelUpPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Up"
bind -n WheelDownPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Down"

Dzięki tej nowej funkcji wiązania kół możliwe jest pisanie skryptami kółka myszy, aby wykonać dowolne zachowanie zależne od kontekstu.

Steven Lu
źródło
Teraz po prostu bawię się pomysłem, aby kółko myszy na obramowaniu szyby zrobiło coś interesującego. Prawdopodobnie to, co zrobię, to nie mapowanie koła na granicy, ale mapowanie go, aby cyklicznie uruchamiać okna tmux po zakończeniu linii statusu.
Steven Lu,
Jaki jest link do twojego Githuba? Chciałbym być na bieżąco z twoimi wysiłkami! Inną funkcją, której szukam, jest dwukrotne kliknięcie słowa skopiowanego do schowka X, tak jak poza Tmux.
joeytwiddle
@joeytwiddle Bardzo polecam github.com/NHDaly/tmux-better-mouse-mode , zobacz moją inną odpowiedź
Steven Lu
3

Gnome-terminal wykonuje pewne sztuczki, tłumacząc zdarzenia przewijania myszy na klawisze strzałek w górę i w dół w warunkach ograniczonego „zwykłego” przewijania. Na przykład, podczas przeglądania tekst używając less(to dzieje się w szczególności, gdy czytasz człowieka), można przewijać zawartość za pomocą j, koraz klawiszy strzałek. Ale także , gnome-terminaldzięki wspomnianemu trikowi, możesz to zrobić za pomocą przewijania myszą.

Sądzę więc, że tmuxpewne „przechwytywanie” terminala jest podobne less- i uruchamia się ten sam mechanizm gnome-terminal: przewijanie myszy przekłada się na naciśnięcia klawiszy strzałek w górę / w dół.

Możesz wyłączyć tę funkcję w ustawieniach profilu i uzyskać regularne przewijanie w każdych okolicznościach. Wystarczy odznaczyć pole wyboru w ostatniej zakładce „przewijanie”: pole wyboru.

ulidtko
źródło
Dziękuję za wyjaśnienia, Uldtko! Ale to nie pomaga w problemie z przewijaniem myszy. Tak, z wyłączoną opcją, gnome-terminalprzestaje wysyłać potrójne ^[[Ai ^[[Bprzewija się myszą. Jest ładniejszy tmux(nie jest brzydki ^[[A^[[A^[[Aw niektórych programach, nie ma brzydkiego przewijania historii poleceń), ale teraz lessprzestaje przewijać przy przewijaniu myszą.
user31494,
1
Ukraiński? (zgadywanie ipostaci)
dotancohen 18.04.13
1

https://github.com/NHDaly/tmux-better-mouse-mode

Konfigurowalna i bogata w funkcje implementacja sterowania myszą dla nowszych tmuxów. wysoce rekomendowane.

Prawdopodobnie chcesz użyć

set -g @emulate-scroll-for-no-mouse-alternate-buffer "on"

z tym też.

Steven Lu
źródło
Zainstalowałem to, ale nie mogę już podświetlać ani kopiować tekstu za pomocą myszy. Czy potrafisz to zrobić?
jonathanking
Tak, prawdopodobnie masz inną konfigurację tmux związaną z myszą, która jest z nią w konflikcie.
Steven Lu
0

Możesz połączyć wiążące pomysły z innych odpowiedzi, aby uzyskać całkiem satysfakcjonujące zachowanie przewijania: działa w vim zmiany do trybu kopiowania automatycznie w terminalu i wychodzi z niego, gdy osiągniesz dno, nadal pozwala używać kółka myszy w man, less i Journalctl.

Mój kod:

bind -n WheelUpPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Up Up Up Up"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"
bind -n WheelDownPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Down Down Down Down"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"

możesz dodać inne polecenia, które wymagają klawiszy strzałek do przewijania w części grep -e 'man'

dodałem klucze wysyłania wiele razy, więc jedno kliknięcie na kółku myszy przewinie 4 linie na raz

stealz
źródło
0

Jeśli jesteś już w sesji tmux, możesz uruchomić polecenie

set mouse on

Przypomnienie: aby uruchomić polecenia, użyj prefiksu :.

Robert
źródło