Come posso copiare il testo negli Appunti di sistema da Vim?


284

C'è un modo per copiare un blocco di testo negli Appunti di sistema, così posso incollarlo in un altro programma?


12
Questo è già stato chiesto e risposto su SO. È possibile trovare informazioni più e diverse lì.
bsmith89,

1
Ho usato questo plugin su macvim christoomey / vim-system-copy e lo adoro davvero. Funziona davvero bene con movimenti cpip, cpi{.
Filtra il

2
Ciò di cui hai veramente bisogno è EasyClip . Farà proprio questo e molto altro ancora ...
Scott Wade,

Risposte:


324

Per i sistemi basati su X11 (es. Linux e la maggior parte degli altri sistemi simili a UNIX ) ci sono due appunti che sono indipendenti l'uno dall'altro:

  • PRIMARY: copia su selezione e può essere incollato con il pulsante centrale del mouse.
  • CLIPBOARD - Questo viene copiato (di solito) ^Ce incollato con ^V(È come MS Windows).

I sistemi OS X e Windows hanno solo un blocco appunti.

Per i sistemi X11 ci sono anche numerosi strumenti che sincronizzano questi appunti per te; quindi se sembrano essere gli stessi, potresti averne uno in esecuzione.

Vim ha due registri speciali corrispondenti a questi appunti:

  • *usa PRIMARY; mnemonico: S tar è S eletti (per copia-on- s eletto)
  • +usa CLIPBOARD; mnemonico: CTRL PLUS C (per il keybind comune)

Su Windows e OS X non vi è alcuna differenza tra +e *, poiché questi sistemi hanno solo un singolo blocco appunti ed entrambi i registri si riferiscono alla stessa cosa (non importa quale si utilizza).

È possibile utilizzare questi registri come qualsiasi registro. Ad esempio, utilizzando gli Appunti PRIMARY *con i comandi ye p:

  • "*yy
  • "*p

Potresti forse usarlo come combinazioni di tasti più convenienti:

noremap <Leader>y "*y
noremap <Leader>p "*p
noremap <Leader>Y "+y
noremap <Leader>P "+p

Se si desidera interfacciarsi "automaticamente" con gli Appunti del sistema anziché fare riferimento ad esso manualmente in qualsiasi momento, è possibile impostare la clipboardvariabile:

  • Impostalo per unnamedl'uso *(PRIMARY, su select)
  • Impostalo per unnamedplusl'uso +(CLIPBOARD, ^C)

Ora, solo usando yyandrà negli appunti del sistema, invece del registro senza nome di Vim, e pincollerà gli appunti del sistema.

Puoi anche assegnare a questi registri proprio come qualsiasi registro con let:

  • :let @+=42
  • :let @*=42

L' clipboardimpostazione ha alcune altre opzioni (come i filtri di esclusione); ma queste sono le basi. Vedi :help 'clipboard'per la storia completa ;-)

gVim

Se si utilizza gVim, è possibile ottenere un comportamento di copia su selezione durante l'utilizzo :set guioptions+=a.
Questo è abilitato di default sui sistemi X11 (copie su PRIMARY), ma non su MS Windows e OSX (poiché la selezione di qualsiasi testo sovrascriverebbe gli Appunti).

No +clipboard?

Vim richiede il +clipboardflag di funzionalità per far funzionare tutto ciò; puoi verificare se il tuo Vim ha questo usando :echo has('clipboard')da Vim (se l'output è 0, non è presente, se lo è 1, lo è) o controllando l'output di vim --versionper +clipboard.

La maggior parte delle distribuzioni Linux viene fornita con una build Vim "minima" per impostazione predefinita, che non ha +clipboard, ma di solito è possibile installarla:

  • Debian e Ubuntu: installa vim-gtko vim-gnome.
  • Fedora: installa vim-X11ed esegui vimxinvece di vim( maggiori informazioni ).
  • Arch Linux: installa gvim(questo abiliterà anche +clipboardper il normale vim).

È inoltre possibile utilizzare xclip, xcopyo xselper copiare il testo negli Appunti; vedere le seguenti domande per le soluzioni:

SSH

È inoltre possibile utilizzare gli Appunti su macchine remote se si abilita l'inoltro X11 su SSH. Ciò è particolarmente utile con il suggerimento sopra dato che è quindi possibile utilizzare xclipper accedere agli Appunti del desktop. Il Vim sulla macchina che stai cercando avrà ancora bisogno della +clipboardfunzione.

Ciò richiede l' ForwardX11Trustedimpostazione e deve essere eseguito solo con server attendibili , poiché ciò fornisce al server il controllo quasi completo sulla sessione X11:

$ ssh -XY myhost

Per rendere persistenti queste impostazioni (quindi non è necessario aggiungerle -XYogni volta), potresti fare qualcosa del genere nel tuo ~/.ssh/config:

# Do **NOT** set this globally; it gives the server complete control over
# your X11 session.
Host myhost
    ForwardX11 yes
    ForwardX11Trusted yes

Neovim

Neovim ha rinnovato il supporto degli appunti. L'interfaccia incorporata è stato rimosso e sostituito con un sistema che chiama un'utilità esterno come xclip, xselo pbcopy/ pbpaste.

Dovrebbe raccogliere automaticamente queste utility e usarle. Su OS X pbcopy e pbpastedovrebbe essere disponibile per impostazione predefinita, su Linux probabilmente desideri installarlo xclip, poiché è il più ampiamente disponibile (in realtà ci sono due versioni di xselcon flag incompatibili . Questo è davvero stupido).

Vedi anche :help clipboardin Neovim.


6
ssh -Y implica -X, quindi -X può essere omesso.
Hildred

Per alcune tastiere internazionali, potrebbe essere necessario premere "<Space>per ottenere un ". Quindi in quei casi dovresti premere "<Space>+yo "<Space>*ycopiare.
Arthur F,

1
Un effetto collaterale molto interessante dell'apprendimento di questo (alcuni anni fa) per me è stata la realizzazione che "può selezionare molti registri nominati. "+non è magico, è solo un registro +. Così, per esempio, se si desidera copiare tre cose allo stesso tempo e incollare ciascuno di loro uno per uno, è possibile "1y, "2yed "3ye più tardi "1p, "2pe "3p. Questo è davvero potente e inesistente in quasi tutti gli altri editor. Un altro uso interessante è guardare le macro memorizzate. Ad esempio, se registri con qq, ma ti rendi conto che devi correggerlo, puoi: in una linea temporanea "qp, ripararlo e "qd.
Shahbaz,

1
Solo una nota: OS X ha due appunti separati. Uno è accessibile usando Cmd-C e Cmd-V e l'altro usando le combinazioni di tasti emacs Ctrl-K e Ctrl-Y.
BallpointBen,

3
@shahbaz - probabilmente è meglio usare i registri delle lettere per tale scopo, poiché quelli numerati vengono cambiati ogni volta che il testo viene eliminato.
evilsoup,

18

Le altre risposte spiegano come copiare il testo dal buffer negli Appunti di sistema. Un'altra operazione comune è quella di copiare il testo da un altro registro negli Appunti. Ad esempio, se hai già strappato del testo "(il registro predefinito), potresti voler caricare quel registro negli appunti.

Puoi farlo con :let:

  • let @+=@" - copia il registro predefinito negli appunti
  • let @*=@" - copia il registro predefinito nella selezione primaria X11 ("appunti del mouse")
  • let @+=@a- copia dal registro anegli appunti
  • eccetera.

Nota che questo funziona per i registri in generale: let @a=@bcopia il registro bper registrarti a.


17

Da http://vim.wikia.com/wiki/Accessing_the_system_clipboard

set clipboard=unnamedplus

Ciò modifica il registro Vim predefinito nel +registro, che è collegato agli Appunti di sistema. Da :h clipboard-unnamedplus:

                                        clipboard-unnamedplus
unnamedplus     A variant of the "unnamed" flag which uses the
                clipboard register '+' (quoteplus) instead of
                register '*' for all yank, delete, change and put
                operations which would normally go to the unnamed
                register.  When "unnamed" is also included to the
                option, yank operations (but not delete, change or
                put) will additionally copy the text into register
                '*'.
                Only available with the +X11 feature.
                Availability can be checked with: 
                        if has('unnamedplus')

Perché questo non funziona per me quando yank & paste tra istanze vim (ognuna in un terminale di terminazione separato)?
thinwybk,

Se sei su Linux e Vim è stato compilato con la funzione + X11 e hai appunti = set senza nome, allora dovresti essere in grado di strappare una riga in un'istanza di vim e incollarla in un'altra istanza di vim. Dovresti anche essere in grado di incollarlo in qualsiasi altra applicazione con CTRL + V o MAIUSC + INSERT. Puoi usare :versionVim per vedere se + X11 appare nell'elenco delle funzionalità incluse. Puoi anche verificare se la funzione 'unnamedplus' è disponibile con :if has('unnamedplus')⏎ echo 'yes'⏎ endif Se non sei su Linux, dovresti usare unnamed invece di unnamedplus.
Quincy Bowers,

10

Nelle build che lo supportano, il registro denominato *è negli Appunti di sistema. Per copiare il testo da Vim negli Appunti di sistema, è possibile selezionare il testo usando la modalità visiva, quindi premere "*yper copiarlo negli Appunti di sistema.

Al contrario, utilizzare "*pper incollare il testo dagli Appunti di sistema in Vim.


5

Ti consiglio di usare Gvim e di aggiungerlo a .vimrc:

source $VIMRUNTIME/mswin.vim
behave mswin

Questo consente il supporto per CtrlC, CtrlX, CtrlVcome Blocco note di Windows.

Nota che questo aggiungerà anche alcune altre scorciatoie comuni di Windows, come CtrlSfor :w, CtrlAper selezionare tutto, ecc.


0

Se il tuo vim non supporta +clipboardpuoi utilizzare il plugin fakeclip per Linux, Mac, Windows, tmux, schermo, ...


0

Ogni altra risposta ha coperto tutte le cose importanti sui registri. Vorrei aggiungere un'altra cosa che uso.

C'è un modo in Vim per copiare direttamente negli Appunti il ​​testo selezionato visivamente . Metti questo nel tuo file vimrc :

set guioptions+=a

E, con questo ogni volta che selezioni visivamente del testo, questo verrà copiato negli appunti. Per ulteriori informazioni su questo,:help guioptions

A proposito, questo è solo per gVim.


2
guioptions+=aè anche menzionato nella risposta di Carpetsmoker.
Muru,

@muru Sì, scusa. Non l'ho visto prima. L'ho appena visto.
Durga Swaroop,

0

Puoi anche usare un comando globale per inserire un motivo specifico negli appunti. Può essere utile in situazioni in cui hai informazioni sparse in un file e la gestione manuale è soggetta a errori e stanchezza.

Pulisci prima il registro che riceverà le informazioni

:let @a=""

Quindi copia tutte le righe contenenti il ​​motivo su di esso

:g/pattern/yank A

Infine, trasferire (copiare) le informazioni negli Appunti di sistema

:let @+=@a

se provi a copiare ogni riga contenente un "pattern" direttamente negli Appunti, non funzionerà perché gli Appunti non hanno la capacità di aggiungere nuovi contenuti, quindi stiamo usando qui un normale registro VIM per memorizzare tutte le linee che contengono il modello in una volta e poi mettendolo negli appunti.

OBS: è necessario clastare il registro prima di utilizzarlo e l'uso della versione MAIUSCOLA del registro ci consente di aggiungere contenuto, altrimenti non funzionerà neanche.


0

Se non riesci a capire come andare +clipboardal lavoro, cosa che non ho potuto per qualche motivo, allora puoi farlo.

Supponendo che tu voglia solo copiare una sezione del file, faccio shift+ vper entrare in modalità visiva ed evidenziare solo le linee che voglio copiare. Quindi faccio questo.

# Linux Wayland
:'<,'>w !wl-copy

# Linux Xorg
:'<,'>w !xclip -selection clipboard

Spiegazione

  • '<,'> - significa che hai utilizzato la modalità visiva per selezionare un intervallo (non digitare questo)
  • w !{cmd}- scrivere l'intervallo sullo stdin di cmd, vedere di più su:help w_c
  • wl-copye xclipsono programmi a cui puoi reindirizzare il testo e lo aggiungeranno agli appunti di sistema

Inoltre, una volta che questo è nella tua storia, non devi digitare di nuovo l'intera cosa. Basta selezionare con la modalità visiva, digitare wquindi premere su e il comando dovrebbe essere completato automaticamente. Inoltre, non è necessario utilizzare la modalità visiva. È possibile impostare qualsiasi intervallo desiderato.

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.