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

12

При использовании WSL / Bash для Windows я хочу иметь возможность использовать один y yy 3yи pтот же способ, которым они всегда работают в vim, но подключаться к системному буферу обмена, который используется всеми приложениями, а не к внутреннему буферу обмена vim ... У меня уже есть возможность управлять буфером обмена. история.

Кажется, что Vim уже имеет встроенную опцию для синхронизации буфера копирования / вставки с системным буфером обмена ... Но проблема при запуске WSL заключается в том, что вам действительно нужно использовать /mnt/c/Windows/System32/clip.exeдля доступа к буферу обмена ... Так что, хотя я хотел бы чтобы иметь возможность использовать:

set clipboard^=unnamed

Кажется, у него пока нет поддержки WSL.

Я понимаю, что у neovim это возможно, но я не хочу сейчас экспериментировать с 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

Ответы:

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>
Уолтер
Спасибо за полезный ответ! Мне было интересно, можно ли будет также использовать поддельный регистр для команды 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.

aohmusi
источник
в Neovim можно использовать has('wsl')вместо system('uname -r') =~ "Microsoft".
Джастин М. Киз
2

Я сделал пиар для поддержки WSL, чтобы подделать некоторое время назад.

Смотрите vimawesome о том, как его установить; help fakeclipдля использования.

laktak
источник
Все еще поддерживается?
Крис