Работа с текстом и буферами#

В течение обычного дня обычно много раз приходится копировать и вставлять различные текстовые фрагменты. При работе с tmux, рано или поздно может возникнуть ситуация, когда нужно будет прокрутить выходной буфер терминала, чтобы увидеть что-то, что сместилось за пределы экрана. Возможно, также потребуется скопировать какой-нибудь текст и вставить его в файл или в другую программу. В этом разделе рассмотрим как управлять текстом внутри сеансов, а именно как использовать клавиатуру для прокрутки выходного буфера tmux, как работать с несколькими буферами вставки и как работать с системным буфером обмена.

Прокрутка вывода в режиме копирования#

Вывод программ в терминале часто прокручивается за пределы экрана. При использовании tmux, можно использовать клавиатуру для перемещения назад по выходному буферу, чтобы увидеть то, что ушло за границы терминала. Это особенно полезно в тех случаях, когда запускаются тесты или просматриваются файлы журналов.

Нажатие PREFIX [ переводит tmux в режим копирования. В этом режиме можно использовать клавиши перемещения для перемещения курсора за пределы экрана. По умолчанию для этого используются клавиши со стрелками. Но в разделе «Настройка tmux» tmux был перенастроен, чтобы использовать клавиши Vim для перемещения между окнами и изменения размера панелей, чтобы не приходилось переносить руки с центрального ряда клавиатуры. tmux также имеет режим vi для работы с буфером. Чтобы включить его, добавьте следующую строку в файл конфигурации:

~/.tmux.conf

# Enable vi keys.
setw -g mode-keys vi

После этого можно использовать h, j, k и l для перемещения по буферу. Чтобы выйти из режима копирования, достаточно нажать клавишу ENTER.

Однако, перемещение по одному символу за раз не очень эффективно. Поскольку теперь включен режим vi, можно также использовать некоторые другие сочетания клавиш для перемещения по буферу. Например, можно использовать w, чтобы перейти к следующему слову, и b, чтобы вернуться на одно слово назад. Также можно использовать f, за которым следует любой символ, чтобы перейти к этому символу в той же строке, и F, чтобы перейти назад по строке.

Быстрое перемещение по буферу#

Если имеется несколько страниц буферизованного вывода, перемещение курсора для прокрутки не является очень удобным и полезным. Вместо того, чтобы перемещаться слово за словом или символ за символом, можно прокручивать страницу буфера постранично или перейти к началу или концу буфера.

Для перемещения на одну страницу вверх используется CTRL-b и на одну страницу вниз с помощью CTRL-f. Вы можете перейтиь до конца вверху истории буфера с помощью g, а затем перейти в самый низ с помощью G.

Поиск в буфере#

Вам не нужно просматривать сотни строк вывода страница за страницей, если вы знаете, что ищете. Нажимая ? в режиме копирования вы можете выполнять поиск вверх по фразам или ключевым словам. Просто нажмите ?, введите поисковую фразу и нажмите ENTER, чтобы перейти к первому вхождению фразы. Затем нажмите n, чтобы перейти к следующему вхождению, или N, чтобы перейти к предыдущему.

Для поиска назад нажмите / вместо ? . Нажатие n переходит к следующему вхождению, а N- к предыдущему вхождению.

Научившись перемещаться по буферу таким образом, вы значительно ускорите процесс. Быстрее ввести слово, к которому вы хотите перейти, вместо того, чтобы использовать стрелки для перемещения, особенно если вы просматриваете выходные данные файлов журнала.

Теперь давайте рассмотрим, как скопировать текст с одной панели и вставить его в другую. В конце концов, это режим копирования.

Копирование и вставка текста#

Перемещаться и искать что-то в выходном буфере — это, как правило, только половина дела. Нам часто нужно скопировать текст, чтобы мы могли сделать с ним что-то полезное. Режим копирования tmux дает нам возможность выбрать и скопировать текст в буфер вставки, чтобы мы могли вставить этот текст в другом месте.

Чтобы скопировать текст, войдите в режим копирования и переместите курсор туда, где вы хотите начать выделение текста. Затем нажмите ПРОБЕЛ и переместите курсор в конец текста. Когда вы нажмете ENTER, выделенный текст копируется в буфер вставки.

Чтобы вставить только что скопированный текст, нажмите PREFIX ].

Давайте рассмотрим несколько способов копирования и вставки текста из нашего основного выходного буфера.

Захват панели#

tmux имеет удобное сочетание клавиш, которое копирует все видимое содержимое панели в буфер вставки. Переведите tmux в командный режим с помощью PREFIX : и введите

capture-pane

Содержимое панели скопируется в буфер вставки. Затем вы можете вставить содержимое в другую панель или окно, нажав PREFIX ].

Отображение и сохранение буфера#

