Как заставить 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для более подробной информации.

Conner
источник
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
LIS2
источник
во что ты вставил?
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

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

ivanleoncz
источник
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>

rotestein
источник
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, содержимое буфера обмена будет вставлено в курсор. Вы также можете сопоставить новую команду с функциональной клавишей, чтобы можно было сделать это одним нажатием клавиши.

Lovecraftian
источник
4

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

Boseam
источник
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
NM Pennypacker
источник
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

barlop
источник
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 по умолчанию не поддерживает параметр буфера обмена.

Nobu
источник
1

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

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

Б-30

Б-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: обратный поиск по ключевым словам для завершения
ericbn
источник
1

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

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

Что вам действительно нужно, так это EasyClip . Это сделает именно это и многое другое ...

Скотт Уэйд
источник
1

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

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

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

dr0i
источник
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.

wisbucky
источник
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

user1898814
источник
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.

Феликс
источник