Bagaimana saya bisa menghapus buffer scrollback di Tmux?

Jawaban:

211

Pertanyaan yang sama ini telah mengganggu saya selama beberapa waktu. Inilah yang terbaik yang saya hasilkan. Masukkan ini ke file .tmux.conf Anda:

bind -n C-k clear-history

Ini mengikat ctrl-k ke perintah tmux clear-history. The -n setelah bind membuatnya jadi Anda tidak perlu mengeluarkan awalan perintah tmux (ctrl-b secara default). Saya menggunakan bash, jadi ctrl-l sudah melakukan yang setara dengan mengetik "clear" di baris perintah. Dengan dua tombol ini saya mendapatkan kombinasi ctrl-l, ctrl-k yang bagus, yang memindahkan semua buffer gulir dari layar ("hapus") dan kemudian menghapus semua riwayat itu (perintah tmux "hapus-riwayat").

Ini tidak sebagus kombo 1-kunci Terminal, iTerm, atau Konsole untuk membersihkannya, tapi ini adalah dunia yang lebih baik daripada mengetikkan sejarah yang jelas sepanjang waktu.

juanpaco
sumber
15
Bagus. Saya sudah melakukan bind k send-keys "clear"\; send-keys "Enter"bagian kliring, tetapi menggunakan built-in ctrl+llebih sederhana, dan clear-historyuntuk menyingkirkan riwayat scrollback adalah tambahan yang bagus.
Henrik N
1
ini mengikat sekrup panel saya ke atas, menghapus semua teks dari semua panel dan menghapus perbatasan di sekitar mereka! Ada ide tentang apa dengan itu?
Ian Vaughan
Astaga. Program shell apa yang Anda gunakan? Apakah secara kebetulan sudah ada beberapa perilaku yang didefinisikan untuk ctrl + k?
juanpaco
iTerm2. Baru saja melihat bahwa ctrl + k sudah melakukan ini tanpa set binding tmux, jadi itu pasti pemetaan iTerm2.
Ian Vaughan
Aneh. Saya menggunakan iTerm2 juga. Saya belum memperbaruinya untuk beberapa waktu, jadi mungkin ada perbedaan versi. Saya juga tidak menggunakan Ck lagi, karena itu menyebabkan masalah dengan binding vim saya. Saya menggunakan Cn sekarang.
juanpaco
58

Seperti yang dinyatakan dengan benar @ juanpaco, clear-historyadalah perintah untuk menghapus buffer scrollback.
Saya akan menambahkan bahwa saya juga ingin menghapus apa yang ada di layar dalam perintah yang sama. Menerbitkan send-keys -Rulang (membersihkan) layar, jadi saya menggunakan yang berikut ini di.tmux.conf

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

Ini membersihkan layar DAN buffer scrollback.

z5h
sumber
1
Langsung dari dokumentasi tmux pada send-keys: "Bendera -R menyebabkan status terminal diatur ulang." Anda mungkin hanya perlu memperbarui.
z5h
20
Kelemahan menggunakan -R adalah input-line Anda saat ini tersembunyi, berbeda dari ketika Anda membersihkan terminal Anda dengan Ctrl + l. Apa yang saya lakukan adalahbind -n C-l send-keys C-l \; clear-history
volpato
6
Bagi Anda yang tidak tahu (seperti saya tidak tahu), untuk tiba di negara bagian untuk memasukkan clear-historyperintah, tekan Ctrl+B, lalu mulai perintah dengan titik dua ( :).
palswim
1
@volpato Saya suka pendekatan Anda, tetapi saya merasa masih menyisakan satu 'layar' dari buffer di gulir kembali. Tidak tahu kenapa. -R mengosongkan prompt, tapi saya 'menyelesaikannya' dengan menambahkan Cm ekstra di akhir (tapi kemudian menempatkannya di baris kedua).
Gdogg
2
Anda dapat menyingkat ini menjadi send-keys -R C-l \; clear-history.
ivan
35

Setiap jawaban di sini berbicara tentang menambahkan ikatan kunci baru.

Jika Anda hanya ingin melakukannya sesekali Anda tidak perlu pemetaan sama sekali ...

Awalan default ke <Ctrl-b>

Cukup ketik <prefix>:panel yang relevan dan kemudian ketik clear-historydan tekan enter.

Salah satu hal keren tentang tmux adalah Anda bisa menjalankan perintah seperti itu ... atau menjalankannya di shell / membuat skrip seperti tmux command... atau membuat pintasan keyboard untuknya.

