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.

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.


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.)


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.


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.

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)


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.


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'                        
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.