Vim на WSL: синхронізувати буфер обміну системи? (встановити буфер обміну ^ = без імені)?


12

При використанні WsL / Bash для Windows , я хочу , щоб мати можливість використовувати y yy 3yі pтак само , як вони завжди працюють в Vim, але підключення до системи буфера обміну загальними для всіх додатків, а не внутрішні буфер обміну Vim ... Я вже піддакувати для управління буфером обміну історія.

Здається, що у Vim вже є вбудована опція для синхронізації буфера копіювання / вставки з буфером обміну системи ... І все ж проблема під час запуску WSL полягає в тому, що ви насправді потрібно використовувати /mnt/c/Windows/System32/clip.exeдля доступу до буфера обміну ... Тож хоч я хотів би вміти користуватися:

set clipboard^=unnamed

Схоже, ще немає підтримки WSL.

Я розумію, що у neoovim це є як варіант, але я не хочу зараз експериментувати з neovim ...

Поки що найближче до вирішення, яке я знайшов, - це:

nnoremap <silent> <leader>y :call system('/mnt/c/Windows/System32/clip.exe', @0)<CR>
vnoremap <silent> <leader>y :call system('/mnt/c/Windows/System32/clip.exe', @0)<CR>

Але, на мою думку, це справді жахливе рішення ... Копіювання робить процес в два етапи ...

Звичайно, я можу зробити копію та вставити за допомогою миші / shift + ins, але я думаю, що повинен бути спосіб, щоб ця синхронізація працювала належним чином у Vim.


Рекомендуйте це рішення superuser.com/a/1439881/711405
ephemerr

Для тих , хто використовує Neovim , що знайшов це питання, см github.com/neovim/neovim/wiki / ... .
Андрій Кайпов

Відповіді:


10

Я знаю, що це дуже давнє питання, але нещодавно я знайшов хороше рішення. Після сильних розладів я натрапив на ці способи отримати доступ до буфера обміну системи Windows шляхом копіювання та вставки.

Скопіювавши, з версією vim> = 8.0.1394, як зазначено в іншій відповіді https://vi.stackexchange.com/a/15190

let s:clip = '/mnt/c/Windows/System32/clip.exe' 
if executable(s:clip)
    augroup WSLYank
        autocmd!
        autocmd TextYankPost * call system('echo '.shellescape(join(v:event.regcontents, "\<CR>")).' | '.s:clip)
    augroup END
end

Вставлення, відображення підроблених команд реєстру, тобто "= p або" + p або будь-якого іншого.

map <silent> "=p :r !powershell.exe -Command Get-Clipboard<CR>
map! <silent> <C-r>= :r !powershell.exe -Command Get-Clipboard<CR>

" I thought this will be better :)
noremap "+p :exe 'norm a'.system('/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Command Get-Clipboard')<CR>

Обклеювання правою кнопкою миші працює, але незадовільно, якщо ви не хочете користуватися мишкою


На WSL viя додавnnoremap <S-Insert> :r !powershell.exe -Command "& {Get-Clipboard}"<Enter>
Walter A

Дякуємо за корисну відповідь! Мені було цікаво, чи можна також використовувати підроблений реєстр для команди yank. Щось на кшталт noremap "+y :exe 'norm a'.system('echo '.shellescape(join(v:event.regcontents, "\<CR>")).' | clip.exe')<CR>(що не працює ...)
Тропіліо

4

Як що до цього?

if system('uname -r') =~ "Microsoft"
  augroup Yank
    autocmd!
    autocmd TextYankPost * :call system('clip.exe ',@")
  augroup END
endif

unameце команда терміналу Linux, яка повертає інформацію про ОС, така що вона повертається Linuxдля WSL. Тоді як з -rпрапором команда повертає інформацію про випуск ОС, таким чином, вона повинна містити "Windows".

TextYankPost- це подія vim (див. :h TextYankPostв vim), яка виявляє вашу активність у текстовому вигуку.

clip.exeце командна команда Windows в командному рядку WSL (див. CLIP /?командний рядок), яка копіює textабо повертається з commandкліпборда через text | clip.exeабо command | clip.exe. Тут clip.exeвиконується функція vim функцією vim system.


в Neovim можна використовувати has('wsl')замість system('uname -r') =~ "Microsoft".
Джастін М.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.