Zapisz wszystkie przewijanie tmux do pliku

194

Jak mogę zapisać wszystkie przewijanie w sesji tmux do pliku?

capture-panel może pobrać bieżący ekran, ale nie cały przewijany ekran.

David Wolever
źródło

Odpowiedzi:

52

Zależy to od wartości history-limit, którą ustawiłeś w .tmux.conf- domyślną wartością jest 2000; jeśli chcesz uchwycić więcej, musisz jawnie ustawić liczbę linii.

Aby przechwycić całe przewijanie, przejdź do trybu kopiowania, zaznacz całe przewijanie i przeciągnij go do bufora, a następnie wklej do pliku.

To, jak to zrobisz, będzie zależeć od mode-keyspreferowanej opcji, vi lub emacsa. man tmuxma pomocną tabelę opisującą odpowiednie klucze.

Mam następujące .tmux.confuproszczenia:

unbind [
bind Escape copy-mode
unbind p
bind p paste-buffer
bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection

Proces przechwytywania pełnego przewijania jest wtedy następujący:

PrefixEsc : aby wejść w tryb kopiowania

v : aby rozpocząć selekcję wizualną (zakładając, że jesteś już na dole ekranu)

gg : aby uchwycić wszystko w przewijaniu

y : wciąga go do bufora

Prefixc : otwórz kolejne okno Tmux

vim scrollback.txt

i : wejdź w tryb wstawiania w vimie

Prefixp : wklej do pliku

Tutaj znajduje się również odpowiedź opisująca sposób kopiowania bufora do pliku tymczasowego,xsel który może być przydatny.

jasonwryan
źródło
2
Jest to w najlepszym razie problematyczne ... wklejenie w trybie wstawiania w Vimie ma wiele problemów, np. Gdy masz włączone automatyczne wcięcie. Nigdy nie udało mi się tego osiągnąć.
Konrad Rudolph
13
Jeśli używasz :set pastew vimie, vim zignoruje dodawanie automatycznych wcięć lub wszelkich skrótów klawiszowych opartych na wstawkach.
wtorek,
@tlunter nice tip!
jasonwryan
Czy można to zrobić za pomocą domyślnych przypisań klawiszy?
daveloyall
@daveloyall Oczywiście, po prostu nie używaj opcji skrótów klawiszowych, które zawarłem z mojego .tmux.conf...
jasonwryan
224

Dla tych, którzy szukają prostej odpowiedzi, po prostu użyj prefix+ :, a następnie wpisz capture-pane -S -3000+ return(Zamień na 3000dowolną liczbę wierszy, które chcesz zapisać). Spowoduje to skopiowanie tych linii do bufora.

Następnie, aby zapisać bufor w pliku, po prostu ponownie użyj prefix+ :i wpisz save-buffer filename.txt+ return, zastępując filenameto, co chcesz.

(Domyślnie prefixjest ctrl + b.)

Sos McBoss
źródło
14
save-buffer filename.txtwydaje się zapisywać plik w /, a nie w pwd(bieżący katalog). Zamiast tego
podałem
15
i nie zapominaj, że MINUS przed <<kwota-linii-bufora-linii-ty-chcesz-zaoszczędzić>>
Yordan Georgiev
9
To najlepsza odpowiedź tutaj. Dziękuję bardzo.
Jesse Atkinson
7
Tak, wygrywasz. To powinna być najlepsza odpowiedź.
wordsforthewise
1
+ n> 1 Po zalogowaniu się do głosowania wydaje się, że jest to co najmniej drugi raz, gdy ta odpowiedź była dla mnie pomocna. XD
L0j1k
159

W tmux 1.5 capture-panepolecenie akceptuje -Si -Eokreśla linie początkową i końcową przechwytywania; wartości ujemnych można użyć do określenia wierszy z historii. Gdy masz już dane w buforze, możesz je zapisać za pomocą save-buffer.

Oto przykładowe powiązanie (odpowiednie dla .tmux.conf), które otacza wszystko pytaniem o nazwę pliku:

bind-key P command-prompt -p 'save history to filename:' -I '~/tmux.history' 'capture-pane -S -32768 ; save-buffer %1 ; delete-buffer'

Przechwytuje (do) 32768 linii historii plus aktualnie wyświetlane linie. Począwszy od tmux 1.6, możesz używać liczb do INT_MIN, jeśli twój panel ma historię głębszą niż linie 32Ki (zwykle do linii 2Gi). Począwszy od tmux 2.0, możesz używać słowa capture-pane -S -„zacząć od początku historii” (tj. Nie ma dużej, zakodowanej na stałe liczby ujemnej).


Uwaga: Liczba wierszy w zapisanym pliku nie zawsze będzie równa limitowi historii panelu plus jego wysokości.

Gdy bufor historii panelu jest pełny, tmux odrzuca najstarsze 10% linii zamiast odrzucać tylko jedną linię. Oznacza to, że efektywna głębokość historii panelu może czasami wynosić nawet 90% skonfigurowanego limitu.

Chris Johnsen
źródło
1
Prawdopodobnie używasz Tmux 1.3; prawdopodobnie możesz użyć tmux server-info | head -1swojej wersji. tmux -Vdziała w tmux * 1.4 i nowszych.
Chris Johnsen,
1
Jest to zdecydowanie jedno z najbardziej użytecznych poleceń tmux, jakie znalazłem.
kenny,
1
A jeśli jesteś już w oknie tmux i nie chcesz zrestartować, po prostu zrób a, [PrefixKey] : aby dostać się do linii poleceń tmux, a następnie wklej całą linię, a następnie po prostu zrób [Prefix] P to, jest to duże P i możesz już iść.
Ali,
1
@BradenBest Przedrostek SI musi być dołączony do urządzenia. Ani „32Ki”, ani „32K” nie są prawidłowe. Niemniej jednak, wielkie litery K nie są przedrostkami SI. Świetna robota po stronie pedałów zamieszania i pomyłki.
Aleksandr Dubinsky
1
@BradenBest przedrostków binarnych siać zamieszanie, ponieważ 1 MB wykorzystywane do mieć dokładne znaczenie, ale teraz ma dwa znaczenia. Co gorsza, przecinek dziesiętny jest bezużyteczny dla branży IT, z wyjątkiem producentów pamięci masowych, którzy używają go do fałszywego marketingu. To zamieszanie zostało zapoczątkowane przez pedantów, którzy odmówili praktyczności. Jeśli sam nie jesteś pedantem, przepraszam za ton i zachęcam do ponownego rozważenia entuzjazmu dla binarnych prefiksów.
Aleksandr Dubinsky
19

Miałem standardowe powiązania klawiszy, które wyglądały nieco inaczej niż w odpowiedzi @ jasonwryan i nie zmieniłem niczego w konfiguracji.

Poniżej znajduje się przepis, który dla mnie zadziałał. Może przyda ci się, jeśli nie chcesz dokonywać żadnych zmian w konfiguracji tmux i po prostu chcesz szybko skopiować część przewijania.

Prefix== Ctrl+bw moim tmux (tmux 1.6, debian 7).

  1. Wejdź w tryb wyboru: Prefix+ [.
  2. Zacznij wybór: Space.
  3. Podświetl potrzebny tekst za pomocą nawigacji vim (na przykład użyj klawiszy strzałek lub naciśnij, ggaby przejść do historii wyjściowej).
  4. Właściwie skopiuj do wewnętrznego schowka za pomocą Enter. Nastąpi wyjście z trybu kopiowania.
  5. Otwórz dowolny plik za pomocą vima (prawdopodobnie na nowej karcie tmux) i wklej skopiowaną zawartość przed użyciem Prefix+ ].
  6. Następnie możesz zrobić cat tego pliku lub użyć danych wyjściowych, jak potrzebujesz.
Alex
źródło
man tmux pomógł mi ustalić, że mój tmux był w trybie emacs, więc żadne z powyższych przypisań klawiszy nie zadziałało. man tmux ponownie pomógł mi ustalić, czego użyć. Ale największym błędem, jaki popełniłem, było to, że host, z którego zapisałem zawartość, nie był hostem, z którego uruchomiłem tmux, więc szukałem zapisanego pliku na niewłaściwym hoście ...
Cognitiaclaeves,
16

Jeśli chcesz coś, co możesz uruchomić z wiersza poleceń (zamiast używać kluczy prefiksu tmux), spróbuj uruchomić:

tmux capture-pane -pS -1000000

Jeśli go uruchomisz i wydaje się, że nic nie robi, to dlatego, że wyświetla dokładnie to, co było na ekranie, więc wygląda tak samo.

Oczywiście możesz również potokować go do pliku:

tmux capture-pane -pS -1000000 > file.out

Zobacz tmuxstronę podręcznika i szukaj capture-panewięcej rzeczy, które możesz zrobić (na przykład przechwytuj sekwencje specjalne na wypadek, gdybyś chciał zachować kolor, lub określ, czy chcesz połączyć wiele linii wizualnych, gdy nie zawierają one nowej linii)

Christopher Shroba
źródło
1
Jest to bardzo pomocne, zwłaszcza że zaakceptowana odpowiedź już nie działa.
piojo
4

To jest naprawdę bardzo łatwe. Wejdź do trybu poleceń, naciskając prefix keynastępnie :. Następnie wykonaj capture-pane -S -<line number you want to dump> następniesave-buffer <filepath>

Ten plik zawiera wszystkie dane wyjściowe przewijania. Następnie powinieneś usunąć bufor ze względów bezpieczeństwa.

Wang
źródło
1

Jak mogę zapisać wszystkie przewijanie w sesji tmux do pliku?

Używam tego w moim ~ / .tmux.conf , a teraz kiedy wychodzę z działającej powłoki, dane wyjściowe panelu są zapisywane w unikalnym pliku dziennika:

set -g remain-on-exit
set-hook pane-died 'capture-pane -S - -E - ; save-buffer "$HOME/logs/tmux/tmux-saved.#{host_short}-#{session_id}:#{window_id}:#{pane_id}-#{pane_pid}-#{client_activity}.log"; delete-buffer; kill-pane'                        
użytkownik2688272
źródło