Я использовал "+y
для копирования текста в системный буфер обмена, но он не работает в vim Bash в Windows.
Как "скопировать в буфер обмена" в 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
:
РЕДАКТИРОВАТЬ: Это работает только с текстом, который помещается на экране все сразу; его нельзя использовать для копирования блоков текста, которые охватывают множество "экранов"
Ответ 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
.
Ответ 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, готово!