tmux на практиці: буфер прокрутки

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

Це третя частина мого 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 scrollback без злому вище, але налаштуйте його конфігурацію, щоб бути більш доброзичливим і звичним.

Перш за все, я не люблю 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).

До речі, ви можете побачити всі ці налаштування конфігурації в дії, просто перевірте моє репозиторій 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