Jak mogę wyczyścić bufor przewijania w Tmux?

185

Do Twojej wiadomości używam Tmux za pośrednictwem aplikacji Terminal Mac OS X.

Daya Sharma
źródło
1
To zadziałało dla mnie: notes.jerzygangi.com/...
Mike

Odpowiedzi:

211

To samo pytanie nęka mnie od dłuższego czasu. Oto najlepsze, jakie wymyśliłem. Umieść to w pliku .tmux.conf:

bind -n C-k clear-history

To wiąże ctrl-k z komendą tmux clear-history. Opcja -n after bind sprawia, że ​​nie trzeba wydawać prefiksu polecenia tmux (domyślnie ctrl-b). Używam bash, więc ctrl-l już odpowiada wpisaniu „wyczyść” w wierszu poleceń. Za pomocą tych dwóch klawiszy otrzymuję ładną kombinację ctrl-l, ctrl-k, która przenosi cały bufor przewijania z ekranu („wyczyść”), a następnie usuwa całą tę historię (polecenie tmux „wyczyść historię”).

Nie jest tak przyjemny jak jednoprzyciskowe kombinacje terminala, iTerma lub Konsoli, aby je usunąć, ale jest to świat lepszy niż ciągłe wpisywanie czystej historii.

juanpaco
źródło
15
Miły. Robiłem bind k send-keys "clear"\; send-keys "Enter"część usuwania, ale korzystanie z wbudowanego ctrl+ljest prostsze, a clear-historypozbywanie się historii przewijania jest dobrym dodatkiem.
Henrik N
1
to wiązanie zepsuło moje panele, usuwając cały tekst ze wszystkich paneli i usuwając otaczające je ramki! Jakieś pomysły na to, co jest grane?
Ian Vaughan
Yikes. Jakiego programu powłoki używasz? Czy przez przypadek zdefiniowano już jakieś zachowanie dla Ctrl + K?
juanpaco
iTerm2. Właśnie zobaczyłem, że ctrl + k już to robi bez zestawu wiązania tmux, więc musi to być mapowanie iTerm2.
Ian Vaughan
Dziwne. Używam również iTerm2. Nie aktualizowałem go przez jakiś czas, więc może to być różnica wersji. Nie używam już również Ck, ponieważ spowodowało to problemy z moimi powiązaniami vima. Teraz używam Cn.
juanpaco
58

Jak poprawnie stwierdził @juanpaco, clear-historyjest to polecenie wyczyszczenia bufora przewijania.
Dodam, że chcę również wyczyścić zawartość ekranu za pomocą tego samego polecenia. Wydawanie send-keys -Rresetuje (czyści) ekran, więc używam następujących w moim.tmux.conf

bind-key b send-keys -R \; clear-history

Spowoduje to wyczyszczenie ekranu ORAZ bufora przewijania.

z5h
źródło
1
Bezpośrednio z dokumentacji tmux na send-keys: „Flaga -R powoduje zresetowanie stanu terminala.” Prawdopodobnie musisz tylko zaktualizować.
z5h
20
Wadą użycia -R jest to, że twoja bieżąca linia wejściowa zostaje ukryta, inaczej niż po wyczyszczeniu terminala za pomocą Ctrl + l. To, co zrobiłem, tobind -n C-l send-keys C-l \; clear-history
volpato,
6
Dla tych z was, którzy nie wiedzą (jak ja nie), aby przejść do stanu, aby wprowadzić clear-historypolecenie, naciśnij Ctrl+B, a następnie uruchom polecenie za pomocą dwukropka ( :).
palswim
1
@ volpato Podoba mi się twoje podejście, ale wydaje mi się, że wciąż pozostawia jeden „ekran” bufora w przewijanym wstecz. Nie mam pojęcia dlaczego. -R wykasowuje monit, ale „rozwiązałem” go przez dodanie dodatkowego Cm na końcu (ale to umieszcza go w drugiej linii).
Gdogg
2
Możesz to skondensować send-keys -R C-l \; clear-history.
ivan,
35

Każda odpowiedź tutaj mówi o dodawaniu nowych powiązań klawiszy.

Jeśli chcesz to zrobić od czasu do czasu, wcale nie potrzebujesz mapowania ...

Prefiks ma wartość domyślną <Ctrl-b>

Po prostu wpisz <prefix>:odpowiedni panel, a następnie wpisz clear-historyi naciśnij klawisz Enter.

Jedną z fajnych rzeczy w tmux jest to, że możesz po prostu uruchomić dowolne z takich poleceń ... lub uruchomić je w powłoce / skrypcie tak jak tmux command... lub utworzyć dla nich skrót klawiaturowy.

JonnyRaa
źródło
8
Możliwe jest wpisanie pierwszych trzech znaków cle, a następnie autouzupełnianie za <tab>pierwszym razem, a następnie za drugim razem, <up arrow>aby uzyskać dostęp do poprzedniego wpisu. W ten sposób jest dość szybki.
bct
1
To nie działa dla mnie, ponieważ kiedy zaczynam pisać po naciśnięciu <Ctrl-b> the klawisza c, jest ustawione, aby utworzyć nowe okno.
fraxture
@fraxture Myślę, że źle zrozumiałeś - po naciśnięciu klawisza <Ctrl-b>, a następnie naciśnięciu :wyświetla interaktywny monit - w tym miejscu można wpisać „c”
JonnyRaa
21

