Tmux'da geri kaydırma arabelleğini nasıl temizleyebilirim?


Yanıtlar:


211

Aynı soru oldukça uzun süredir beni rahatsız ediyor. İşte en iyi bulduğum. Bunu .tmux.conf dosyanıza koyun:

bind -n C-k clear-history

Bu, ctrl-k'yi tmux clear-history komutuna bağlar. -N after bind bunu yapar, böylece tmux komut önekini (varsayılan olarak ctrl-b) vermenize gerek kalmaz. Ben bash kullanıyorum, bu yüzden ctrl-l zaten komut satırında "clear" yazmanın eşdeğerini yapıyor. Bu iki tuşla güzel bir ctrl-l, ctrl-k combo'yu alıyorum.

Terminal, iTerm veya Konsole'nın 1 tuşlu komboları temizlemek için o kadar güzel değil, ama her zaman açık bir tarih yazmaktan daha iyi bir dünya.


15
Güzel. Ben bind k send-keys "clear"\; send-keys "Enter"temizleme kısmı için yapıyorum , ama yerleşik kullanmak ctrl+ldaha basit ve clear-historykaydırma geçmişinden kurtulmak için iyi bir ektir.
Henrik N

1
bu ciltleme bölmelerimi vidalar, tüm bölmelerdeki tüm metni kaldırır ve etraflarındaki kenarlıkları kaldırır! Bununla ilgili bir fikrin var mı?
Ian Vaughan

Amanın. Hangi kabuk programını kullanıyorsunuz? Şans eseri zaten ctrl + k için tanımlanmış bir davranışa sahip mi?
juanpaco

iTerm2. Sadece ctrl + k'nin tmux bağlama seti olmadan bunu yaptığını gördüm, bu yüzden bir iTerm2 eşlemesi olmalı.
Ian Vaughan

Tuhaf. Ben de iTerm2 kullanıyorum. Bir süredir güncellemedim, bu yüzden bir sürüm farkı olabilir. Artık Ck kullanmıyorum, çünkü bu benim vim bağlarımda sorunlara neden oldu. Şimdi Cn kullanıyorum.
juanpaco

58

@Juanpaco doğru şekilde belirtildiği gibi, clear-historygeri kaydırma arabelleğini temizleme komutudur.
Aynı komutta ekranda ne olduğunu temizlemeyi sevdiğimi de ekleyeceğim. Bir Düzenleyen send-keys -RBen aşağıdaki kullanmak, böylece sıfırlanır (temizler) ekranını benim.tmux.conf

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

Bu, ekranı VE aşağı kaydırma arabelleğini temizler.


1
Doğrudan tmux belgelerinden send-keys: "-R bayrağı terminal durumunun sıfırlanmasına neden olur." Muhtemelen güncellemeniz gerekiyor.
z5h

20
-R kullanmanın dezavantajı, mevcut giriş hattınızın, Ctrl + l ile terminalinizi temizlediğinizden farklı olarak gizli hale gelmesidir. Yaptığım şeybind -n C-l send-keys C-l \; clear-history
volpato

6
Bilmeyenler (bilmediğim gibi) için, clear-historykomuta girmek üzere duruma gelmek için tuşuna basın Ctrl+Bve ardından iki nokta üst üste ( :) ile komutu başlatın .
palswim

1
@volpato Yaklaşmanızı seviyorum, ama yine de geri kaydırmada tamponun bir 'ekranını' bıraktığını görüyorum. Neden olduğu hakkında bir fikrim yok. -R komut istemini kapatır, ancak sonunda ekstra bir Cm ekleyerek 'çözdüm' (ancak daha sonra ikinci satıra koyar).
Gdogg

2
Bunu yoğunlaştırabilirsiniz send-keys -R C-l \; clear-history.
ivan

35

Buradaki her cevap yeni anahtar bağlar eklemekten bahsediyor.

Sadece ara sıra yapmak istiyorsanız, bir haritaya ihtiyacınız yok ...

Önek varsayılan olarak <Ctrl-b>

Sadece yazın <prefix>:, ilgili bölmesinde ve sonra yazın clear-historyve enter tuşuna basın.

Tmux ile ilgili harika şeylerden biri, bu tür komutları herhangi bir şekilde çalıştırabilmeniz ... veya bunları bir kabukta / komut dosyasında çalıştırabilmeniz ... veya onlar tmux commandiçin bir klavye kısayolu yapabilmenizdir.


