Как заставить vim вставлять из (и копировать) в системный буфер обмена?


772

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

Могу ли я сделать vim paste из системного буфера обмена и в него?



7
Скопируйте "+ y Paste" + p Работает так же, как yank и вставьте, за исключением того, что вы указали ранее реестр.
Banjocat

2
Чтобы использовать следующие команды, убедитесь, что вы сделали, sudo apt-get install vim-gnome что добавит эту функциональность к встроенному vim использования системного буфера обмена.
Harnirvair Singh

2
@Harnirvair Для многих читателей здесь, vim-gnomeвероятно, излишне или просто недоступно в их ОС / дистрибутиве, в то время как я подозреваю , что, скорее всего, они существуют и vim-gtkпредпочитают vim-gtk3меньше зависимостей, в то же время обеспечивая интеграцию с буфером обмена (по крайней мере, для тех, кто все еще работает на X11; Я не уверен, как все это взаимодействует с Уэйлендом).
underscore_d

3
По умолчанию в Fedora - нет доступа к буферу обмена (вам нужен gvim), superuser.com/questions/194747/…
icc97

Ответы:


882

"*И "+регистры для буфера обмена системы ( :help registers). В зависимости от вашей системы они могут делать разные вещи. Например, в системах, которые не используют X11, таких как OSX или Windows, "*регистр используется для чтения и записи в системный буфер обмена. В системах X11 могут использоваться оба регистра. Смотрите :help x11-selectionподробности, но в основном "*это аналог выбора PRIMARY в X11 (который обычно копирует то, что вы выбираете мышью, и вставки средней кнопкой мыши) и "+аналогично выделению X11 CLIPBOARD (которое является собственно буфером обмена).

Если все это у вас над головой, попробуйте с помощью "*yyили "+yyскопировать строку в буфер обмена вашей системы. Предполагая, что у вас есть соответствующие параметры компиляции, один или другой должен работать. Вы можете переназначить это на что-то более удобное для вас. Например, вы можете вставить vnoremap <C-c> "*y~ / .vimrc, чтобы вы могли визуально выбрать и нажать Ctrl+, cчтобы вернуться в буфер обмена вашей системы.

Имейте в виду, что копирование / вставка из системного буфера обмена не будет работать, если :echo has('clipboard')возвращается 0. В этом случае vim не скомпилирован с этой +clipboardфункцией, и вам придется установить другую версию или перекомпилировать ее. Некоторые дистрибутивы Linux предоставляют минимальную установку vim по умолчанию, но, как правило, если вы устанавливаете пакет vim-gtkили vim-gtk3пакет, вы можете получить дополнительные функции.

Вы также можете посмотреть на 'clipboard'опцию, описанную в :help cb. В этом случае вы можете :set clipboard=unnamedили :set clipboard=unnamedplusсделать все операции удаления / удаления автоматически скопировать в системный буфер обмена. Это может быть неудобно в некоторых случаях, когда вы сохраняете что-то еще в буфере обмена, так как это переопределит его.

Для вставки вы можете использовать "+pили "*p(опять же, в зависимости от вашей системы и / или желаемого выбора) или вы можете сопоставить их с чем-то другим. Я печатаю их явно, но часто оказываюсь в режиме вставки. Если вы находитесь в режиме вставки, вы все равно можете вставить их с правильным отступом, используя <C-r><C-p>*или <C-r><C-p>+. См :help i_CTRL-R_CTRL-P.

Также стоит упомянуть параметр vim paste( :help paste). Это помещает vim в специальный «режим вставки», который отключает несколько других опций, позволяя легко вставлять в vim с помощью эмулятора терминала или знакомого ярлыка вставки мультиплексора. Просто введите, :set pasteчтобы включить его, вставьте содержимое, а затем введите, :set nopasteчтобы отключить его. Кроме того, вы можете использовать pastetoggleопцию для установки кода клавиши, который переключает режим ( :help pastetoggle). Я рекомендую использовать регистры вместо этих опций, но если они все еще слишком страшны, это может быть удобным обходным путем, пока вы совершенствуете свои vim отбивные.

Смотрите :help clipboardдля более подробной информации.


104
Это очень информативно, но вы можете суммировать, какие нажатия клавиш нужно выполнить, чтобы вставить из системного буфера обмена ... например, что вы делаете "*p? Я нажимаю Shift- ', затем Shift-8, затем p и т. Д.?
Т. Брайан Джонс