Jeśli chcesz połączyć CTRL-Lplus przejrzystą historię, dodaj to do ~/.tmux.conf:

bind u send-keys C-l \; run-shell "sleep .3s" \; clear-history

Działa to nawet, jeśli jesteś na przykład w powłoce MySQL.

plu
źródło
1
Wydaje się, że to nie działa podczas, powiedzmy tail -f some.log, prawda? Czy można to ctrl-Zz tym połączyć ? Wygląda na to, że wszystko działa poprawnie.
Aaron Gibralter
19

Zauważyłem, że jestem send-keys -Rtrochę powolny - oto inny sposób na wyczyszczenie ekranu i historii za pomocą jednego polecenia

bind-key C send-keys "clear && tmux clear-history" \; send-keys "Enter"  

Zagnieżdżone wywołanie tmux jest używane jako bardziej oczywiste

bind-key C send-keys "clear" \; send-keys "Enter" \; clear-history

nie usuwa bieżącego tekstu z ekranu z historii - polecenie wyczyść historię wydaje się działać w osobnym wątku do kluczy wysyłania.

klatka433
źródło
5
jest jedno zastrzeżenie dotyczące tego podejścia i polega ono na tym, że działa ono tylko na lokalnych powłokach, ponieważ wysyła tmux clear-history jako ciąg znaków do zapisania w aktywnym okienku. Dostosowałem go do:bind-key E send-keys "C-k" \; send-keys "C-u" \; send-keys "clear" \; send-keys "Enter" \; run-shell "sleep .3s; tmux clear-history"
Santi P.,
12

O wiele prostsze niż większość, właśnie utworzyłem skrypt powłoki o nazwie clsi uruchamiam go za każdym razem, gdy chcę wyczyścić ekran i bufor przewijania.

Wszystko to jest to:

cls

