Tulis semua tmux scrollback ke file

194

Bagaimana saya bisa menulis semua scrollback di sesi tmux ke file?

capture-panel dapat mengambil layar saat ini, tetapi tidak seluruh scrollback.

David Wolever
sumber

Jawaban:

52

Ini tergantung pada nilai history-limityang telah Anda atur di Anda .tmux.conf- standarnya adalah 2000; jika Anda ingin menangkap lebih banyak, Anda harus menetapkan jumlah garis secara eksplisit.

Untuk menangkap seluruh scrollback, masuk ke mode salin, pilih seluruh scrollback, dan tarik ke dalam buffer, lalu rekatkan ke file Anda.

Bagaimana Anda mencapainya akan tergantung pada mode-keysopsi yang Anda inginkan, vi atau emacs. man tmuxmemiliki tabel yang membantu menjelaskan kunci masing-masing.

Saya memiliki yang berikut ini .tmux.confuntuk menyederhanakan ini:

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

Maka proses untuk menangkap scrollback penuh adalah:

PrefixEsc : untuk masuk ke mode salin

v : untuk memulai pemilihan visual (dengan asumsi Anda sudah berada di bagian bawah layar)

gg : untuk menangkap semua yang ada di scrollback

y : untuk menariknya ke dalam buffer

Prefixc : buka jendela tmux lain

vim scrollback.txt

i : masuk ke mode insert di vim

Prefixp : rekatkan ke file

Ada juga jawaban di sini yang menjelaskan cara menyalin buffer ke file sementara menggunakanxsel yang mungkin berguna.

jasonwryan
sumber
2
Ini paling bermasalah ... menempel ke mode insert di Vim memiliki semua jenis masalah, misalnya ketika Anda memiliki lekukan otomatis diaktifkan. Saya tidak pernah mendapatkan ini bekerja untuk kepuasan saya.
Konrad Rudolph
13
Jika Anda menggunakan :set pastedalam vim, vim akan mengabaikan menambahkan lekukan otomatis atau ikatan kunci berbasis insert.
tlunter
@tlunter tip yang bagus!
jasonwryan
Bisakah ini dilakukan dengan binding kunci default?
daveloyall
@daveloyall Tentu saja, jangan gunakan opsi keybind yang saya sertakan dari .tmux.conf...
jasonwryan
224

Bagi mereka yang mencari jawaban sederhana, cukup gunakan prefix+ :, lalu ketikkan capture-pane -S -3000+ return(Ganti 3000dengan banyak baris yang ingin Anda simpan.) Ini menyalin garis-garis itu ke dalam buffer.

Kemudian, untuk menyimpan buffer ke file, cukup gunakan prefix+ :lagi, dan ketik save-buffer filename.txt+ return, ganti filenamedengan apa pun yang Anda inginkan.

(Secara default prefixadalah ctrl + b.)

Saus McBoss
sumber
14
save-buffer filename.txttampaknya menyimpan file dalam /, bukan di pwd(direktori saat ini). Sebagai gantinya, saya memberikan path file absolut dan itu bekerja seperti pesona
MohamedEzz
15
dan jangan lupa MINUS di depan <<jumlah-of-buffer-lines-you-want-to-save>>
Yordan Georgiev
9
Ini jawaban terbaik di sini. Terima kasih banyak.
Jesse Atkinson
7
Ya, kamu menang. Ini harus menjadi jawaban teratas.
kata
1
+ n> 1 Setelah masuk untuk meningkatkan suara, akan muncul ini setidaknya kali kedua jawaban ini membantu saya. XD
L0j1k
159

Dengan tmux 1.5, capture-paneperintah menerima -Sdan -Emenentukan garis awal dan akhir dari tangkapan; nilai negatif dapat digunakan untuk menentukan baris dari histori. Setelah Anda memiliki data dalam buffer, Anda dapat menyimpannya dengan save-buffer.

Berikut adalah contoh pengikatan (cocok untuk .tmux.conf) yang membungkus semuanya dengan prompt untuk nama file:

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

Ini menangkap (hingga) 32768 baris riwayat plus garis yang saat ini ditampilkan. Dimulai dengan tmux 1.6, Anda bisa menggunakan angka ke INT_MIN jika panel Anda memiliki riwayat yang lebih dalam dari 32Ki baris (biasanya hingga 2Gi baris). Mulai di tmux 2.0, Anda bisa menggunakan yang capture-pane -S -berarti "mulai pada awal sejarah" (yaitu tidak ada angka negatif yang besar dan sulit dikodekan).


Catatan: Jumlah baris dalam file yang disimpan tidak akan selalu sama dengan batas riwayat panel plus tingginya.

Saat buffer riwayat panel penuh, tmux membuang 10% baris tertua alih-alih membuang hanya satu baris. Ini berarti kedalaman sejarah panel efektif kadang-kadang akan serendah 90% dari batas yang dikonfigurasi.