JonnyRaa
sumber
8
Dimungkinkan untuk mengetik tiga karakter pertama cle, dan kemudian autocomplete dengan <tab>pada saat pertama, kemudian pada kedua kalinya digunakan <up arrow>untuk mengakses entri sebelumnya. Cara ini cukup cepat.
bct
1
Ini tidak berfungsi untuk saya karena ketika saya mulai mengetik setelah menekan <Ctrl-b> the tombol c` diatur untuk membuat jendela baru.
Kelemahan
@frase Saya pikir Anda salah paham - setelah Anda menekan <Ctrl-b> lalu tekan :itu memberi Anda prompt interaktif - di situlah Anda akan mengetikkan 'c'
JonnyRaa
21

Jika Anda ingin menggabungkan CTRL-Lplus riwayat yang jelas, tambahkan ini ke ~/.tmux.conf:

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

Ini bahkan berfungsi jika Anda berada di shell MySQL misalnya.

plu
sumber
1
Ini sepertinya tidak berfungsi selama, katakanlah tail -f some.log, kan? Apakah ada cara untuk menggabungkan ctrl-Zini? Tampaknya bisa melakukannya dengan benar.
Aaron Gibralter
19

Saya menemukan menggunakan send-keys -Rsedikit lambat - di sini ada cara lain untuk menghapus layar dan sejarah dengan satu perintah

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

Panggilan tmux bersarang digunakan sebagai yang lebih jelas

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

gagal menghapus teks layar saat ini dari histori - perintah clear-history tampaknya dijalankan di utas terpisah untuk mengirim-kunci.

cage433
sumber
5
ada satu peringatan dengan pendekatan ini dan itu hanya berfungsi pada shell lokal, karena mengirimkan tmux clear-history sebagai string untuk dituliskan ke panel aktif. Saya telah mengadaptasinya ke: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

Jauh lebih sederhana daripada kebanyakan, saya baru saja membuat skrip shell bernama cls, dan menjalankannya setiap kali saya ingin menghapus layar saya dan buffer scrollback.

Semua ini adalah ini:

cls

clear;
tmux clear-history;
Taman Brad
sumber
3
Tetapi bagaimana jika Anda tidak memiliki akses ke baris perintah. Seperti ketika server sedang berjalan dan Anda sedang menonton log.
zudduz
dari mana Anda akan menonton log? Melalui server web? Jika demikian, maka saya tidak mengerti mengapa tmux terlibat?
Brad Parks
1
Sangat menyenangkan untuk dapat menonton log server dan editor vim Anda secara bersamaan.
zudduz
Apakah Anda menggunakan splits tmux? Jika tidak, cukup bagi jendela Anda menjadi 2, dan lihat log Anda di satu, dan gunakan vim di yang lain dengan hanya menjalankan `tmux split" di dalam sesi tmux Anda ... Tapi mungkin saya tidak mendapatkan apa yang Anda lakukan?
Brad Parks
10

Menemukan ini bekerja paling baik di TMUX 2.6, membersihkan layar, scrollback, tetapi menjaga prompt ditampilkan setelah.

Gunakan Ctrl-L

bind-key -n C-l send-keys C-l \; send-keys -R \; clear-history
gagasanman42
sumber
6

Ctrl-L digunakan dalam aplikasi konsol untuk menggambar ulang layar. Saya menemukan bahwa ketika terikatsend-keys -R akan menyebabkan tombol panah tidak lagi berfungsi dengan benar di beberapa aplikasi (misalnya vim, mc).

Untuk mempertahankan fungsi redraw di aplikasi konsol, saya menggunakan:

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

Ini mengharuskan opsi tmux alternate-screendiaktifkan (yang secara default).

Phil
sumber
3

Saya telah menggunakan beberapa sumber di atas ditambah sumber-sumber lain untuk menghasilkan:

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 

Ruang terdepan dalam "clear && tmux clear-history" mencegah perintah agar tidak ditulis ke file histori (asalkan Anda memiliki pengaturan shell untuk memperlakukan spasi terdepan dengan cara ini; google "hist diabaikan ruang" + nama shell Anda untuk lebih info). Saya suka perintah ini tidak muncul dalam riwayat saya karena ini lebih sesuai dengan ctrl-k di Terminal.

Tombol kirim pertama Cu dan tombol kirim Ck akan menghapus apa pun yang saat ini diketik di prompt untuk memastikan "clear && tmux clear-history" berhasil (misalnya, jika Anda mengetik "ABCDEFG" di prompt dan memiliki kursor Anda antara D dan E, ini memastikan bahwa "ABCD clear && tmux clear-historyEFG" tidak dikirim ke shell, yang akan gagal).