Вы можете отобразить содержимое буфера вставки с помощью команды show-buffer в командном режиме или из сеанса терминала $ tmux show-buffer

Также, используя команду save-buffer, вы можете сохранить буфер в файл, который часто может быть полезен. Фактически, вы можете записать содержимое текущей панели в текстовый файл.

В командном режиме выполните capture-pane; save-buffer buffer.txt. Вы можете легко назначить этой команде горячую клавиши, если только захотите хотите.

Использование нескольких буферов вставки#

tmux поддерживает стек буферов обмена, что означает, что вы можете копировать текст, не заменяя содержимое буфера. Это намного более удобно, чем традиционный буфер обмена, предлагаемый операционной системой.

Каждый раз, когда вы копируете новый текст, tmux создает новый буфер вставки, помещая новый буфер в начало стека. Для демонстрации запустите новый сеанс tmux запустите текстовый редактор, такой как Vim или Nano.

В редакторе введите следующие предложения, по одному в строке:

First sentence is first.
Next sentence is next.
Last sentence is last.

Теперь скопируйте текст в буфер вставки с помощью tmux. Войдите в режим копирования используя PREFIX [ . Перейдите к началу первого предложения, нажмите ПРОБЕЛ, чтобы начать выделение текста, перейдите к концу первого предложения и нажмите ВВОД чтобы скопировать выделение. Повторите это со вторым и третьим предложениями.

Каждый раз, когда вы копируете текст, tmux создает новый буфер. Вы можете увидеть эти буферы с помощью команды list-buffers.

0: 22 bytes: "Last sentence is last."
1: 22 bytes: "Next sentence is next."
2: 24 bytes: "First sentence is first."

Нажатие PREFIX ] всегда вставляет буфер 0, но вы можете выполнить команду choose-buffer для выбора буфера и вставить содержимое в выделенную панель.

Разделите текущее окно пополам и запустите Nano во второй панели, затем войдите в командный режим и введите:

choose-buffer

Вам будет представлен список, который выглядит как на рисунке:

Вы можете выбрать любую запись в списке, нажать ENTER, и текст будет вставлен в выбранную панель.

Это отличный способ управлять несколькими фрагментами текста, особенно в окружениях, которые не имеют доступа к буферу обмена на уровне ОС.

Эти буферы являются общими для всех запущенных сеансов tmux, поэтому вы можете брать контент из одного сеанса и вставьте его в другой.

Переназначение клавиш копирования и вставки#

Если вы используете Vim и хотите сделать команды копирования и вставки более привычными, вы можете переназначить горячие клавиши в вашей конфигурации. Например, вы можете использовать PREFIX ESCAPE для входа в режим копирования, а затем использовать v, чтобы запустить визуальный режим для выбора текста, использовввать y, чтобы «скопировать» текст в буфер, и используйте p, чтобы вставить текст.

bind Escape copy-mode
bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection
unbind p
bind p paste-buffer

Это может значительно повысить производительность, если вам приходится много копировать и вставлять данные между окнами и панелями когда вы уже знакомы с клавишами, которые использует Vim.

Работа с буфером обмена в Linux#

С помощью утилиты xclip [10] вы можете интегрировать свои буферы в системный буфер обмена Linux, чтобы иметь возможность легко копировать и вставлять между программами.

Во-первых, вы должны установить xclip.

$ sudo apt-get install xclip

Затем используйте команды tmux save-buffer и set-buffer c xclip.

Чтобы скопировать текущий буфер в системный буфер обмена, мы добавим эту команду в наш файл .tmux.conf: bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"

Это свяжет PREFIX CTRL-c, с передачей текщего буфера xclip.

Итак, вы входите в режим копирования, выделяете текст, нажимаете y , а затем нажимаете PREFIX CTRL-c, чтобы получить текст в буфер обмена. Вы можете ускорить процесс, привязав клавишу y для прямой отправки вывода в xclip:

bind -t vi-copy y copy-pipe "xclip -sel clip -i"

Теперь текст, который вы выделяете и копируете в режиме копирования, будет в системном буфере обмена. Чтобы вставить текст из системного буфера обмена в сеанс tmux, добавьте эту строку в свою конфигурацию:

bind C-v run "tmux set-buffer \"$ (xclip -o -sel clipboard) \"; tmux paste-buffer"

Это настраивает tmux для извлечения содержимого из xclip в новый буфер tmux, а затем вставляет его в выбранное окно или панель tmux, когда вы нажимаете PREFIX CTRL-v.

Использование команд буфера обмена OS X#

Если вы являетесь пользователем Mac, вы можете быть знакомы с утилитами буфера обмена командной строки OS X pbcopy и pbpaste. Эти простые утилиты упрощают работу с буфером обмена. Команда pbcopy записывает текст в системный буфер обмена, а команда pbpaste вставляет содержимое. Например, вы можете использовать pbcopy и cat вместе, чтобы легко поместить содержимое вашего файла .tmux.conf в буфер обмена, чтобы вы могли вставить его в электронное письмо или веб форму:

