Hoe kan ik de scrollback-buffer in Tmux wissen?

Ter info, ik gebruik Tmux via de Mac OS X Terminal-app.


Antwoord 1, autoriteit 100%

Deze zelfde vraag houdt me al een tijdje bezig. Hier is het beste dat ik heb bedacht. Zet dit in je .tmux.conf-bestand:

bind -n C-k clear-history

Dit bindt ctrl-k aan het tmux clear-history commando. De -n na bind zorgt ervoor dat u het tmux-opdrachtvoorvoegsel niet hoeft uit te geven (standaard ctrl-b). Ik gebruik bash, dus ctrl-l doet al het equivalent van het typen van “clear” op de opdrachtregel. Met deze twee toetsen krijg ik een mooie ctrl-l, ctrl-k combo, die alle scrollbuffer van het scherm verwijdert (de “clear”) en dan al die geschiedenis verwijdert (de tmux “clear-history”-opdracht).

Het is niet zo mooi als de 1-toetscombinaties van Terminal, iTerm of Konsole om het op te ruimen, maar het is een wereld beter dan de hele tijd duidelijke geschiedenis in te typen.


Antwoord 2, autoriteit 29%

Elk antwoord hier gaat over het toevoegen van nieuwe sneltoetsen.

Als je het af en toe wilt doen, heb je helemaal geen mapping nodig…

Voorvoegsel is standaard <Ctrl-b>

Typ gewoon <prefix>+ :in het relevante deelvenster en typ vervolgens clear-historyen druk op enter.

Als u zich op de opdrachtregel bevindt, kunt u voor hetzelfde effect tmux clear-historyuitvoeren in het betreffende paneel.

Een van de leuke dingen van tmux is dat je elk van de commando’s op die manier kunt uitvoeren… of ze in een shell/script kunt uitvoeren zoals tmux command… of een sneltoets voor hen.


Antwoord 3, autoriteit 25%

Zoals @juanpaco correct vermeldt, is clear-historyhet commando om de scrollback-buffer te wissen.
Ik voeg eraan toe dat ik ook graag wil wissen wat er op het scherm staat in dezelfde opdracht.
Het uitgeven van een send-keys -Rreset (wist) het scherm, dus ik gebruik het volgende in mijn .tmux.conf

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

Hiermee worden het scherm EN de terugrolbuffer leeggemaakt.


Antwoord 4, autoriteit 9%

Als je CTRL-Lplus clear-history wilt combineren, voeg je dit toe aan je ~/.tmux.conf:

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

Dit werkt zelfs als je bijvoorbeeld in een MySQL-shell zit.


Antwoord 5, autoriteit 9%

Ik vond het gebruik van send-keys -Reen beetje traag – hier is een andere manier om het scherm en de geschiedenis te wissen met een enkele opdracht

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

Een geneste tmux-aanroep wordt gebruikt als de meer voor de hand liggende

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

kan nietde huidige tekst van het scherm uit de geschiedenis wissen – de opdracht clear-history lijkt in een aparte thread te worden uitgevoerd om de sleutels te verzenden.


Antwoord 6, autoriteit 6%

Veel eenvoudiger dan de meeste, ik heb zojuist een shellscript gemaakt met de naam cls, en voer het uit wanneer ik mijn scherm en de scrollback-buffer wil wissen.

Het is alleen dit:

cls

clear;
tmux clear-history;

Antwoord 7, autoriteit 6%

Gevonden dat dit het beste werkt in TMUX 2.6, het scherm leegmaken, terugbladeren, maar de prompt daarna behouden.

Gebruikt Ctrl-L

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

Antwoord 8, autoriteit 3%

Ctrl-L wordt gebruikt in consoletoepassingen om het scherm opnieuw te tekenen. Ik ontdekte dat wanneer gebonden aan send-keys -Rdit ertoe zou leiden dat de pijltjestoetsen niet langer correct werken in sommige toepassingen (bijv. vim, mc).

Om de functionaliteit voor opnieuw tekenen in console-applicaties te behouden, gebruikte ik:

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

Hiervoor moet de tmux-optie alternate-screenzijn ingeschakeld (wat standaard het geval is).


Antwoord 9

Ik heb een aantal van de bovenstaande plus andere bronnen gebruikt om te bedenken:

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 

De voorloopspatie in ” clear && tmux clear-history” voorkomt dat de opdracht naar het geschiedenisbestand wordt geschreven (op voorwaarde dat u uw shell-setup hebt om voorloopspaties op deze manier te behandelen; google “hist negeer spatie” + de naam van je shell voor meer info). Ik wil dat dit commando niet in mijn geschiedenis wordt weergegeven, omdat dit meer in lijn is met ctrl-k in de Terminal.

