Vim auf WSL: Systemzwischenablage synchronisieren? (Zwischenablage setzen ^ = unbenannt)?

12

Während ich WSL / Bash für Windows verwende, möchte ich in der Lage sein, y yy 3yund pimmer so, wie sie immer in vim funktionieren, aber eine Verbindung zur System-Zwischenablage herstellen, die von allen Apps gemeinsam genutzt wird, nicht zur internen Zwischenablage von vim ... Ich habe bereits das Gleiche, um die Zwischenablage zu verwalten Geschichte.

Es scheint, dass Vim bereits eine integrierte Option zum Synchronisieren des Kopier- / Einfügepuffers mit der Systemzwischenablage hat ... Das Problem beim Ausführen von WSL ist jedoch, dass Sie tatsächlich verwenden müssen, um /mnt/c/Windows/System32/clip.exeauf die Zwischenablage zuzugreifen ... Also, obwohl ich möchte verwenden können:

set clipboard^=unnamed

Es scheint noch keine WSL-Unterstützung zu haben.

Ich verstehe, dass der Neovim dies als Option hat, aber ich möchte jetzt nicht wirklich mit Neovim experimentieren ...

Im Moment kommt einer Problemumgehung, die ich gefunden habe, am nächsten:

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>

Aber dies ist meiner Meinung nach eine wirklich schreckliche Lösung ... Es macht das Kopieren in zwei Schritten ...

Natürlich kann ich mit der Maus / Umschalt + Ins kopieren und einfügen, aber ich denke, es muss eine Möglichkeit geben, diese Synchronisation in Vim richtig zum Laufen zu bringen.

Ryan Erwin
quelle
Empfehlen Sie diese Lösung superuser.com/a/1439881/711405
ephemerr

Antworten:

9

Ich bin mir bewusst, dass dies eine sehr alte Frage ist, aber ich habe kürzlich eine gute Lösung gefunden. Nach langem Frust stieß ich auf diese Möglichkeiten, durch Kopieren und Einfügen auf die Zwischenablage des Windows-Systems zuzugreifen.

Durch Kopieren mit der vim-Version> = 8.0.1394, wie in einer anderen Antwort angegeben: /vi//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

Einfügen, Zuordnen zu gefälschten Registrierungsbefehlen, dh "= p oder" + p oder was auch immer.

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>

Das Einfügen mit der rechten Maustaste funktioniert, ist jedoch unbefriedigend, wenn Sie die Maus nicht verwenden möchten

Fragezeichen
quelle
Auf WSL habe viich hinzugefügtnnoremap <S-Insert> :r !powershell.exe -Command "& {Get-Clipboard}"<Enter>
Walter A
4

Was ist damit?

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

unameist ein Linux-Terminalbefehl, der Betriebssysteminformationen zurückgibt, sodass er Linuxfür die WSL zurückgegeben wird. Während mit -rflag der Befehl Release-Informationen des Betriebssystems zurückgibt, sollte er "Windows" enthalten.

TextYankPostist ein vim-Ereignis (siehe :h TextYankPostin vim), das Ihre Text-Ruck-Aktivität erkennt.

clip.exein WSL ist ein Befehl , der Windows - Eingabeaufforderung (siehe CLIP /?in Eingabeaufforderung) , die Kopie textvon einem oder Rückkehr commandin clipbord über text | clip.exeoder command | clip.exe. Hier clip.exewird die Funktion vim by vim ausgeführt system.

aohmusi
quelle
in Neovim kann man has('wsl')anstelle von verwenden system('uname -r') =~ "Microsoft".
Justin M. Keyes
2

Ich habe vor einiger Zeit eine PR für die WSL-Unterstützung für Fakeclips erstellt.

Siehe vimawesome auf , wie es zu installieren; help fakeclipzur Verwendung.

Laktak
quelle
Immer noch gepflegt?
Chris