Vim su WSL: sincronizzare gli appunti di sistema? (imposta appunti ^ = senza nome)?


12

Durante l'utilizzo di WSL / Bash per Windows, voglio essere in grado di utilizzare y yy 3ye pallo stesso modo in cui funzionano sempre in VIM, ma collegandomi agli Appunti di sistema condivisi da tutte le app, non agli Appunti interni di Vim ... Ho già idem per gestire gli Appunti storia.

Sembra che Vim abbia già un'opzione integrata per sincronizzare il buffer di copia / incolla con gli appunti di sistema ... Tuttavia il problema durante l'esecuzione di WSL è che devi effettivamente utilizzare /mnt/c/Windows/System32/clip.exeper accedere agli appunti ... Quindi anche se mi piacerebbe per poter usare:

set clipboard^=unnamed

Non sembra avere ancora il supporto WSL.

Capisco che Neovim ha questa opzione, ma non voglio davvero sperimentare Neovim in questo momento ...

Per ora, la cosa più vicina a una soluzione alternativa che ho trovato è:

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>

Ma questa è una soluzione davvero orribile secondo me ... Rende la copia un processo in due passaggi ...

Ovviamente posso fare un po 'di copia e incolla con il mouse / shift + ins, ma penso che ci debba essere un modo per far funzionare correttamente questa sincronizzazione in Vim.


Raccomanda questa soluzione superuser.com/a/1439881/711405
ephemerr il

Risposte:


10

Sono consapevole che questa è una domanda molto vecchia, ma di recente ho trovato una buona soluzione. Dopo molte frustrazioni, mi sono imbattuto in questi modi per accedere agli appunti del sistema di Windows copiando e incollando.

Copiando, con la versione vim> = 8.0.1394, come indicato in un'altra risposta 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

Incollare, mappare su falsi comandi di registro, ad esempio "= p o" + p o altro.

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>

L'incollamento con il tasto destro del mouse funziona, ma non è soddisfacente se non si desidera utilizzare il mouse


Su WSL viho aggiuntonnoremap <S-Insert> :r !powershell.exe -Command "& {Get-Clipboard}"<Enter>
Walter A

Grazie per la risposta utile! Mi chiedevo se sarebbe stato possibile utilizzare anche un registro falso per il comando yank. Qualcosa del genere noremap "+y :exe 'norm a'.system('echo '.shellescape(join(v:event.regcontents, "\<CR>")).' | clip.exe')<CR>(che non funziona ...)
Tropilio il

4

Che dire di questo?

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

unameè un comando del terminale Linux che restituisce informazioni sul sistema operativo, in modo tale da restituire Linuxper WSL. Considerando che con -rflag, il comando restituisce le informazioni di rilascio del sistema operativo, quindi dovrebbe includere "Windows".

TextYankPostè un evento vim (vedi :h TextYankPostin vim), che rileva la tua attività di copia del testo.

clip.exeè un comando del prompt dei comandi di Windows in WSL (vedere CLIP /?nel prompt dei comandi) che copia texto ritorna da un commandclipbord tramite text | clip.exeo command | clip.exe. Qui clip.exeviene eseguito da vim con la funzione vim system.


in Neovim si può usare al has('wsl')posto di system('uname -r') =~ "Microsoft".
Justin M. Keyes,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.