11
Да, введите эти три символа в последовательности. Многие команды в vim используют так называемый «режим ожидания оператора», когда нажимается одна клавиша, а затем vim ожидает больше клавиш. Взять ddк примеру. Первый dвходит в режим ожидания оператора, затем второй dзавершает команду и удаляет строку. Однако, если вы введете dGтекст, Gон удалит его до конца файла, а не просто удалит строку. Регистры используют этот же принцип, чтобы позволить различным командам использовать их.
Коннер

4
Увы! Если бы я только видел этот пост до сегодняшнего дня! Это все, что я хотел знать о копировании и вставке из системного буфера обмена. «<Cr> <Cp> * или <Cr> <Cp> +» - чистое золото.
Кит Пинсон

56
Внимание: вам нужно установить vim-gtkпакет (по крайней мере, под Debian), чтобы получить скомпилированный vim +xterm_clipboard. Мне понадобилось 40 минут, чтобы это выяснить, и всего несколько секунд sudo apt-get install vim-gtk.
Доминикас Мостаускис

3
@DominykasMostauskis vim-gnomeтакже работает и +xterm_clipboardвключил.
Chev

155

Вы можете скопировать в vim с помощью ярлыка gnome-терминала для вставки. Сделайте файл в режиме вставки и используйте

Ctrl+ Shift+ v.

Помните заранее, чтобы

 :set paste 

чтобы не возиться с отступом.


20
это путаница с отступом, если есть несколько строк, таких как Python для цикла
Moj

11
Используйте переключатель вставки для режима вставки. Например, set pastetoggle = <F2> Затем в режиме вставки нажмите <F2>, а затем вставьте свой код Python.
Ян Вайц

Да, скопируйте с помощью Ctrl + Shift + c и вставьте в другой файл
neel

1
если табуляция / пробелы, eols и т. д. отображаются как видимый символ (с помощью опции listchars), то эти замещающие символы будут скопированы вместо скрытых.
user907860

2
Это должно быть выбранный ответ дал свой краткий ответ
Aidin

41

Linux

В моей системе Linux, то +и *регистры карты к выбору X11, который можно наклеить с помощью средней кнопки мыши. Когда :set clipboard=unnamedи :set clipboard=unnamedplusиспользуются, регистры отображаются в буфер обмена и могут быть вставлены с помощью CTRL-V.

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

Смотрите также

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


2
Отображается только *в первичный регистр X11 (который обычно вставляется мышью). +сопоставляет с регистром буфера обмена X11, обычно вставляемым ярлыками.
ZyX

@ ZyX Не в моей системе, но ваш пробег, безусловно, может отличаться. Лучше всего настроить поведение, которое вы хотите явно, если вы хотите согласованного взаимодействия на разных платформах и версиях программного обеспечения.
Тодд А. Джейкобс

Я полагаю, это означает, что у вас есть менеджер буфера обмена, такой как klipper / glipper, они могут синхронизировать два буфера. Это не меняет тот факт , что ВИМ использует *для первичных и +для буфера обмена регистров Х11, вы можете увидеть это в VIM источника: эти значения не там и не изменяются, а clip_starи clip_plusвсегда используется *и +регистры соответственно.
ZyX

41

По моему эта конфигурация работает для копирования и вставки

" copy and paste
vmap <C-c> "+yi
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa

во что ты вставил?
StarWind0

Это ИМХО является лучшим решением, если установить clibboard без имени - не связываться с буфером обмена ОС при каждом действии x / dd / y и т. Д. А на Mac может быть лучше изменить модификатор C (ctrl) на D для отображения комбинаций cmd + c / x / v.
Миндекс

35

Это будут строки, которые вам нужны в вашем vimrc для этой цели:

set clipboard+=unnamed  " use the clipboards of vim and win
set paste               " Paste from a windows or from vim
set go+=a               " Visual selection automatically copied to the clipboard

2
Мне нравится ваше решение. Я хотел бы лучшего объяснения.
жон

отлично. использование регистров всегда заставляет меня колебаться и думать. Это намного лучше
JonnyRaa

Моя версия vim имеет + буфер обмена, и эта опция не работает для меня. Я использую Byobu (который использует Tmux под капотом).
GGhe

Мне пришлось добавить set clipboard + = unnamedplus для Fedora
hakunin

30

Я считаю, что этот вопрос заслуживает более объективного и графического ответа:

Вход в режим вставки

  • ESC
  • : установить пасту
  • Нажмите i
  • SHIFT+ Insert(с текстом, скопированным в буфер обмена)


Режим выхода из пасты

  • ESC
  • : установить nopaste
  • Нажмите i

Вы вставили текст и можете снова печатать.


1
Я получил это на работу, но :set nopasteничего не делает. Что это должно делать? Зачем мне это?
Марко Авлияш

