Как "скопировать в буфер обмена" в vim из Bash в Windows?

Я использовал "+y для копирования текста в системный буфер обмена, но он не работает в vim Bash в Windows.

Ответ 1

Поскольку ни "* y, ни" +y (...) не работают, альтернативой является следующее:

Добавьте это в .vimrc и создайте файл с именем ~/.vimbuffer

" copy (write) highlighted text to .vimbuffer
vmap <C-c> y:new ~/.vimbuffer<CR>VGp:x<CR> \| :!cat ~/.vimbuffer \| clip.exe <CR><CR>
" paste from buffer
map <C-v> :r ~/.vimbuffer<CR>

Выделите любой текст с помощью визуального или визуального блока и нажмите ctrl-c. Вставьте скопированный текст за пределы вашего терминала, используя обычный метод или вставьте скопированный текст в любую область vim, используя ctrl-v в обычном или визуальном режиме.

Ctrl-c восстанавливает выделенный текст, перезаписывает ~/.vimbuffer выделенным текстом, запускает команду UNIX для передачи данных из ~/.vimbuffer в clip.exe.

Любое дальнейшее улучшение (например, приведение команды в молчание) высоко ценится!

Изменить:  Теперь команда может копировать строки любой длины, а не только целые строки. Старая команда:

vmap <C-c> :w! ~/.vimbuffer \| !cat ~/.vimbuffer \| clip.exe <CR><CR>

Ответ 2

Чтобы скопировать в буфер обмена изнутри vim в Bash на Windows 10, удерживайте Shift и перетащите курсор на текст. затем нажмите enter

Выбор должен выглядеть следующим образом перед нажатием enter:

Selection should look like this before pressing ENTER

РЕДАКТИРОВАТЬ: Это работает только с текстом, который помещается на экране все сразу; его нельзя использовать для копирования блоков текста, которые охватывают множество "экранов"

Ответ 3

Если вы не хотите настраивать X-сервер, этот метод позволит вам скопировать выделенный текст в буфер обмена с помощью программы clip.exe поставляемой с Windows.

Фрагменты кода ниже могут быть помещены в ваш файл .vimrc.

Сначала создайте вспомогательную функцию, которая будет возвращать выбранный текст в виде строки. Мы можем использовать эту функцию для clip.exe выделенного текста в clip.exe:

func! GetSelectedText()
    normal gv"xy
    let result = getreg("x")
    return result
endfunc

system функция позволит нам вызывать собственные программы и передавать параметры в них. Фрагмент ниже устанавливает два сопоставления клавиш; первая строка позволяет использовать Ctrl + C для копирования текста, а вторая - Ctrl + X для вырезания текста:

noremap <C-C> :call system('clip.exe', GetSelectedText())<CR>
noremap <C-X> :call system('clip.exe', GetSelectedText())<CR>gvx

После сохранения изменений в вашем файле .vimrc вы должны быть готовы.

Если вы собираетесь использовать ваш .vimrc в нескольких системах, я предлагаю обернуть эти сопоставления в оператор if чтобы проверить, существует ли clip.exe самом деле:

if !has("clipboard") && executable("clip.exe")
    noremap <C-C> :call system('clip.exe', GetSelectedText())<CR>
    noremap <C-X> :call system('clip.exe', GetSelectedText())<CR>gvx
endif

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

Вы также можете добавить привязки клавиш, когда vim имеет доступ к буферу обмена, например:

if has("clipboard")
    vnoremap <C-X> "+x
    vnoremap <S-Del> "+x

    vnoremap <C-C> "+y
    vnoremap <C-Insert> "+y

    map <C-V>       "+gP
    map <S-Insert>      "+gP

    cmap <C-V>      <C-R>+
    cmap <S-Insert>     <C-R>+
endif

Что пригодится, если вы используете Vim изначально в Windows или используете vim-gtk в системе Linux.

Ответ 4

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

:w !clip.exe

clip.exe в clip.exe. Если вам нужны конкретные строки, скажем, от 2 до 10, вы можете просто сделать :2,10w !clip.exe.

См. Буферизация буфера к внешней команде в Vim

Ответ 5

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

Или вы можете попробовать:

  • Установите VcXsrv и запустите его.
  • export DISPLAY=localhost:0 в WSL Bash.
  • Запустите vim-gtk или vim-gnome (или любые другие приложения GUI) и попробуйте Clipboard в Linux и Windows.

Ответ 6

Объединяя вышеприведенную информацию, можно скопировать простой текст из любого регистра в буфер обмена, не используя привязку клавиш (что может быть более удобным в некоторых случаях). Например, если вы хотите скопировать последний восстановленный текст в буфер обмена Windows, введите следующую команду (начните печатать):

:call system('clip.exe', '

Теперь нажмите Ctrl + r, а затем регистр +. Будет вставлен текст из указанного регистра. Затем закройте одинарные кавычки и скобки. Команда будет выглядеть так:

:call system('clip.exe', 'a text from 0 register')

Нажмите Enter, готово!