$ cat ~/.tmux.conf | pbcopy

Это довольно удобный способ работы с текстом, но tmux не имеет доступа к этим утилитам, поэтому мы не можем используйте их во время работы внутри сеанса tmux. Но мы можем использовать программу-оболочку, написанную Крисом Джонсеном для обойти это ограничение.[11]

Чтобы использовать этот скрипт-оболочку, мы сначала устанавливаем скрипт с помощью Homebrew. Хотя вы и можете собрать его из исходного код, использование Homebrew упрощает процесс:

$ brew install reattach-to-user-namespace -l /bin/bash

Затем настройте tmux для использования оболочки, добавив эту строку в ваш .tmux.conf:

set -g default-command "reattach-to-user-namespace -l /bin/bash"

Это настраивает команду по умолчанию, которую tmux использует для новых окон, поэтому он загружает оболочку Bash через скрипт-обертку. Если вы используете оболочку, отличную от Bash, например Fish или zsh, вы должны указать ее путь или команду.

Как только вы перезагрузите файл конфигурации, вы сможете снова использовать команду pbcopy. И в качестве дополнительного бонуса, вы можете отправить содержимое текущего буфера tmux в системный буфер обмена:

$ tmux show-buffer | pbcopy

Или вы можете вставить содержимое буфера обмена следующим образом:

$ tmux set-buffer $(pbpaste); tmux paste-buffer

Это означает, что вы также можете создавать сочетания клавиш также, как вы это делали в разделе «Работа с буфером обмена в Linux». К сожалению, используемая нами программа-оболочка не работает с командой run tmux. Обходной путь заключается в явном добавлении префикса pbpaste и pbcopy к сценарию-оболочке. Итак, для поддержки копирования буфера в системный буфер обмена, добавьте эту строку в ваш файл .tmux.conf:

bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"

Как и в Linux, вы также можете настроить режим копирования tmux для отправки копируемого текста непосредственно в системный буфер обмена, добавив эту привязку клавиш в вашу конфигурацию:

bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

Теперь, когда вы выбираете текст в режиме копирования и нажимаете y, текст будет отправлен в pbcopy и будет в вашем системном буфере обмена, готовый для использования в других программах. Чтобы поддерживать вставку из системного буфера обмена, можно испоьзовать следующую длинную команду, которая должна быть в одной строке.

bind C-v run \
"tmux set-buffer \"$(reattach-to-user-namespace pbpaste)\"; tmux paste-buffer"

Это обеспечивает простое решение довольно сложной проблемы.

Что дальше?#

Используя буферы вставки tmux для перемещения текста, вы получаете возможность использовать буфер обмена в ситуациях, когда у вас его может не быть, например, когда вы вошли в консоль сервера или без графического терминала. Возможность прокручивать историю длинного вывода на консоль может оказать огромную помощь. Только по этой причине стоит установить tmux непосредственно на ваши серверы.

Теперь, когда у вас есть хорошее представление о том, как находить, копировать и вставлять текст, вы можете начать использовать tmux в своей повседневной жизни. Для многих разработчиков парное программирование часто является частью этой рутины. Давайте посмотрим, как использовать tmux для работы с другим разработчиком.

Для дальнейшего использования#

Команды режима копирования#

Команда

Описание

PREFIX [

Входит в режим копирования.

PREFIX ]

Вставляет текущее содержимое буфера.

PREFIX =

Выводит список всех буферов вставки и вставляет выбранное содержимое буфера.

Клавиши перемещения в режиме копирования (режим vi)#

Команда

Описание

h, j, k, l

Перемещает курсор влево, вниз, вверх и вправо соответственно.

w

Перемещает курсор вперед на одно слово за раз.

b

Перемещает курсор назад на одно слово за раз.

f за которым следует любой символ

Переходит к следующему вхождению указанного символа.

F за которым следует любой символ

Переходит к предыдущему вхождению указанного символа.

CTRL-b

Прокручивает вверх на одну страницу.

CTRL-f

Прокручивает вниз на одну страницу.

g

Переходит к началу буфера.

G

Переходит к нижней части буфера.

?

Запускает поиск в обратном направлении по буферу.

/

Запускает поиск вперед по буферу.

Команды#

Команда

Описание

show-buffer

Отображает текущее содержимое буфера.

capture-pane

Захватывает видимое содержимое выбранной панели в новый буфер.

list-buffers

Список всех буферов вставки.

choose-buffer

Показывает буферы вставки и вставляет содержимое выбранного вами.

save-buffer [filename]

Сохраняет содержимое буфера в указанный файл.

Ссылки#

  1. http://sourceforge.net/projects/xclip/

  2. ChrisJohnsen/tmux-MacOSX-pasteboard