8
İlk üç karakteri yazmak cleve sonra <tab>ilk kez otomatik olarak tamamlamak , daha sonra ikinci <up arrow>girişte bir önceki girişe erişmek için kullanmak mümkündür . Bu şekilde oldukça hızlı.
bct

1
Bu benim için çalışmıyor çünkü <Ctrl-b> the c` tuşuna bastıktan sonra yazmaya başladığımda yeni bir pencere oluşturmak için ayarlanmış.
fraxture

@fraxture Yanlış anladığınızı düşünüyorum - <Ctrl-b> tuşuna bastıktan sonra :size interaktif bir bilgi istemi veriyor - 'c'
yazacağınız yer

21

CTRL-LArtı açık geçmişi birleştirmek istiyorsanız , bunu aşağıdakilere ekleyin ~/.tmux.conf:

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

Bu, örneğin bir MySQL kabuğundaysanız bile çalışır.


1
Diyelim ki bu işe yaramıyor tail -f some.log, değil mi? Bununla birleştirmenin bir yolu var mı ctrl-Z? Doğru gibi görünebilir.
Aaron Gibralter

19

send-keys -RBiraz yavaş kullandığımı gördüm - işte ekranı ve geçmişi tek bir komutla temizlemenin başka bir yolu

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

İç içe bir tmux çağrısı daha belirgin olarak kullanılır

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

başarısız geçmişinden ekranının mevcut metni temizlemek için - açık-tarih komut gönderme-tuşlara ayrı bir konu çalıştırmak için görünür.


5
bu yaklaşımda bir uyarı var ve bu sadece yerel kabuklarda çalışıyor, çünkü tmux'un açık geçmişini aktif panele yazılmak üzere dize olarak gönderiyor. Ben adapte ettik: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

Çok daha basit, ben sadece denilen bir kabuk komut dosyası oluşturdum clsve ekran ve kaydırma arabelleği temizlemek istediğinizde çalıştırın.

Hepsi bu:

cls

clear;
tmux clear-history;

3
Ancak komut satırına erişiminiz yoksa ne olur? Bir sunucu çalışırken ve günlükleri izlediğinizde olduğu gibi.
zudduz

günlükleri nereden izliyorsunuz? Bir web sunucusu üzerinden mi? Eğer öyleyse, o zaman neden tmux'un dahil olduğunu anlamıyorum?
Brad Parks

1
Sunucu günlüklerini ve vim düzenleyicinizi aynı anda izleyebilmek güzel.
zudduz

Tmux splits kullanıyor musunuz? Değilse, sadece pencerenizi 2'ye bölün ve günlüklerinizi birinde görüntüleyin ve diğerinde sadece tmux oturumunuzda `` tmux split '' çalıştırarak vim kullanın ... Ama belki ne yaptığınızı almıyorum?
Brad Parks

10

Bunun en iyi TMUX 2.6'da çalıştığını, ekranı temizlediğini, geri kaydırdığını, ancak daha sonra görüntülenen istemi koruduğunu gördük.

Ctrl-L kullanır

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

6

Ctrl-L konsol uygulamalarında ekranı yeniden çizmek için kullanılır. send-keys -RBağlandığımda bazı uygulamalarda (örneğin vim, mc) ok tuşlarının artık düzgün çalışmamasına neden olacağını buldum .

Konsol uygulamalarında yeniden çizim işlevini korumak için şunları kullandım:

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

Bu, tmux seçeneğinin açık olmasını gerektirir alternate-screen(varsayılan olarak budur).


3

Yukarıdakilerden bazılarını ve diğer kaynakları kullandım:

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 

"Clear && tmux clear-history" içindeki lider alan, komutun geçmiş dosyasına yazılmasını önler (önde gelen boşlukları bu şekilde işlemek için kabuk kurulumunuza sahip olmanızı sağlar; google "hist alanı yoksay" + daha fazla bilgi için kabuğunuzun adı bilgi). Terminalde ctrl-k ile daha satır içi olduğundan, bu komutun geçmişimde görünmemesini istiyorum.

İlk gönderme anahtarları Cu ve gönderme anahtarları Ck, "temizle && tmux açık geçmişi" nin başarılı olmasını sağlamak için istemde şu anda yazılanları temizler (örneğin, istemde "ABCDEFG" yazıp imleciniz D ve E arasındayken, "ABCD clear && tmux clear-historyEFG" öğesinin kabuğa gönderilmemesini sağlar, bu da başarısız olur).

Gönderme tuşları "Yukarı" ve son gönderme tuşları Cu, kabuklarınızın dahili geçmişindeki son öğeleri temizler. Yukarıda belirtilen arka boşlukta bile kabuğun iç geçmişi "açık ..." çizgisini içerecektir. Göndermek ve Ctrl-u bundan kurtulur.

Son olarak, iTerm'de ctrl-k'yi ctrl-a k ile eşleştirmek için ayarladım (tmux önekimi ctrl-a olarak ayarladım), bu yüzden ctrl-k yazabilirim. yani. Bunu, iTerm> Tercihler> Profiller> Tuşlar'a giderek ve onaltılı kodu "0x01 0x6B" göndermek için bir kısayol ekleyerek yaparım. Burada tmux ve iTerm ile hex kodları kullanma hakkında daha fazla bilgi veren harika bir makale var: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Bu bana tmux ile ctrl-k veriyor. Bana hala nags gibi tek şey, şu anda komut isteminde yazılan bir şey varsa ve ekranı temizlerken yazdıklarınızı koruyacaksa, tmux olmadan gerçek ctrl-k sorun yaşamıyor olmasıdır. Belirtildiği gibi, bu yaklaşımın yazılanları temizlemesi gerekir, böylece "temizle ..." komutu başarısız olmaz. Ama çok yakın!


2

neden olmasın? bind -n C-l send-keys C-l


Bunu tavsiye etmek için bir neden varsa bana da bilmek istiyorum.
Gaston Sanchez

2
Her şeyden önce, bu gerekli değildir: -n C-ltemelde 'bunu yakala' der ve sonra hemen aynı şeyi geçirirsiniz. (yani bu bir işlem değildir.)… İkincisi, niyetiniz kapalı, çünkü ekranı geri kaydırmak değil, ekranı⌃L temizler : vurur ve sonra yukarı kaydırırsanız, tüm geri kaydırmanın hala kaydedildiğini görürsünüz; Bu sorunun amacı temizlemek için o (tmux en) scrollback, görünmez terminali. ⌃B [
ELLIOTTCABLE

2

Yani, kullanarak oldum PLU yaklaşımını yukarıdan bir süre, ama ben beslenen-up bunların sınırlamalar var (temelde, ⌃Lgeçirilmiş borulu sürece bunu anlayan bir programa anlamsızdır.)

Bu yüzden bu konuya farklı cevaplarda çeşitli yaklaşımlar geliştirdim; Karmaşık rağmen, bu yaklaşım ile çalışır hem kabukları ve diğer komutlar :

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

Deneyin tail -f /private/var/log/system.logya da bir şey!


Uyarılar:

Burada önemli bir not var: bu, kabuk değilse, temizlenen bölmenin görünmez bir şekilde yeniden boyutlandırılmasıdır . Bu, SIGWINCHes dinleyen bazı komut satırı uygulamalarında yeniden boyutlandırma davranışını tetikleyebilir ; ama benim akıl yürütmem bu büyük bir sorun değil, çünkü bunlar zaten 'temizlemeye' çalışamayacağınız programlar .

Buna ek olarak, kabuk alıntı durumu zaten bir karışıklıktır ve gömme sırasında kolayca bir tane daha olabilir #{pane_current_command}, bu yüzden dikkatli olun, bunu default-commandayarınıza göre değiştirmeniz gerekebilir .

Aynı şey, bu komut eşleşmesinin sonunu test etmem için de geçerlidir "sh"; Eğer default-commandbuna benzer /bin/bash --loginveya karmaşık bir şey varsa exec, gerçek komut bitmeyebilir "sh"; neye karşı test edildiğini görmek istiyorsanız ⌃B :yürütmek için kullanın display-message '#{pane_current_command}'.


2

Çok fazla araştırma ve zaman harcadıktan sonra. Zsh ve terminal.app'de benim için en iyi yolu buldum

Ben kullanıyorum prefix-cekranı temizlemek için ve prefix-Cgeçmişini temizlemek için ve tampon kaydırma ve bunu rahatsız edici buluyorum, çünkü yukarıda hiçbir çizgiler bırakarak.

Vim olmadan

# 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

Vim ile

# 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

2

Bireysel tmux panellerini temizlemek için hızlı bir düzeltme için bir takma ad oluşturabilirsiniz ...

# Tmux Clear pane
alias tc='clear; tmux clear-history; clear'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.