tmux i praksis: scrollback-buffer

Forskellen mellem terminal- og tmux-scrollback-buffere, og hvordan man tilpasser kopitilstand, rulle og musevalg af tmux-opførsel.

Dette er 3. del af min tmux i praksis artikelserie.

Normalt implementerer terminalemulatorer scrollback-buffer, så du kan udforske tidligere output, når den bevæger sig ude af syne. tmux, som andre fuldskærmsterminalapplikationer som vim, kører i såkaldt alternativ skærmbuffer i en overordnet terminal. Alternativ buffer har nøjagtige dimensioner for bredde og højde som fysisk vinduesstørrelse.

Der er flere effekter ved at bruge alternativ buffer:

  • Ethvert output, der overstiger den synlige del af den alternative buffer, går tabt. Så snart linjer går ud af syne, går de tabt. For at forhindre tab af historie implementerer tmux sin egen “indre” scrollback-buffer. Konsekvensen af ​​dette er, at du ikke kan arbejde med tmux indre scrollback, som du normalt gør inden for din terminal.
  • Enhver produktion, der produceres inde i tmux (det samme gælder for vim, nano, mand, mindre osv.) Spildes ikke ind i den ydre terminals scrollback-historie. Når du lukker din app i fuld skærm, kommer du tilbage til den samme tilstand, da du startede appen og ser ikke output fra inde i appen mere.

I praksis, hvis du bliver vant til at rulle tilbage ved hjælp af ⌘↑i din iTerm, og hvis du vil gøre det samme inden for kørende tmux-session, vil du styre og rulle den ydre iTerms tilbageførselsbuffer, snarere end tmuxens indre tilbageførselsbuffer.