1
Ну, на самом деле, это так. Когда вы выступаете :set nopaste, вы говорите редактору, что больше не хотите вставлять. И когда вы нажмете i, вы вернетесь в режим редактирования :).
ivanleoncz

2
Если честно, Марко, я не знаю.
ivanleoncz

1
SHIFT + Insert сделал это для меня, спасибо!
Мелисса Лоос

1
Это сработало как обаяние для меня. Каждый раз, когда я возвращаюсь к vim, мне всегда приходится выглядеть примерно так.
Бенджаминадк

17

буфер обмена

Существует специальный регистр для хранения этого выбора, это регистр "*. Здесь ничего не вводится, если только информация о том, какой текст выделен, не собирается измениться (например, где-то щелчком левой кнопки мыши) или когда другое приложение хочет вставить выделенный текст. Затем текст помещается в регистр "*. Например, чтобы вырезать линию и сделать ее текущим выделением / поместить ее на КЛАПАН:

    "*dd

Точно так же, когда вы хотите вставить выделение из другого приложения, например, нажав среднюю кнопку мыши, выделение сначала помещается в регистр «*», а затем «помещается», как любой другой регистр. Например, чтобы поместить выделение (содержимое КЛАПАНА):

    "*p

регистры E354

> There are nine types of registers:                      
> 1. The unnamed register ""
> 2. 10 numbered registers "0 to "9
> 3. The small delete register "-
> 4. 26 named registers "a to "z or "A to "Z
> 5. four read-only registers ":, "., "% and "#
> 6. the expression register "=
> 7. The selection and drop registers "*, "+ and "~ 
> 8. The black hole register "_
> 9. Last search pattern register "/

Вставить из буфера обмена

1. Clipboard: Copy
2. Vim insertmode, middle mouse key

Проверьте поддержку X11-буфера обмена в терминале

Если вы хотите запустить Vim в терминале, вам нужно искать версию Vim, которая была скомпилирована с поддержкой буфера обмена. Проверьте наличие поддержки X11-буфера обмена с консоли, введите:

% vim --version

Если вы видите «+ xterm_clipboard», вы можете идти.

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

X-сервер поддерживает три варианта выбора:

ПЕРВИЧНАЯ, ВТОРИЧНАЯ И КЛИПАТОРСКАЯ

ПЕРВИЧНЫЙ выбор обычно используется для осуществления копирования и вставки с помощью средней кнопки мыши. Выбор SECONDARY и CLIPBOARD реже используется прикладными программами.

http://linux.die.net/man/1/xsel


12

Я попробовал приведенные выше предложения, и ни одно из них не сработало в моей среде. (Windows PuTTY клонируется через ssh)

Появилось несколько дополнительных поисков: /unix/110684/copy-paste-into-sshd-vim-from-local-windows-clipboard

В одном из комментариев предлагалось использовать, SHIFT+INSERTчто помогло вставить из буфера обмена моего рабочего стола в буфер Vim. Ctrl-Cуже работал, чтобы скопировать в буфер обмена рабочего стола от Vim.


2
я работаю над vim внутри cmder tool [windows 8.1]. когда вы заходите в настройки cmder> ключи и макросы> вставка, я получаю команду shift + insert для многострочной вставки и ctrl + v для однострочной вставки.
Зубаир Алам

1
для меня простой щелчок правой кнопкой мыши работает как шарм! Просто щелкните правой кнопкой мыши!
Fr0zenFyr

2
Потому что вы используете терминал, а ssh vim не может получить доступ к буферу обмена вашей системы через SSL. SHIFT+INSERTработает, потому что это опция вставки для вашего терминала (или в вашем случае PuTTY); однако отступ, скорее всего, будет неправильным. Проверьте последний абзац моего ответа о pasteвозможности исправить это.
Коннер

1
@jinksPadlock. спасибо .. да .. я могу копировать / вставлять с помощью мыши .. пытался выяснить, как это сделать "только с клавиатуры". Копирование из Windows в VIM возможно только с помощью клавиатуры с использованием Putty, но не в обратном направлении. В bash для окон .. это невозможно сделать в обоих направлениях банкомата. Составлен список ресурсов для указания людей в правильных направлениях, а также для нас .. если у вас есть, что добавить ... возможно, вы можете добавить их здесь: stackoverflow.com/questions/45271895/…
alpha_989

1
@ alpha_989 позже-лучше-чем-никогда;) Я не могу добавить в jinksPadlock ', так как в настоящее время у меня под пальцами нет ОС Windows. SHIFT+INSработает с хоста linux на ssh vim, а также выполняет третий щелчок мышью.
tuk0z

10

