Как я могу скопировать текст в системный буфер обмена из Vim?

284

Есть ли способ скопировать блок текста в системный буфер обмена, чтобы я мог вставить его в другую программу?

thameera
источник
12
Об этом уже спрашивали и отвечали на SO. Вы можете найти больше и другую информацию там.
bsmith89
1
Я использовал этот плагин на Macvim Christoomey / Vim-System-Copy и действительно люблю его. Это работает очень хорошо с движениями cpip, cpi{.
Филип
2
Что вам действительно нужно, так это EasyClip . Это сделает именно это и многое другое ...
Скотт Уэйд

Ответы:

324

Для систем на основе X11 (т. Е. Linux и большинства других UNIX- подобных систем) есть два буфера обмена, которые не зависят друг от друга:

  • ПЕРВИЧНЫЙ - Это копирование при выборе, и его можно вставить с помощью средней кнопки мыши.
  • CLIPBOARD - это копируется (обычно) ^Cи вставляется ^V(это как MS Windows).

Системы OS X и Windows имеют только один буфер обмена.

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

Vim имеет два специальных регистра, соответствующих этим буферам обмена:

  • *использует ПЕРВИЧНЫЙ; Мнемоника: S деготь S Избранный (для копирования-on - s избранника)
  • +использует CLIPBOARD; мнемоника: CTRL PLUS C (для общего набора клавиш)

В Windows и OS X нет разницы между +и *, так как эти системы имеют только один буфер обмена, и оба регистра ссылаются на одно и то же (не важно, какой из них вы используете).

Вы можете использовать эти регистры как любой регистр. Например, при использовании первичного буфера обмена *с yи pкомандами:

  • "*yy
  • "*p

Вы можете использовать это как более удобное сочетание клавиш:

noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

Если вы хотите «автоматически» взаимодействовать с системным буфером обмена вместо того, чтобы постоянно обращаться к нему вручную, вы можете установить clipboardпеременную:

  • Установите unnamedдля использования *(ПЕРВИЧНЫЙ, на выбор)
  • Установите его для unnamedplusиспользования +(CLIPBOARD, ^C)

Теперь просто использование yyперейдет в буфер обмена системы, а не в безымянный регистр Vim, и pвставит буфер обмена системы.

Вы также можете назначить эти регистры, как и любой регистр let:

  • :let @+=42
  • :let @*=42

У clipboardнастройки есть еще несколько опций (например, фильтры исключения); но это основы. Смотрите :help 'clipboard'для полной истории ;-)

GVim

Если вы используете gVim, вы можете получить поведение копирования при выборе :set guioptions+=a.
Это включено по умолчанию в системах X11 (копирует в ПЕРВИЧНЫЙ), но не в MS Windows и OSX (так как выбор любого текста переопределит ваш буфер обмена).

Нет +clipboard?

Vim требует +clipboardфлаг функции, чтобы все это работало; Вы можете проверить, есть ли в Vim это, используя :echo has('clipboard')Vim (если вывод есть 0, его нет , если 1он есть) или проверив вывод vim --versionfor +clipboard.

Большинство дистрибутивов Linux поставляются с «минимальной» сборкой Vim по умолчанию, которой нет +clipboard, но обычно вы можете установить ее:

  • Debian & Ubuntu: установить vim-gtkили vim-gnome.
  • Fedora: установите vim-X11и запустите vimxвместо vim( подробнее ).
  • Arch Linux: установить gvim(это будет включено и +clipboardдля обычного vim).

Можно также использовать xclip, xcopyили xselкопировать текст в буфер обмена; см. следующие вопросы для решения:

SSH

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

Это требует ForwardX11Trustedнастройки и должно выполняться только с доверенными серверами , поскольку это дает серверу практически полный контроль над сеансом X11:

$ ssh -XY myhost

Чтобы сделать эти настройки постоянными (чтобы вам не нужно было добавлять их -XYкаждый раз), вы можете сделать что-то вроде этого в вашем ~/.ssh/config:

# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
    ForwardX11 yes
    ForwardX11Trusted yes

Neovim

Neovim обновил поддержку буфера обмена. Встроенный интерфейс был удален и заменен системой , которые требуют внешних утилит , таких как xclip, xselили pbcopy/ pbpaste.

Следует автоматически подобрать эти утилиты и использовать их. На OS X pbcopy и pbpasteдолжен быть доступен по умолчанию, на Linux вы, вероятно, хотите установить xclip, поскольку это наиболее широко доступно (на самом деле есть две версии xselс несовместимыми флагами . Это действительно глупо).

Также смотрите :help clipboardв Неовим.

Мартин Турной
источник
6
ssh -Y подразумевает -X, поэтому -X можно опустить.
Хильдред
Для некоторых международных клавиатур вам может потребоваться нажать, "<Space>чтобы получить ". Так что в этом случае вам придется нажимать "<Space>+yили "<Space>*yкопировать.
Артур Ф
1
Очень интересным побочным эффектом изучения этого (несколько лет назад) для меня было осознание того, что "можно выбрать множество именованных регистров. "+это не волшебство, это просто регистрация +. Так, например, если вы хотите скопировать три вещи одновременно и вставить каждый из них один за другим, вы можете "1y, "2yи , "3yа затем "1p, "2pи "3p. Это действительно мощный и не существует практически в любом другом редакторе. Другое интересное использование - просмотр сохраненных макросов. Например, если вы записываете с помощью qq, но понимаете, что вам нужно это исправить, вы можете: во временной строке "qpисправить это и "qd.
Шахбаз
1
Просто примечание: OS X имеет два отдельных буфера обмена. Один доступен с помощью Cmd-C и Cmd-V, а другой - с помощью сочетаний клавиш emacs Ctrl-K и Ctrl-Y.
BallpointBen
3
@shahbaz - вероятно, лучше использовать регистры букв для этой цели, поскольку нумерованные регистры меняются при удалении текста.
evilsoup
18

