tmux на практика: буфер за превъртане

Разликата между буферите за превъртане на терминала и tmux и как да промените режима на копиране, превъртане и избор на мишка за поведение на tmux.

Това е 3-та част от моя tmux в поредицата статии на практика.

Обикновено терминалните емулатори реализират буфер за превъртане, така че можете да изследвате минали резултати, когато те се изнесат от погледа. tmux, подобно на други приложения на цял екран за терминали като vim, работи в така наречения алтернативен буфер на екрана на родителски терминал. Алтернативният буфер има точни размери на ширината и височината като физически размер на прозореца.

Има няколко ефекта от използването на алтернативен буфер:

  • Всеки изход, който надвишава видимата част на алтернативния буфер, се губи. Веднага щом линиите излязат извън полезрението, те се губят. За да предотврати загубата на история, tmux прилага свой собствен „вътрешен“ буфер за превъртане. Последицата от това е, че не можете да работите с tmux вътрешно превъртане, както обикновено в рамките на вашия терминал.
  • Всеки изход, произведен в tmux (същото важи и за vim, nano, man, less и т.н.), не се разпространява в историята на превъртане на външния терминал. Когато затворите приложението си на цял екран, вие се връщате в същото състояние, когато стартирате приложението и вече не виждате изход от приложението.

На практика, ако свикнете да превъртате обратно с помощта ⌘↑на вашия iTerm и ако ще правите същото в рамките на изпълняващата сесия tmux, ще контролирате и превъртате буфера за превъртане на външния iTerm, вместо вътрешния буфер за превъртане на tmux.

Решението е да се използват специфични за tmux контроли за достъп до собствения буфер за превъртане: Ctrl-bслед това [за влизане в режим на копиране, използване на Down/Upстрелки или PageDownи PageUpклавиши qили Enterза изход от режим на копиране.

Някои хора, които намират това за досадно - конфигурират tmux буфер за превъртане, за да им бъде позволено да се показват в буфера за превъртане на родителския терминал - за да могат просто да използват познати контроли за превъртане. Вижте тази публикация. Това решение обаче е ограничено до tmux сесия само с 1 прозорец и 1 панел. И когато отделите / затворите сесия на tmux, родителският терминал е замърсен с изхода на прозореца на tmux.

Лично аз използвам tmux превъртане без хакове по-горе, но настройвам конфигурацията му, за да бъде по-приятелски и познат.

На първо място, не обичам prefix,[да влизам в режим на копиране. Аз съм свикнал да ⌘↑да започне превъртане в iTerm и Добавих след корен клавишна комбинация:

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

След като сте в режим на копиране, можете да продължите да натискате, за M-Upда превъртите 1 ред нагоре. Обичайните PageDownи PageUpконтролите са достъпни за превъртане на цял екран и допълнителни M-PageDownи M-PageUpза превъртане с половината екран (наистина удобно).

# 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

Освен това, дори когато съм в сесията на tmux, пак мога да продължа да използвам ⌘↑и ⌘↓да контролирам вътрешния буфер за превъртане на tmux, а не този на iTerm. Възможно е чрез използване на потребителски iTerm профил с някои отменени връзки на клавиши, за да се задействат tmux действия. Така ⌘↑натиснат в iTerm просто изпраща M-Upнатискане на клавиш към сесията tmux.

Прочетете предишната ми част от поредицата „tmux на практика“ за повече подробности: tmux на практика: интеграция на iTerm2 и tmux.

Друг tmux по подразбиране, който бих предпочел да променя, е превъртането на колелото на мишката. Превърта се с 5 реда, което се чувства като голям скок. Нека го намалим до превъртане с 2 реда:

# 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

Е, сега нека поговорим за копиране на текст, след като сте в режим на копиране. Свиквам да копирам текст с помощта на мишката. Нека активираме поддръжката на мишката:

set -g mouse on

По подразбиране, когато изберете текст с мишката в tmux, той се копира в буфер и веднага изпадате от режим на копиране. Текущата ви позиция на превъртане се нулира до края на изхода и вие сте в режим на команден ред. Нека да видим това в действие:

Както забелязвате, всеки път, когато избирам текст с мишката, той ме изхвърля от режим на копиране. Наистина е досадно. Обикновено, когато оставам с някаква задача, съм склонен да избирам текст тук или там, само за да медитирам (помага ми да се съсредоточа върху?) Или може да искате просто да изберете текст, който да подчертаете за вашия колега, който седи до вас.

Така че нека да променим това. Не искаме да ни изстрелват от режима за копиране. Не искаме селекцията да бъде изчистена в края на събитието за плъзгане на мишката. Текстът от селекцията може да бъде копиран с левия бутон на мишката след това.

# 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

Нека проверим резултата:

За достъп до буферните елементи за копиране и поставяне на най-новия елемент използвайте C-pи p:

bind p paste-bufferbind C-p choose-buffer

Това е всичко за днес. Останете на линия. В следващата част от поредицата „tmux на практика“ ще говорим за интеграция на клипборда и как да споделяме текст, копиран в tmux, със системния клипборд (както локално, така и при отдалечена работа, на OSX и Linux).

BTW, можете да видите всички тези ощипвания на конфигурацията в действие, просто проверете моя репо за tmux-config.

Трик

Ако искате да заобиколите напълно tmux режима за копиране и да изберете текст чрез iTerm, просто задръжте 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

Original text