У меня не было + буфера обмена, поэтому я нашел это альтернативное решение с использованием xsel:

Добавьте к вашему ~ / .vimrc:

vnoremap <C-C> :w !xsel -b<CR><CR>


1
Спасибо за эту прекрасную идею! Я закончил тем, что использовал:vnoremap <C-C> :w !xclip -i -sel c<CR><CR>
Энди

6

Краткое примечание для людей, чья установка vim не поддерживает регистры * и +. Нет необходимости загружать новую установку vim для вставки из буфера обмена. Вот альтернативный метод:

1) Установите parcellite (менеджер буфера обмена с небольшим объемом памяти);

2) В вашем файле .vimrc добавьте следующее:

command Clip r !parcellite -c

3) Перезапустите vim.

Теперь, когда вы наберете: Clip в качестве команды ex, содержимое буфера обмена будет вставлено в курсор. Вы также можете сопоставить новую команду с функциональной клавишей, чтобы можно было сделать это одним нажатием клавиши.


4

Это работает для меня: Ctrl+ Shift+V


3
В ответе @ neel об этом уже говорилось. Это должен быть только комментарий, или лучше голосование "за", если вы хотите сказать, что это также сработало для вас.
ericbn

3

Самое простое решение этого, которое также работает между различными машинами Linux через ssh:

  1. Проверьте , правильно ли VIM поддерживает X-11 буфер обмена: vim --version | grep clipboard. Если он сообщает, -clipboardи -xterm_clipboardвы должны установить либо vim-gtkили vim-gnome(gvim на Arch Linux)

  2. Добавьте следующие строки в ваш .vimrc:

set clipboard=unnamedplus
set paste
  1. Если вы входите на другой компьютер через ssh, используйте опцию -Y: ssh -Y machine

Теперь копирование и вставка должны работать точно так же, как и ожидалось, на одном и на разных компьютерах, используя только yyank и ppaste. Обратите внимание, изменить .vimrcна всех машинах, где вы хотите использовать эту функцию.


Я думаю, что X сервер должен быть доступен на сервере, чтобы это работало. Да! это может быть установлено vim-gtk. Я думаю, xvfb будет альтернативным вариантом для запуска X-сервера.
Ajeeb.KP

3

Я столкнулся с этой проблемой на Macbook Pro середины 2017 года, работающего vimв iTerm2качестве основной среды разработки.

Как подсказали другие ответы, я побежал vim --versionи заметил, что он возвращается -clipboard, что означает, что версия vim, поставляемая с моим компьютером, не была скомпилирована с опцией буфера обмена.

homebrewПакет vimпоявится компилировать с clipboardопцией, так что исправление для меня было:

  1. Запустить brew install vim
  2. Добавить set clipboard+=unnamedв мой ~/.vimrcфайл
  3. Закрыть и снова открыть iTerm2

3

Копировать в буфер обмена ОС

Выделите текст в визуальном режиме, нажмите "*y

Вставить из буфера обмена ОС

Нажмите "*p


2

Следуя ответу Коннера, это было здорово, но C-R C-p + и C-R C-p *в режиме вставки немного неудобно. То же самое "*pи "+pиз командного режима.

гуру VIM предложил следующее, чтобы сопоставить C-vс тем, что C-r C-p +делает.

Вы можете иметь только :inoremap <C-v> <C-o>"+pдля режима вставки

если вы действительно хотите переопределить блочный визуальный режим (он не рекомендуется, так как визуальный режим хорош), вы могли бы иметь map <C-v> "+p


2

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

установить vim:

brew install vim --with-lua --with-override-system-vim

установить графический интерфейс vim:

brew install macvim --with-lua --with-override-system-vim

перезапустите терминал для вступления в силу.


добавить следующую строку ~/.vimrc
set clipboard=unnamed

теперь вы можете скопировать строку в vim yyи вставить ее в масштабе всей системы.


2

Если вы используете мышь, сначала сделайте

 :set paste 

Тогда right click mouseи содержимое в буфере будет вставлено


1

Вдобавок к настройке :set clipboard=unnamed, вы должны использовать то, mvim -vчто вы можете использовать, brew install macvimесли вы используете vim на Terminal.app в Mac OS X 10.9. Vim по умолчанию не поддерживает параметр буфера обмена.


1

Также стоит упомянуть, что в OSX с использованием Vim вы можете выбрать текст с помощью мыши, Cmd-C для копирования в системный буфер обмена OSX, и скопированный текст будет доступен в буфере обмена вне Vim.

Другими словами, OSX обращается с ним, как с обычным окном, и здесь очень полезна кнопка Apple «Command».

Б-30