Tombol kirim "Atas" dan tombol kirim terakhir Cu menghapus item terakhir dari riwayat internal cangkang Anda. Bahkan dengan spasi tambahan yang disebutkan di atas, riwayat internal shell akan menyertakan baris "clear ...". Mengirim dan Ctrl-u menghilangkan ini.

Terakhir, di iTerm saya mengatur ctrl-k untuk memetakan ke ctrl-a k (saya memiliki awalan tmux saya diatur ke ctrl-a), jadi saya bisa mengetikkan ctrl-k yang merupakan apa yang ingin dilakukan tangan saya selama bertahun-tahun melakukan begitu. Saya melakukan ini, dengan masuk ke iTerm> Preferences> Profiles> Keys dan menambahkan pintasan untuk mengirim kode hex "0x01 0x6B". Ada artikel bagus di sini yang memberikan informasi lebih lanjut tentang penggunaan kode hex dengan tmux dan iTerm: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Cukup banyak memberi saya ctrl-k dengan tmux. Satu-satunya hal yang masih agak mengganggu saya adalah bahwa ctrl-k nyata tanpa tmux tidak memiliki masalah jika saat ini Anda memiliki sesuatu yang diketik di prompt dan akan mempertahankan apa yang Anda ketikkan saat membersihkan layar. Seperti yang disebutkan, pendekatan ini perlu menghapus apa yang diketik sehingga perintah "hapus ..." tidak gagal. Tapi itu sangat dekat!

Brett
sumber
2

kenapa tidak? bind -n C-l send-keys C-l

klebervirgilio
sumber
Saya juga ingin tahu jika ada alasan untuk tidak merekomendasikan ini.
Gaston Sanchez
2
Pertama-tama, itu tidak perlu: -n C-lpada dasarnya mengatakan 'tangkap ini', dan kemudian Anda segera melewati hal yang sama. (Yaitu ini adalah no-op.) ... Kedua, niat Anda tidak aktif, karena ⌃Lmembersihkan layar , bukan scroll kembali: jika Anda menekan ⌃B [dan kemudian menggulir ke atas, Anda akan melihat bahwa semua scrollback masih direkam; tujuan dari pertanyaan ini adalah untuk menghapus bahwa scrollback (tmux ini), tidak terminal terlihat.
ELLIOTTCABLE
2

Setelah banyak penelitian dan menghabiskan waktu. Saya telah menemukan cara terbaik untuk saya di zsh dan terminal.app

Saya menggunakan prefix-cuntuk menghapus layar dan prefix-Cuntuk menghapus histori dan buffer gulir dan tidak meninggalkan garis di atas karena saya merasa menjengkelkan.

Tanpa Vim

# 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

Dengan Vim

# 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
sumber
2

Untuk perbaikan cepat untuk menghapus panel tmux individual, Anda dapat mengatur alias ...

# Tmux Clear pane
alias tc='clear; tmux clear-history; clear'
Paul Hale
sumber
1

Jadi, saya sudah menggunakan pendekatan plu dari atas untuk sementara waktu, tapi saya muak dengan keterbatasannya (pada dasarnya, ⌃Lmelewati itu tidak ada artinya kecuali disalurkan ke program yang memahaminya.)

Jadi saya telah memperbaiki berbagai pendekatan dalam jawaban berbeda untuk utas ini; Meskipun rumit, pendekatan ini berfungsi dengan shell dan perintah lainnya :

# ⌃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"

Cobalah tail -f /private/var/log/system.log atau apalah!


Peringatan:

Ada satu catatan penting di sini: ini secara tidak terlihat mengubah ukuran panel yang sedang dibersihkan, jika itu bukan shell. Ini dapat memicu mengubah ukuran perilaku di beberapa aplikasi baris perintah mendengarkan untuk SIGWINCHes; tapi alasan saya adalah bahwa ini bukan masalah besar, karena mereka adalah program yang Anda sangat mungkin tidak akan mencoba untuk 'jelas' pula .

Selain itu, situasi shell-quoting sudah berantakan, dan dapat dengan mudah menjadi lebih dari satu ketika menanamkan #{pane_current_command}, jadi berhati-hatilah, Anda mungkin harus memodifikasi ini berdasarkan default-commandpengaturan Anda .

Hal yang sama berlaku untuk pengujian saya pada akhir dari pencocokan perintah itu "sh"; jika Anda memiliki default-commandsesuatu seperti /bin/bash --loginatau sesuatu yang rumit yang melibatkan exec, perintah yang sebenarnya mungkin tidak berakhir dengan "sh"; gunakan ⌃B :untuk mengeksekusi display-message '#{pane_current_command}'jika Anda ingin melihat apa yang sedang diuji terhadap.

DAPAT DILAKUKAN
sumber