Другие ответы касаются того, как скопировать текст из буфера в системный буфер обмена. Другая распространенная операция - копирование текста из другого регистра в буфер обмена. Например, если вы уже вставили некоторый текст в "(регистр по умолчанию), вы можете загрузить этот регистр в буфер обмена.

Вы можете сделать это с :let:

  • let @+=@" - копирует регистр по умолчанию в буфер обмена
  • let @*=@" - копирует регистр по умолчанию в основной выбор X11 («буфер обмена мышью»)
  • let @+=@a- скопировать из реестра aв буфер обмена
  • и т.п.

Обратите внимание, что это работает для регистров в целом: let @a=@bкопии регистра bдля регистрации a.

wchargin
источник
17

С http://vim.wikia.com/wiki/Accessing_the_system_clipboard

set clipboard=unnamedplus

Это изменяет регистр Vim по умолчанию на +регистр, который связан с системным буфером обмена. От :h clipboard-unnamedplus:

                                        clipboard-unnamedplus
unnamedplus     A variant of the "unnamed" flag which uses the
                clipboard register '+' (quoteplus) instead of
                register '*' for all yank, delete, change and put
                operations which would normally go to the unnamed
                register.  When "unnamed" is also included to the
                option, yank operations (but not delete, change or
                put) will additionally copy the text into register
                '*'.
                Only available with the +X11 feature.
                Availability can be checked with: 
                        if has('unnamedplus')
Куинси Бауэрс
источник
Почему это не работает для меня, когда yank & paste между экземплярами vim (каждый в отдельном терминальном терминаторе)?
thinwybk
Если вы работаете в Linux, и Vim был скомпилирован с помощью функции + X11, и у вас установлен набор clipboard = unnamedplus, то вы сможете восстановить строку в одном экземпляре vim и вставить ее в другой экземпляр vim. Вы также можете вставить его в любое другое приложение с помощью сочетания клавиш CTRL + V или SHIFT + INSERT. Вы можете использовать :versionв Vim, чтобы увидеть, появляется ли + X11 в списке включенных функций. Вы также можете проверить, доступна ли функция «unnamedplus». :if has('unnamedplus')⏎ echo 'yes'⏎ endif Если вы не работаете в Linux, то вам следует использовать unamed вместо unnamedplus.
Куинси Боуэрс
10

В тех сборках, которые его поддерживают, указанный регистр *является системным буфером обмена. Чтобы скопировать текст из Vim в системный буфер обмена, вы можете выделить текст в визуальном режиме, а затем нажать, "*yчтобы скопировать его в системный буфер обмена.

И наоборот, используйте "*pдля вставки текста из системного буфера обмена в Vim.

200_success
источник
5

Я рекомендую вам использовать Gvim и добавить это к себе .vimrc:

source $VIMRUNTIME/mswin.vim
behave mswin

Это обеспечивает поддержку для CtrlC, CtrlX, CtrlVкак блокнот в Windows.

Обратите внимание , что это будет также добавить некоторые другие общие ярлыки Windows , например, CtrlSдля :w, CtrlAдля выбора всех и т.д.

linrongbin
источник
0

Если ваш vim не поддерживает, +clipboardвы можете использовать плагин fakeclip для Linux, Mac, Windows, tmux, screen, ...

laktak
источник
0

Каждый второй ответ охватывает все важные вещи о регистрах. Я хотел бы добавить еще одну вещь, которую я использую.

В Vim есть способ напрямую скопировать визуально выбранный текст в буфер обмена. Просто поместите это в ваш файл vimrc :

set guioptions+=a

И при этом всякий раз, когда вы визуально выделяете какой-то текст, он будет скопирован в ваш буфер обмена. Для получения дополнительной информации об этом,:help guioptions

Кстати, это только для gVim.

Дурга Сваруп
источник
2
guioptions+=aтакже упоминается в ответе Carpetsmoker.
Муру
@ Муру Да, прости. Я не видел этого раньше. Я только что видел его.
Дурга Сваруп
0

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

Сначала очистите реестр, который будет получать информацию

:let @a=""

Затем скопируйте в него все строки, содержащие шаблон

:g/pattern/yank A

Наконец передача (копирование) информации в системный буфер обмена

:let @+=@a

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

OBS: Необходимо подключить регистр перед его использованием, и использование версии регистра UPPERCASE позволяет нам добавлять контент, иначе он также не будет работать.

SergioAraujo
источник
0

Если вы не можете понять, как добраться +clipboardдо работы, чего я не мог по какой-то причине, тогда вы можете сделать это.

Предполагая, что вы хотите скопировать только часть файла, я делаю shift+, vчтобы перейти в визуальный режим и выделить только те строки, которые хочу скопировать. Тогда я делаю это.

# Linux Wayland
:'<,'>w !wl-copy

# Linux Xorg
:'<,'>w !xclip -selection clipboard

объяснение

  • '<,'> - означает, что вы использовали визуальный режим для выбора диапазона (вы его не вводите)
  • w !{cmd}- напишите диапазон к стандарту cmd, см. больше в:help w_c
  • wl-copyи xclipпрограммы, к которым вы можете передавать текст, и они добавят его в буфер обмена вашей системы

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

425nesp
источник