clear;
tmux clear-history;
Brad Parks
źródło
3
Ale co, jeśli nie masz dostępu do wiersza poleceń. Na przykład, gdy serwer jest uruchomiony i oglądasz dzienniki.
zudduz
skąd oglądasz dzienniki? Przez serwer WWW? Jeśli tak, to nie rozumiem, dlaczego Tmux jest zaangażowany?
Brad Parks
1
Miło jest móc jednocześnie oglądać dzienniki serwera i edytor vim.
zudduz
Czy używasz podziałów Tmux? Jeśli nie, po prostu podziel okno na 2 i przeglądaj swoje dzienniki w jednym, a używaj vima w drugim, po prostu uruchamiając `tmux split" w sesji tmux ... Ale może nie rozumiem, co robisz?
Brad Parks,
10

Stwierdzono, że działa to najlepiej w TMUX 2.6, czyszcząc ekran, przewijając, ale utrzymując monit wyświetlany po.

Używa Ctrl-L

bind-key -n C-l send-keys C-l \; send-keys -R \; clear-history
ideasman42
źródło
6

Ctrl-L jest używany w aplikacjach konsolowych do przerysowywania ekranu. Odkryłem, że po związaniu z send-keys -Rnim klawisze strzałek przestałyby działać poprawnie w niektórych aplikacjach (np. Vim, mc).

Aby zachować funkcję przerysowywania w aplikacjach konsolowych, użyłem:

bind-key -n C-l if-shell -F '#{alternate_on}' 'send-keys C-l' 'send-keys -R C-l; clear-history'

Wymaga to włączenia opcji tmux alternate-screen(która jest domyślnie).

Phil
źródło
3

Użyłem niektórych z powyższych oraz innych źródeł, aby wymyślić:

bind k send-keys C-u \; send-keys C-k \; send-keys " clear && tmux clear-history" \; send-keys "Enter" \; run-shell "sleep .3s" \; send-keys "Up" \; send-keys C-u 

Wiodąca spacja w „clear && tmux clear-history” zapobiega zapisywaniu polecenia w pliku historii (pod warunkiem, że masz konfigurację powłoki do traktowania wiodących spacji w ten sposób; google „hist ignoruje spację” + nazwa twojej powłoki, aby uzyskać więcej informacje). Lubię, aby to polecenie nie wyświetlało się w mojej historii, ponieważ jest ono bardziej zgodne z ctrl-k w terminalu.

Pierwsze klucze wysyłania Cu i klucze wysyłania Ck wyczyszczą wszystko, co jest aktualnie wpisane w wierszu polecenia, aby upewnić się, że „wyczyść & & tmux wyczyść historię” powiodło się (np. Jeśli wpisałeś „ABCDEFG” w wierszu polecenia i masz kursor między literą D i literą E zapewnia to, że „ABCD clear && tmux clear-historyEFG” nie zostanie wysłane do powłoki, co by się nie udało.

Klawisze wysyłania „W górę” i ostatnie klucze wysyłania Cu usuwają ostatnie elementy z wewnętrznej historii muszli. Nawet w przypadku wspomnianej wyżej spacji wewnętrznej historia powłoki zawiera linię „wyczyść ...”. Wysyłanie i Ctrl-u się tego pozbywa.

Na koniec w iTerm ustawiam ctrl-k na mapowanie na ctrl-a k (mam mój prefiks tmux ustawiony na ctrl-a), więc mogę wpisać ctrl-k, co moje ręce chcą robić po tylu latach pracy więc. Robię to, przechodząc do iTerm> Preferencje> Profile> Klucze i dodając skrót, aby wysłać kod szesnastkowy „0x01 0x6B”. Jest tutaj świetny artykuł, który zawiera więcej informacji na temat używania kodów szesnastkowych z tmux i iTerm: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

To prawie daje mi ctrl-k z tmux. Jedyną rzeczą, która wciąż mnie trochę wkurza jest to, że prawdziwy ctrl-k bez tmuxa nie ma problemów, jeśli aktualnie masz coś wpisanego w linii poleceń i zachowa to, co napisałeś podczas czyszczenia ekranu. Jak wspomniano, takie podejście musi wyczyścić wpisane słowa, aby polecenie „wyczyść ...” nie zawiodło. Ale jest cholernie blisko!

Brett
źródło
2

Dlaczego nie? bind -n C-l send-keys C-l

klebervirgilio
źródło
Chciałbym też wiedzieć, czy nie ma powodu, aby tego nie polecać.
Gaston Sanchez
2
Po pierwsze, nie jest to konieczne: w -n C-lzasadzie mówi „złap to”, a następnie natychmiast przekazujesz to samo. (tj. jest to brak możliwości.)… Po drugie, twoje zamiary są wyłączone, ponieważ ⌃Lusuwa ekran , a nie przewijanie wstecz: jeśli naciśniesz, ⌃B [a następnie przewiniesz w górę, zobaczysz, że całe przewijanie jest nadal nagrywane; Celem tego pytania jest jasne , że przewijania (tmux) nie jest widoczny terminal.
ELLIOTTCABLE,
2

Po wielu badaniach i spędzaniu czasu. Znalazłem najlepszy sposób dla mnie na zsh i terminal.app

Używam prefix-cdo czyszczenia ekranu i prefix-Cdo czyszczenia historii i bufora przewijania i nie zostawiam żadnych linii powyżej, ponieważ uważam to za irytujące.

Bez Vima

# clear screen
bind c send-keys 'C-l'
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys

Z Vimem

# check if the pane is running vim
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"

# clear screen
bind c if-shell "$is_vim" "send-keys c" "send-keys 'C-l'"
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys
Rahul Katariya
źródło
2

Aby szybko naprawić wyczyszczenie poszczególnych paneli tmux, możesz ustawić alias ...

# Tmux Clear pane
alias tc='clear; tmux clear-history; clear'
Paul Hale
źródło
1

Tak więc od jakiegoś czasu stosuję podejście plu z góry , ale mam już dość jego ograniczeń (w zasadzie ⌃Lprzejście przez to nie ma znaczenia, chyba że zostanie przekazane do programu, który to rozumie.)

Poprawiłem różne podejścia w różnych odpowiedziach na ten wątek; chociaż złożone, to podejście działa zarówno z powłokami, jak i innymi poleceniami :

# ⌃K: Clears the current pane (from <https://stackoverflow.com/a/34162098>)
bind-key -n C-k \
   if-shell "test \"$(printf '#{pane_current_command}' | tail -c 2)\" = sh" \
      "send-keys C-l ; run-shell 'sleep .3s' ; clear-history" \
      "split-window -vp 100 ; clear-history -t ! ; kill-pane"

Spróbuj z tym tail -f /private/var/log/system.logczy coś!


Ostrzeżenia:

Jest tu jedna ważna uwaga: jest to niewidocznie zmiana rozmiaru usuwanego okienka, jeśli nie jest to powłoka. Może to wyzwalać zmianę rozmiaru w niektórych aplikacjach wiersza poleceń nasłuchujących SIGWINCHes; ale moje rozumowanie jest to, że nie jest to duży problem, ponieważ są to programy jesteś bardzo prawdopodobne, nie będzie próbował „jasne” i tak .

Ponadto sytuacja cytowania powłoki jest już bałaganem i może łatwo stać się jednym z nich podczas osadzania #{pane_current_command}, więc bądź ostrożny, być może będziesz musiał to zmodyfikować w zależności od default-commandustawień.

To samo dotyczy testowania końca dopasowania tego polecenia "sh"; jeśli masz default-commandcoś podobnego /bin/bash --loginlub coś skomplikowanego exec, rzeczywiste polecenie może się nie kończyć "sh"; użyj, ⌃B :aby wykonać, display-message '#{pane_current_command}'jeśli chcesz zobaczyć, na czym polega testowanie.

ELLIOTTCABLE
źródło