Скопируйте текст из одной панели tmux в другую (используя vim)

133

У меня есть два файла, открытых в Vim, каждый в одной панели Tmux. Я хотел бы скопировать, скажем, 10 строк из одного файла в другой.

Как я могу сделать это, не используя мышь Copy-> Paste?

Patryk
источник
2
Вы можете задействовать tmux , но, как правило, есть более простые способы. Находятся ли оба экземпляра Vim на одном (локальном?) Компьютере? Обычно я просто использовал бы временный файл для этого (то есть визуально выбирал строки :w /tmp/lines, а затем :r /tmp/linesв другом случае). Или, если ваш Vim знает, как общаться с системным буфером обмена, вы можете использовать регистры +или, *чтобы избежать временного файла.
Крис Джонсен

Ответы:

194

Вам придется использовать ярлыки tmux. Если предположить, что ярлык команды tmux используется по умолчанию: Ctrl+ b, то:

  1. Ctrl+ b, [Войдите в режим копирования (?).

  2. Переместить в начало / конец текста, чтобы выделить.

  3. Ctrlspace

    Начните выделять текст (в Arch Linux). Когда я скомпилировал tmux из исходного кода для OSX и других Linux, Spaceон обычно работает сам по себе. Выбранный текст меняет цвета, поэтому вы будете знать, сработала ли команда.

  4. Переместитесь в противоположный конец текста для копирования.

  5. Alt+ wКопирует выделенный текст в буфер обмена Tmux. (На Mac используйте Esc+ w.)

  6. Переместите курсор в противоположную панель tmux или в совершенно другое окно tmux. Поместите курсор туда, куда вы хотите вставить только что скопированный текст.

  7. Ctrl+ b, ]Вставить скопированный текст из буфера обмена Tmux.

tmux неплохо умеет сопоставлять команды с пользовательскими сочетаниями клавиш.

Смотрите Ctrl+ b, ?для полного списка установленных сочетаний клавиш.

Алекс Лич
источник
4
Благодарю. Просто sidenode: Alt + w не работал на Mac. Alt был сопоставлен с Esc по умолчанию. Следовательно, это Esc + w.
Каран
11
если вы используете screenярлыки: Ctrl + A [(войдите в режим копирования), Space(начните выделение), Enter(завершите выделение), Ctrl + A ](вставьте).
JFS
11
Стоит отметить, что «enter» работает для меня, тогда как alt + w - нет.
Элайджа Линн
3
Как отмечено в awhan.wordpress.com/2010/06/20/copy-paste-in-tmux , если у вас есть привязки клавиш vi, шаг 5 следует заменить на Enterключ.
Ин Сюн
3
Что делать, если мне нужно скопировать и вставить в текстовый редактор? По какой-то причине он, кажется, не берет выбранный текст даже после нажатия «Ввод» после выделения текста.
Удай
34

К сожалению, я пока не могу добавить комментарий к ответу Алекса Лича, поэтому я собираюсь добавить здесь дополнение для пользователей Mac OS X:

  1. Enter Копирует выделенный текст
Мечислав Даниил Дыба
источник
1
Спасибо! Я на Ubuntu Xenial, используя byobu/ tmuxсо всеми настройками по умолчанию, это сработало, Alt + w - нет.
Андреа Зонка
1
Это не работает на OS X Yosemite с tmux 2.0, также как alt + w и esc + w :(
weberc2
У меня тоже работает на Windows с использованием терминала Zoc.
jdhao
15

Если вы используете vim и tmux на macOS (протестировано на macOS 10.12.2, tmux 2.3):

(Предположим, что сочетание клавиш префикса tmux равно prefix. Префикс ctrl+ bпо умолчанию.)

  • Копирование:
    1. Нажмите prefix+, [чтобы войти в режим копирования.
    2. Используйте клавиши со стрелками, чтобы перейти к началу / концу выделения текста.
    3. Нажмите ctrl+ space(если вы установили ctrl+ в spaceкачестве префикса, нажмите ctrl+ space+ spaceвместо этого)
    4. Используйте клавиши со стрелками, чтобы перейти на другую сторону выделения.
    5. Нажмите ctrl+ w.
  • Вставить:
    1. Нажмите prefix+ ]в режиме вставки.
Хамид Рохани
источник
9

Я подключаюсь к своему серверу CentOS на компьютере с Windows, используя ssh-клиент ZOC-терминала . Вот что работает для меня:

  • Войдите в режим копирования: <prefix>+[
  • Начать копирование: <Space>
  • Скопировать текст: <Enter>
  • Вставить текст: <prefix>+]
jdhao
источник
2

Вы можете использовать системный буфер обмена с «* y и» * p вместо обычных y и p.

Johan
источник
1
Чтобы использовать системный буфер обмена, вы должны использовать "+2yy- скопировать две строки в буфер обмена X11 "+dd- вырезать строку в буфер обмена X11 "+p- вставить буфер обмена X11
Patryk
Нужно ли что-либо вводить перед использованием этих команд?
Томас Але
@ThomasAhle, нет .. это буквально двойные кавычки ("), за которыми следуют плюс (+) и 2ys (y). Убедитесь, что вы находитесь в нормальном режиме. Если вы находитесь в обычном режиме, вы можете использовать h,j,k,lдля переместить. Я также видел иногда на моей Ubuntu VM, регистр "+" исчезает, по неизвестной причине. Чтобы убедиться, что у вас есть +регистр, вы можете ввести :regи проверить, есть ли строка "+в первом столбце.
alpha_989
Да, это так, это ответ. Гораздо проще, чем предлагали другие (используя tmux copy / paste), и это не мешает нумерации строк. Не вызовет ли это каких-либо проблем, если вы переназначите стандарт yи pна "+yи "+p?
Райан
1

Если у вас vimоткрыт, лучше использовать vim copy paste для копирования текста.

Tmux copy paste будет работать, однако есть несколько недостатков.

Во-первых, при копировании нескольких строк текста вам нужно будет выбрать несколько строк. Tmux copy paste обычно не понимает, что в vimстроке vim есть номера строк или есть пометки (например, относительные числа / абсолютные числа). В результате он также будет копировать их.

Во-вторых, я обнаружил, что если текст имеет форматирование определенного языка, и вы напрямую пытаетесь скопировать вставить с помощью tmux в vim, это приведет к неправильному форматированию. Этого можно избежать с помощью set paste!. Однако это требует гораздо больше работы.

Используйте "+yдля копирования и "+pвставки

Vimизначально предоставляет метод для копирования вставки между буфером vim и системным буфером обмена, используя либо "+yили "*y. Затем вставьте с помощью "+pили "*p. Это позволит избежать копирования относительных чисел в желобе или других случайных меток, которые не имеют отношения к vim

alpha_989
источник
0

Несколько вариантов использования vim, поскольку последовательность ярлыков tmux немного длинная, и мне трудно ее запомнить

Как и в ответах выше, вы можете использовать "+yи "*yдля копирования, а затем "+pи "*pсоответственно для вставки. Если вы хотите, чтобы vim по умолчанию использовал буфер обмена, вы можете просто использовать его y/pнапрямую.

set clipboard=unamed "sets the default copy register to be *
set clipboard=unamedplus "sets the default copy register to be +

Источник команды буфера обмена: https://vi.stackexchange.com/questions/84/how-can-i-copy-text-to-the-system-clipboard-from-vim

Ави Ареман
источник