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-b
derefter [
at gå ind i kopitilstand, bruge Down/Up
pile eller PageDown
og PageUp
taster q
eller Enter
at 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-Up
at rulle 1 linje op. Det sædvanlige PageDown
og PageUp
kontrolelementerne er tilgængelige for at rulle efter hele skærmen og ekstra M-PageDown
og M-PageUp
til 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-Up
tastetryk 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-p
og 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
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