WSL上的Vim:同步系统剪贴板吗?(设置剪贴板^ =未命名)?


12

在使用WSL /猛砸对于Windows我希望能够使用y yy 3yp以同样的方式,他们总是在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>

但是在我看来,这是一个非常可怕的解决方案...它使复制过程分为两个步骤...

当然,我可以使用mouse / shift + ins进行一些复制和粘贴,但是我认为必须有一种方法可以使这种同步在Vim中正常工作。


Answers:


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>(不起作用...)
Tropilio

4

那这个呢?

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

uname是一个Linux终端命令,它返回OS信息,以便Linux为WSL 返回。带有-r标志的命令返回OS的发行信息,因此它应包括“ Windows”。

TextYankPost是一个Vim的事件(见:h TextYankPostvim),其中检测文本抽出活动。

clip.exe是WSL中Windows命令提示符的命令(请参见CLIP /?命令提示符),可通过或从中复制text或返回command到clipbord中。这是通过vim函数从vim执行的。text | clip.execommand | clip.execlip.exesystem


在Neovim中,可以使用has('wsl')代替system('uname -r') =~ "Microsoft"
贾斯汀·凯斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.