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

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

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

38 ответов

Решение

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

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

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

Вы также можете посмотреть на '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's paste вариант (:help paste). Это помещает vim в специальный "режим вставки", который отключает несколько других опций, позволяя легко вставлять в vim с помощью эмулятора терминала или знакомого ярлыка вставки мультиплексора. Просто наберите :set paste чтобы включить его, вставьте свой контент, а затем введите :set nopaste отключить это. Кроме того, вы можете использовать pastetoggle возможность установить код клавиши, который переключает режим (:help pastetoggle). Я рекомендую использовать регистры вместо этих опций, но если они все еще слишком страшны, это может быть удобным обходным путем, пока вы совершенствуете свои vim отбивные.

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

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

Ctrl+Shift+v.

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

 :set paste 

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

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

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

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


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

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

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

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

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

Это будут строки, которые вам нужны в вашем 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

Linux

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

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

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

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

Shift+ Правый клик -> Вставить

сделал трюк для меня

буфер обмена

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

    "*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

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

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

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

Нажмите "*p

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

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

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

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

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

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

Эти комбинации клавиш работают на любой ОС.

Выберите целевой текст с помощью мыши и обратитесь к последовательностям клавиш для копирования, вырезания и вставки.

  • копия: Ctrl+Del
  • вставить: Shift+Insert
  • вырезать: Shift+Del
  • вставить: Shift+Insert

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

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

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

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

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

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

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

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

Что у меня просто сработало в Linux (Ubuntu 20.04)

  • Копирование в системный буфер обмена:

    1. Выберите то, что вы хотите скопировать в визуальном режиме.
    2. Тип "+y
    3. Нажмите Enter
  • Вставьте что-нибудь из системного буфера обмена:

    1. Переместитесь в то место, куда вы хотите вставить скопированный текст в vim.
    2. Просто введите "+P вставить перед курсором / "+p вставить после курсора.

Чтобы узнать больше, как это работает : Скопируйте и вставьте в / из Vim из / в другие программы!

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

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

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

command Clip r !parcellite -c

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

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

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

 :set paste 

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

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

Я столкнулся с этой проблемой на MacBook Pro в середине 2017 года vim в iTerm2 как моя основная среда разработки.

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

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

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

Исходя из ответа Коннера, это было здорово, но 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

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

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

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

Если он у вас есть, попробуйте удалить его из своего vimrc: установите mouse=a

Это портит функциональность прошлого.

Если вы используете 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 и вставьте его по всей системе.

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

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

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

Основываясь на ответе @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

В качестве альтернативы можно использовать ключи, вдохновленные глаголами Vim "yank", "delete" и "put": <C-y>, <C-d> а также <C-p> соответственно. Это переопределит только одно сопоставление по умолчанию:

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

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

Еще один способ вставки - просто прочитать вывод 'cat':

      :r!cat

это запустит кошку на переднем плане, поэтому вы можете отправить на терминал то, что хотите вставить/иметь в буфер обмена. после того, как вы закончите, отправьте Ctrl + D, чтобы закончить поток.

преимущество в том, что вам не нужно возиться с отступами — текст вставляется прямо как есть. Обратите внимание, что на месте cat может быть любая команда, например fold (я использовал ее, пока не обнаружил gq) или любая другая утилита фильтрации.

Хотя регистр '+' кажется более динамичным, он работает не на всех платформах, а r!cat просто работает.

'запись может быть использована для выбора канала/диапазона на стандартный ввод внешней утилиты. пример для системы X для копирования в буфер обмена:

      `<,`>:w !xsel -ib

(т.е. сделать визуальный выбор и ввести)

мои привязки:

      " ctrl+k y while in visual mode 
vnoremap <silent> <expr> <C-K>y ':w !xsel -ib<CR><CR>'
" copy from yank register while in normal mode
nnoremap <C-K>y :call system("xsel -ib", getreg("@0"))<CR>
nnoremap <C-K>r :r!cat<CR><CR>

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

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

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

Б-30

Другие вопросы по тегам