De eerste verzendsleutels Cu en verzendsleutels Ck zullen alles wissen wat momenteel is getypt bij de prompt om ervoor te zorgen dat de ” clear && tmux clear-history” succesvol is (bijv. als u “ABCDEFG” heeft getypt ” bij de prompt en plaats je cursor tussen de D en de E, dit zorgt ervoor dat “ABCD clear && tmux clear-historyEFG” niet naar de shell wordt gestuurd, wat zou mislukken).

De verzendsleutels “Omhoog” en de laatste verzendsleutels C-u wissen de laatste items uit de interne geschiedenis van uw shells. Zelfs met de hierboven genoemde volgruimte zal de interne geschiedenis van de shell de regel ” clear …” bevatten. Verzenden en Ctrl-u lost dit op.

Ten slotte stel ik in iTerm ctrl-k in om toe te wijzen aan ctrl-a k (ik heb mijn tmux-prefix ingesteld op ctrl-a), dus ik kan ctrl-k typen, wat mijn handen willen doen van zoveel jaren doen. Dit doe ik door naar iTerm > Voorkeuren > Profielen > Toetsen en het toevoegen van een snelkoppeling om de hexadecimale code “0x01 0x6B” te verzenden. Er is hier een geweldig artikel dat meer informatie geeft over het gebruik van hex-codes met tmux en iTerm: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Dat geeft me min of meer ctrl-k met tmux. Het enige dat me nog steeds een beetje stoort, is dat de echte ctrl-k zonder tmux geen problemen heeft als je momenteel iets achter de prompt hebt getypt en zal behouden wat je hebt getypt terwijl je het scherm leegmaakt. Zoals vermeld, moet deze benadering wissen wat er is getypt, zodat de opdracht ” wissen …” niet mislukt. Maar het is verdomd dichtbij!


Antwoord 10

Voor een snelle oplossing om afzonderlijke tmux-vensters te wissen, kunt u een alias instellen…

# Tmux Clear pane
alias tc='clear; tmux clear-history; clear'

Antwoord 11

Dus ik gebruik plu‘s benadering van bovenafvoor een tijdje, maar ik kreeg genoeg van de beperkingen ervan (eigenlijk de ⌃Ldoorgegeven is zinloos tenzij doorgesluisd naar een programma dat het begrijpt.)

Dus ik heb de verschillende benaderingen in verschillende antwoorden op deze thread verbeterd; hoewel complex, werkt deze aanpak met beide shells enandere commando’s:

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

Probeer het met tail -f /private/var/log/system.logof zoiets!


Voorbehoud:

Er is hier één belangrijke opmerking: dit is het onzichtbaar verkleinenvan het paneel dat wordt gewist, als het geen shell is. Dit kan leiden tot het aanpassen van de grootte in sommige opdrachtregelprogramma’s die luisteren naar SIGWINCHes; maar mijn redenering is dat dit geen groot probleem is, want dat zijn programma’s die je zeer waarschijnlijk niet gaat proberen om hoe dan ookte ‘clearen’.

Bovendien is de shell-quoting-situatie al een puinhoop en kan gemakkelijk meervan één worden bij het insluiten van #{pane_current_command}, dus wees voorzichtig, je kunt moet dit wijzigen op basis van uw default-commandinstelling.

Hetzelfde geldt voor mijn testen van het einde van dat commando dat overeenkomt met "sh"; als je een default-commandhebt van iets als /bin/bash --loginof iets ingewikkelds met exec, het actual commando mag niet eindigen op "sh"; gebruik ⌃B :om display-message '#{pane_current_command}'uit te voeren als je wilt zien waartegen wordt getest.


Antwoord 12

Na veel onderzoek en tijd doorbrengen. Ik heb de beste manier voor mij gevonden op zsh en terminal.app

Ik gebruik prefix-Com het scherm te wissen en prefix-Com de geschiedenis en de schuifbuffer te wissen en laat geen regels boven omdat ik het vervelend vind.

Zonder 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

Met 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

Antwoord 13

waarom niet? bind -n C-l send-keys C-l


Antwoord 14

als je je scherm leegmaakt met clear, kun je controleren of TMUXis ingesteld en dienovereenkomstig een alias maken.

zet dit in je .bashrc:

if [[ $TMUX ]]; then
  alias clear='clear && tmux clear-history'
fi

Antwoord 15

Als u een volledig paneel wilt wissen, is een andere optie om het paneel tijdelijk te verkleinen tot één regel, de geschiedenis te wissen en het formaat vervolgens weer te wijzigen. Dit zou mogelijk flikkervrij moeten werken met één tmux-commandoketen. Het voordeel is dat het werkt, ongeacht welk programma in het paneel wordt uitgevoerd. Dit maakt de logica van het shellscript natuurlijk een beetje ingewikkelder.

bind-key -n F11 run "
    if [[ #{window_panes} == "1" ]] ; then
        tmux send-keys C-l; sleep 0.1 ; tmux clear-history ;
    else
        restored_height=$((#{pane_height} + #{pane_at_bottom}));
        tmux resize-pane -y 1 \\; clear-history \\; resize-pane -y \${restored_height} ;
    fi
"

Other episodes