Løsningen er at bruge tmux-specifikke kontroller til at få adgang til sin egen scrollback-buffer: Ctrl-bderefter [at gå ind i kopitilstand, bruge Down/Uppile eller PageDownog PageUptaster qeller Enterat afslutte kopitilstand.

Nogle mennesker, der finder dette irriterende - konfigurer tmux scrollback-buffer, så de kan vises i den overordnede terminal scrollback-buffer - så de bare kan bruge velkendte rulningskontroller. Se dette indlæg. Denne løsning er dog begrænset til kun at have tmux-session med 1 vindue og 1 rude. Og når du afmonterer / lukker en tmux-session, forældres terminalen med tmux-vindues output.

Personligt bruger jeg tmux scrollback uden hacks ovenfor, men finjuster konfigurationen for at være mere venlig og velkendt.

Først og fremmest kan jeg ikke lide prefix,[at gå ind i kopitilstand. Jeg har vænnet mig til ⌘↑at begynde at rulle i iTerm, og jeg har tilføjet følgende rodtastebinding:

# trigger copy mode bybind -n M-Up copy-mode

Når du er i kopitilstand, kan du fortsætte med at trykke for M-Upat rulle 1 linje op. Det sædvanlige PageDownog PageUpkontrolelementerne er tilgængelige for at rulle efter hele skærmen og ekstra M-PageDownog M-PageUptil at rulle med halvdelen af ​​skærmen (virkelig praktisk).

# Scroll up/down by 1 line, half screen, whole screenbind -T copy-mode-vi M-Up send-keys -X scroll-upbind -T copy-mode-vi M-Down send-keys -X scroll-downbind -T copy-mode-vi M-PageUp send-keys -X halfpage-upbind -T copy-mode-vi M-PageDown send-keys -X halfpage-downbind -T copy-mode-vi PageDown send-keys -X page-downbind -T copy-mode-vi PageUp send-keys -X page-up

Desuden, selv når jeg er inde i tmux-session, kan jeg stadig fortsætte med at bruge ⌘↑og ⌘↓til at kontrollere den indre tmux scrollback-buffer, snarere end iTerms. Det er muligt ved hjælp af brugerdefineret iTerm-profil med nogle tastebindinger tilsidesat for at udløse tmux-handlinger. Så ⌘↑presset på iTerm sender bare M-Uptastetryk til tmux-session.

Læs min tidligere del af “tmux i praksis” -serien for flere detaljer: tmux i praksis: iTerm2 og tmux-integration.

En anden tmux-standard, som jeg foretrækker at ændre, er musens hjulrulle. Det ruller med 5 rækker, hvilket føles som et stort spring. Lad os reducere det for at rulle med 2 rækker:

# When scrolling with mouse wheel, reduce number of scrolled rows per tick to "2" (default is 5)
bind -T copy-mode-vi WheelUpPane select-pane \; send-keys -X -N 2 scroll-upbind -T copy-mode-vi WheelDownPane select-pane \; send-keys -X -N 2 scroll-down

Lad os nu tale om kopiering af tekst, når du er i kopitilstand. Jeg vænner mig til at kopiere tekst ved hjælp af musen. Lad os aktivere musesupport:

set -g mouse on

Når du vælger tekst med musen i tmux, kopieres den som standard til buffer, og du er straks droppet ud af kopitilstanden. Din aktuelle rulleposition nulstilles ved slutningen af ​​output, og du sættes i en kommandopromptilstand. Lad os se dette i aktion:

Som du bemærker, sparker det mig ud af kopitilstand hver gang jeg vælger tekst med musen. Det er virkelig irriterende. Normalt når jeg sidder fast med en eller anden opgave, har jeg en tendens til at vælge en eller anden tekst her eller der bare for at meditere (det hjælper mig med at fokusere på?). Eller du vil måske bare vælge en tekst, der skal fremhæves for din kollega, der sidder ved siden af ​​dig.

Så lad os tilpasse dette. Vi ønsker ikke at blive sparket fra kopitilstanden. Vi ønsker ikke, at markeringen ryddes på musens træk-slutbegivenhed. Tekst fra markeringen kan kopieres med venstre museklik bagefter.

# Do not copy selection and cancel copy mode on drag end event# Prefer iTerm style selection: select, then mouse click to copy to bufferunbind -T copy-mode-vi MouseDragEnd1Panebind -T copy-mode-vi MouseDown1Pane select-pane \;\ send-keys -X copy-pipe "pbcopy" \;\ send-keys -X clear-selection

Lad os tjekke resultatet:

For at få adgang til kopibufferelementerne og indsætte det nyeste element skal du bruge C-pog p:

bind p paste-bufferbind C-p choose-buffer

Det er det i dag. Bliv hængende. I den næste del af "tmux i praksis" -serien vil vi tale om udklipsholderintegration, og hvordan man deler tekst kopieret inde i tmux med systemudklipsholderen (både lokalt og når man arbejder eksternt, på OSX og Linux).

BTW, du kan se alle disse konfigurationstilpasninger i aktion, bare tjek min tmux-config repo.

Trick

Hvis du vil omgå tmux-kopitilstand helt og vælge tekst via iTerm, skal du bare holde nede pt> key while dragging you mouse.

Resources and links

shell — What exactly is scrollback and scrollback buffer? — Unix & Linux Stack Exchange — //unix.stackexchange.com/questions/145050/what-exactly-is-scrollback-and-scrollback-buffer

tmux scrollback with iTerm2 • dan.carley.co — //dan.carley.co/blog/2013/01/11/tmux-scrollback-with-iterm2/

tmux copy mouse selected text to clipboard automatically on mouse release — Stack Overflow — //stackoverflow.com/questions/36815879/tmux-copy-mouse-selected-text-to-clipboard-automatically-on-mouse-release

keyboard shortcuts — tmux — scroll up/down with shift + page up/down into a pane — Super User — //superuser.com/questions/702189/tmux-scroll-up-down-with-shift-page-up-down-into-a-pane

[question/request] copy-mode without automatically selecting a pane? · Issue #1021 · tmux/tmux — //github.com/tmux/tmux/issues/1021

ssh — Leaving tmux scrollback in terminal (iTerm2) — Stack Overflow — //stackoverflow.com/questions/12865559/leaving-tmux-scrollback-in-terminal-iterm2

command line — Use terminal scrollbar with tmux — Super User — //superuser.com/questions/310251/use-terminal-scrollbar-with-tmux