1
Это также верно для любого полуприличного эмулятора терминала в любой другой ОС. У Apple здесь нет никаких преимуществ.
underscore_d

1

Основываясь на ответе @ lis2, я использую более простую конфигурацию, которая не будет принудительно включать режим вставки в конце:

" Copy and paste
if has('clipboard') && !has('gui_running')
  vnoremap <C-c> "+y
  vnoremap <C-x> "+d
  vnoremap <C-v> "+p
  inoremap <C-v> <C-r><C-o>+
endif

Помните, что все эти переопределения отображений Vim по умолчанию:

  • v_CTRL-C: остановить Визуальный режим
  • v_CTRL-X: вычесть [количество] из числа
  • v_CTRL-V: блочный визуальный режим
  • i_CTRL-V: вставьте следующую нецифровую букву, которая также сопоставлена i_CTRL-Q

В качестве альтернативы, можно использовать клавиши вдохновленные в «рывком», «Удалить» и «пут» ВИМ глаголы: <C-y>, <C-d>и <C-p>соответственно. Это переопределит только одно сопоставление по умолчанию:

  • i_CTRL-P: обратный поиск по ключевым словам для завершения

1

Другие решения хороши, если вы хотите изменить свой vimrc и т. Д. Однако я хотел простой способ скопировать из vim на мою системную клавиатуру. Это то, что я придумал.

  • Выберите текст, который вы хотите скопировать в визуальном режиме v
  • Нажмите :(он автоматически развернется, чтобы показать :'<,'>)
  • Введите y * или y + (в зависимости от вашей системы), чтобы вернуть выделенный текст в системный буфер обмена.


1

Так как vim 8 правой кнопкой мыши включает визуальный режим по умолчанию. Это предотвращает «нормальное» копирование и вставку (назовите его «дефектом по дизайну» https://github.com/vim/vim/issues/1326 ). Исправьте это, выполнив:

echo "set mouse-=a" >> ~/.vimrc ,

Выйдите и перезапустите vim.


1

С Vim 8+ на Linux или Mac вы теперь можете просто использовать встроенную вставку ОС ( ctrl+shift+Vна Linux, cmd+Vна Mac). Не нажимайте iдля режима вставки.

Он вставит содержимое буфера обмена вашей ОС, сохраняя пробелы и вкладки без добавления автоматического отступа. Это эквивалентно старому :set paste, i, ctrl+shift+V, esc, :set nopasteметод.

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


0

Когда я использую мой Debian vim, который не интегрирован с Gnome (vim --version | grep clip # не показывает поддержки буфера обмена), я могу копировать в буфер обмена после удерживания клавиши Shift и выделения текста с помощью мыши, как и с любым другим другая программа проклятий. Как я понял из комментария @Conner, это терминал (gnome-терминал в моем случае), который отключает свои сообщения о событиях мыши, когда он чувствует мое нажатие Shift. Я предполагаю, что программы на основе curses могут получать события мыши после отправки определенной последовательности Escape на терминал.


1
Это использует ваш терминал, а не vim.
Коннер

0

Если вы находитесь в Windows и хотите вставить содержимое системного буфера обмена, используя pэту команду, введите эту команду.

:set clipboard = unnamed

Это решило мою проблему.


0

Есть два простых способа сделать это. Переведите ваш файл в режим вставки и 1) нажмите среднюю кнопку (колесо прокрутки) на вашей мыши или 2) Ctrl + Shift + V


0

Для некоторых международных клавиатур вам может понадобиться нажать "+, Spaceчтобы получить ".

Так что в этом случае вам придется нажимать "Space+yили "Space*yкопировать.

И "Space+pили " Space*pвставить.


0

Я использовал ответ NM Pennypacker и установил vim через homebrew для MacBook Pro начала 2011 года:

brew install vim

Теперь я также могу использовать регистр "* для копирования и вставки текста в vim. Мне даже не нужно было что-то менять в моем файле ~ / .vimrc или в $ PATH. Homebrew добавил символические ссылки в / usr / local / bin, например vim -> ../Cellar/vim/8.1.2350/bin/vim.

Альтернатива, которая работала раньше, состоит в том, чтобы скопировать некоторые строки текста в vim, пометив его мышью и используя копирование и вставку (cmd + c, cmd + v) на Mac. Эта опция работает, только если текст, который вы хотите скопировать и вставить, имеет меньший размер, чем размер окна vim. Если вы хотите скопировать весь текст в vim, отметив все окно или используя cmd + a, это скопирует другие части консоли, написанные до запуска vim, что очень раздражает.

Итак, я счастлив, что нашел новый метод с помощью регистра Clippboard.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.