Chris Johnsen
sumber
1
Anda mungkin menjalankan tmux 1.3; Anda mungkin dapat menggunakan tmux server-info | head -1untuk melihat versi Anda. tmux -Vbekerja di tmux * 1.4 dan yang lebih baru.
Chris Johnsen
1
Sejauh ini, ini adalah salah satu perintah tmux paling berguna yang saya temukan.
kenny
1
Dan jika Anda sudah di jendela tmux Anda dan tidak ingin memulai kembali lakukan saja [PrefixKey] : untuk sampai ke baris perintah tmux, dan kemudian tempelkan seluruh baris, maka Anda hanya melakukan [Prefix] P itu adalah modal P dan Anda baik untuk pergi.
Ali
1
@BradenBest Awalan SI harus dilampirkan ke unit. Baik "32Ki" atau "32K" tidak valid. Nevermind bahwa huruf besar K bukan awalan SI. Pekerjaan yang bagus berada di sisi para pedant yang kebingungan menabur dan melakukan kesalahan.
Aleksandr Dubinsky
1
@BradenBest Awalan biner menabur kebingungan karena 1 MB dulu memiliki makna yang tepat, tetapi sekarang memiliki dua arti. Lebih buruk lagi, makna desimal tidak berguna bagi industri TI, kecuali untuk produsen penyimpanan yang menggunakannya untuk pemasaran palsu. Kebingungan ini dimulai oleh para pedant yang menolak untuk bersikap praktis. Jika Anda sendiri tidak begitu ahli, maka saya minta maaf atas nada suara saya dan mendesak Anda untuk mempertimbangkan kembali antusiasme Anda untuk awalan biner.
Aleksandr Dubinsky
19

Saya punya binding kunci standar yang tampaknya sedikit berbeda dari jawaban @ jasonwryan dan tidak mengubah apa pun dalam konfigurasi.

Di bawah ini adalah resep yang bekerja untuk saya. Mungkin Anda akan merasakan manfaatnya jika Anda tidak ingin membuat perubahan dalam konfigurasi tmux dan hanya ingin dengan cepat menyalin beberapa scrollback.

Prefix== Ctrl+bdi tmux saya (tmux 1.6, debian 7).

  1. Masuk ke mode pilih: Prefix+ [.
  2. Mulai seleksi: Space.
  3. Sorot teks yang diperlukan menggunakan navigasi vim (misalnya, gunakan tombol panah atau tekan gguntuk mencapai awal riwayat keluaran).
  4. Sebenarnya salin menggunakan clipboard internal Enter. Anda akan keluar dari mode salin.
  5. Buka file apa pun menggunakan vim (mungkin pada tab tmux baru) dan rekatkan konten yang Anda salin sebelum menggunakan Prefix+ ].
  6. Maka Anda dapat melakukan cat dari file itu atau menggunakan output yang Anda butuhkan.
Alex
sumber
man tmux membantu saya untuk memilah-milah bahwa tmux saya dalam mode emacs, sehingga tidak ada ikatan kunci di atas yang berfungsi. man tmux, sekali lagi, membantu saya memilah apa yang harus digunakan. Tetapi kesalahan terbesar yang saya buat adalah bahwa host yang saya simpan isinya bukan host yang saya jalankan tmux, jadi saya terus mencari file yang disimpan pada host yang salah ...
Cognitiaclaeves
16

Jika Anda menginginkan sesuatu yang dapat Anda jalankan dari baris perintah (alih-alih menggunakan kunci awalan tmux Anda), coba jalankan:

tmux capture-pane -pS -1000000

Jika Anda menjalankannya dan sepertinya tidak melakukan apa-apa, itu karena mengeluarkan apa yang ada di layar Anda, sehingga terlihat sama.

Tentu saja, Anda juga dapat menyalurkannya ke file:

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

Lihat tmuxhalaman manual dan cari capture-panelebih banyak hal yang dapat Anda lakukan (seperti menangkap urutan pelarian jika Anda ingin mempertahankan warna, atau tentukan apakah Anda ingin beberapa garis visual digabungkan ketika tidak berisi garis baru)

Christopher Shroba
sumber
1
Ini sangat membantu, terutama karena jawaban yang diterima tidak lagi berfungsi.
piojo
4

Ini sebenarnya sangat mudah. Masuk ke mode perintah dengan menekan prefix keylalu :. Kemudian lakukan capture-pane -S -<line number you want to dump> kemudiansave-buffer <filepath>

File itu berisi semua output scrollback. Anda harus menghapus buffer setelahnya untuk alasan keamanan.

Wang
sumber
1

Bagaimana saya bisa menulis semua scrollback di sesi tmux ke file?

Saya menggunakan ini di ~ / .tmux.conf saya , dan sekarang ketika saya keluar dari shell saya yang sedang berjalan, output pane disimpan ke file log unik:

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'                        
pengguna2688272
sumber