Come fare vim paste dagli appunti di sistema (e copiarli)?


772

A differenza di altri editor, vim memorizza il testo copiato negli appunti. Quindi, è molto difficile per me copiare del testo da una pagina Web e incollarlo nel file di lavoro corrente. Succede quindi che devo aprire gedit o digitarlo manualmente.

Posso creare VIM Incolla da e negli Appunti del sistema?



7
Copia "+ y Paste" + p Funziona proprio come yank and paste tranne che tu abbia specificato prima il registro.
Banjocat,

2
Per usare i seguenti comandi, assicurati di aver fatto sudo apt-get install vim-gnome ciò che aggiungerà quella funzionalità a vim incorporato dell'uso degli appunti di sistema.
Harnirvair Singh,

2
@Harnirvair Per molti gruppi di lettori qui, vim-gnomeè probabilmente eccessivo o semplicemente non disponibile nel loro sistema operativo / distro, mentre sospetto vim-gtke preferibilmente vim-gtk3hanno maggiori probabilità di esistere e tirare meno dipendenze, fornendo comunque l'integrazione degli appunti (almeno per quelli ancora su X11; Non sono sicuro di come tutto questo interagisca con Wayland).
underscore_d

3
Di default su Fedora - non c'è accesso agli appunti (hai bisogno di gvim), superuser.com/questions/194747/…
icc97

Risposte:


881

I registri "*e "+sono per gli appunti del sistema ( :help registers). A seconda del sistema in uso, potrebbero fare diverse cose. Ad esempio, su sistemi che non utilizzano X11 come OSX o Windows, il "*registro viene utilizzato per leggere e scrivere negli Appunti di sistema. Sui sistemi X11 è possibile utilizzare entrambi i registri. Vedi :help x11-selectionper maggiori dettagli, ma fondamentalmente "*è analogo alla selezione PRIMARY di X11 (che di solito copia le cose che selezioni con il mouse e le paste con il pulsante centrale del mouse) ed "+è analogo alla selezione CLIPBOARD di X11 (che è la clipboard corretta).

Se tutto ciò ti è passato per la testa, prova a usare "*yyo "+yyper copiare una linea negli appunti del tuo sistema. Supponendo di avere le opzioni di compilazione appropriate, l'una o l'altra dovrebbe funzionare. Potresti riassegnarlo a qualcosa di più conveniente per te. Ad esempio, è possibile inserire vnoremap <C-c> "*y~ / .vimrc in modo da poter selezionare visivamente e premere Ctrl+ cper trascinare negli appunti del sistema.

Tieni presente che la copia / incolla dagli Appunti di sistema non funzionerà se :echo has('clipboard')restituisce 0. In questo caso, vim non viene compilato con la +clipboardfunzione e dovrai installare una versione diversa o ricompilarla. Alcune distribuzioni Linux forniscono un'installazione minima di vim per impostazione predefinita, ma in genere se si installa il pacchetto vim-gtkovim-gtk3 è possibile ottenere le funzionalità extra.

Potresti anche dare un'occhiata 'clipboard'all'opzione descritta in :help cb. In questo caso è possibile :set clipboard=unnamedo :set clipboard=unnamedplusfare in modo che tutte le operazioni di strappo / cancellazione vengano copiate automaticamente negli Appunti di sistema. Questo potrebbe essere un inconveniente in alcuni casi in cui stai memorizzando qualcos'altro negli appunti in quanto lo sovrascriverà.

Per incollare puoi usare "+po "*p(di nuovo, a seconda del tuo sistema e / o selezione desiderata) oppure puoi mapparli su qualcos'altro. Li scrivo esplicitamente, ma mi trovo spesso in modalità inserimento. Se sei in modalità inserimento, puoi ancora incollarli con il rientro corretto utilizzando <C-r><C-p>*o <C-r><C-p>+. Vedere :help i_CTRL-R_CTRL-P.

Vale anche la pena menzionare l' pasteopzione di vim ( :help paste). Questo mette vim in una speciale "modalità incolla" che disabilita molte altre opzioni, che consente di incollare facilmente in vim usando l'emulatore di terminale o il familiare collegamento di incolla del multiplexer. Basta digitare :set pasteper abilitarlo, incollare il contenuto e quindi digitare :set nopasteper disabilitarlo. In alternativa, è possibile utilizzare l' pastetoggleopzione per impostare un codice chiave che attiva / disattiva la modalità ( :help pastetoggle). Ti consiglio di usare i registri invece di queste opzioni, ma se sono ancora troppo spaventosi questo può essere una soluzione alternativa conveniente mentre stai perfezionando le tue costolette.

Vedi :help clipboardper informazioni più dettagliate.


104
Questo è molto istruttivo, ma puoi riassumere quali sequenze di tasti è necessario fare per incollare dagli appunti di sistema ... per esempio cosa si sta facendo "*p? Devo premere Maiusc- ', quindi Maiusc-8, quindi p, ecc.?
T. Brian Jones,

11
Sì, digita questi tre caratteri in sequenza. Molti comandi in vim utilizzano la cosiddetta "modalità operatore in sospeso" in cui viene premuto un tasto e quindi vim attende altri tasti. Prendi ddad esempio. Il primo dentra in modalità operatore in sospeso, quindi il secondo dtermina il comando ed elimina la riga. Se si digita dG, tuttavia, lo Gfa eliminare alla fine del file anziché semplicemente eliminare la riga. I registri usano questo stesso principio per consentire a vari comandi di usarli.
Conner,

4
Ahimè! Se avessi visto questo post solo oggi! Questo è tutto ciò che desideravo sapere sulla copia e incolla dagli appunti di sistema. "<Cr> <Cp> * o <Cr> <Cp> +" è oro puro.
Keith Pinson,

55
Un'enfasi: è necessario installare il vim-gtkpacchetto (almeno in Debian), per ottenere Vim che viene compilato +xterm_clipboard. Mi ci sono voluti 40 minuti per scoprirlo, e solo pochi secondi per sudo apt-get install vim-gtk.
Dominykas Mostauskis,

3
Anche @DominykasMostauskis vim-gnomefunziona e ha +xterm_clipboardabilitato.
Chev,

155

Puoi copiare in vim tramite il collegamento di gnome-terminal per incollare. Crea il file in modalità inserimento e usa

Ctrl+ Shift+ v.

Ricorda in anticipo di

 :set paste 

per evitare di fare casini con il rientro.


20
questo confonde con il rientro se ci sono più righe come Python per loop
Moj

11
Utilizzare un interruttore incolla per la modalità di inserimento. Ad esempio set pastetoggle = <F2> Quindi in modalità insert, premi <F2> e quindi inserisci il tuo codice Python.
Jan Weitz,

Sì, copia con Ctrl + Maiusc + c e incollalo in un altro file
neel

1
se le schede / spazi bianchi, le eol ecc. sono mostrate come caratteri visibili (tramite l'opzione listchars), allora quei caratteri sostitutivi verranno copiati invece di quelli nascosti.
user907860

2
Questa dovrebbe essere la risposta selezionata data la sua concisa risposta
Aidin,

41

Linux

Sul mio sistema Linux, i registri +e si *mappano su una selezione X11, che può essere incollata con il pulsante centrale del mouse. Quando :set clipboard=unnamede :set clipboard=unnamedplusvengono utilizzati, i registri vengono mappati negli Appunti e possono essere incollati con CTRL-V.

Le specifiche sembrano essere in qualche modo dipendenti dalla configurazione e dal sistema, quindi il tuo chilometraggio varierà sicuramente. Dovrebbe sicuramente farti puntare nella giusta direzione, però.

Guarda anche

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


2
*Associa solo al registro primario X11 (che viene normalmente incollato dal mouse). +si associa al registro degli appunti X11 normalmente incollato dalle scorciatoie.
ZyX,

@ZyX Non sul mio sistema, ma il tuo chilometraggio può certamente variare. È preferibile configurare esplicitamente il comportamento desiderato se si desidera un'esperienza coerente su piattaforme e versioni software.
Todd A. Jacobs,

Credo che significhi che hai un gestore di appunti come klipper / glipper, sono in grado di sincronizzare due buffer. Non cambia il fatto che vim usi *per primaria e +per appunti registri X11, si può vedere questo nella fonte vim: questi valori sono impostati lì e non modificati, e clip_stare clip_plussono sempre utilizzato per *e +, rispettivamente, i registri.
ZyX,

41

Per me quella configurazione funziona per la copia e incolla

" copy and paste
vmap <C-c> "+yi
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa

in cosa hai incollato?
StarWind0

Questo IMHO è una soluzione migliore che imposta il clibboard su senza nome, per non pasticciare con gli appunti del SO con ogni azione x / dd / y ecc. E su un Mac potrebbe essere una buona idea cambiare il modificatore C (ctrl) in D per mappare le combinazioni cmd + c / x / v.
mindex,

34

Questa sarebbe la linea di cui hai bisogno nel tuo vimrc per questo scopo:

set clipboard+=unnamed  " use the clipboards of vim and win
set paste               " Paste from a windows or from vim
set go+=a               " Visual selection automatically copied to the clipboard

2
Mi piace la tua soluzione. Vorrei una spiegazione migliore.
Zhon,

eccellente. l'uso dei registri mi fa sempre esitare e devo pensare. È molto meglio
JonnyRaa,

La mia versione di vim ha + appunti e questa opzione non funziona per me. Sto usando Byobu (che usa Tmux sotto il cofano).
Ghe

Ho dovuto aggiungere set appunti + = unnamedplus per Fedora
hakunin il

30

Credo che questa domanda meriti una risposta più obiettiva e grafica:

Accesso alla modalità Incolla

  • ESC
  • : imposta incolla
  • stampa i
  • SHIFT+ Insert(con un testo copiato negli appunti)


Uscita dalla modalità Incolla

  • ESC
  • : imposta nopaste
  • stampa i

Hai incollato il testo e riesci a digitare di nuovo.


1
Ho fatto funzionare tutto questo, ma :set nopastenon fa nulla. Cosa dovrebbe fare? Perché ne ho bisogno?
Marko Avlijaš,

1
Bene, in realtà lo fa. Quando ti esibisci :set nopaste, stai dicendo all'editore che non vuoi più incollare. E quando colpisci i, stai tornando alla modalità di modifica :).
Ivanleoncz,

2
Ad essere sincero con te, Marko, non lo so.
Ivanleoncz,

1
MAIUSC + Inserisci ce l'ha fatta per me, grazie!
Melissa Loos,

1
Questo ha funzionato come un incanto per me. Ogni volta che torno a Vim finisco sempre per avere qualcosa del genere.
benjaminadk,

17

appunti

Esiste un registro speciale per memorizzare questa selezione, è il registro "*. Non viene inserito nulla qui a meno che le informazioni su quale testo sia selezionato stiano per cambiare (ad es. Con un clic sinistro del mouse da qualche parte) o quando un'altra applicazione desidera incolla il testo selezionato. Quindi il testo viene inserito nel registro "*. Ad esempio, per tagliare una linea e renderla la selezione corrente / metterla sulla CLIPBOARD:

    "*dd

Allo stesso modo, quando si desidera incollare una selezione da un'altra applicazione, ad esempio facendo clic con il pulsante centrale del mouse, la selezione viene prima inserita nel registro "*", quindi "put" come qualsiasi altro registro. Ad esempio, per inserire la selezione (contenuto dell'APPARTAMENTO):

    "*p

registra E354

> There are nine types of registers:                      
> 1. The unnamed register ""
> 2. 10 numbered registers "0 to "9
> 3. The small delete register "-
> 4. 26 named registers "a to "z or "A to "Z
> 5. four read-only registers ":, "., "% and "#
> 6. the expression register "=
> 7. The selection and drop registers "*, "+ and "~ 
> 8. The black hole register "_
> 9. Last search pattern register "/

Incolla dagli Appunti

1. Clipboard: Copy
2. Vim insertmode, middle mouse key

Verificare il supporto degli Appunti X11 nel terminale

Quando ti piace eseguire Vim in un terminale, devi cercare una versione di Vim compilata con il supporto degli appunti. Verifica il supporto degli Appunti X11, dalla console, digita:

% vim --version

Se vedi "+ xterm_clipboard", sei a posto.

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

Il server X mantiene tre selezioni, chiamate:

PRIMARY, SECONDARY e CLIPBOARD

La selezione PRIMARY è convenzionalmente utilizzata per implementare la copia e incolla tramite il pulsante centrale del mouse. Le selezioni SECONDARY e CLIPBOARD sono utilizzate meno frequentemente dai programmi applicativi.

http://linux.die.net/man/1/xsel


12

Ho provato i suggerimenti sopra e nessuno di loro ha funzionato nel mio ambiente. (Clone di Windows PuTTY su ssh)

Alcuni googling aggiuntivi sono stati scoperti: /unix/110684/copy-paste-into-sshd-vim-from-local-windows-clipboard

Uno dei commenti ha suggerito l'utilizzo SHIFT+INSERTche ha fatto il trucco per incollare dagli appunti del mio desktop nel buffer di Vim. Ctrl-Cstava già lavorando per copiare negli appunti del desktop da Vim.


2
sto lavorando su VIM all'interno dello strumento cmder [Windows 8.1]. quando vai in impostazioni cmder> chiavi e macro> incolla, ho i comandi shift + insert per incolla multilinea e ctrl + v per incolla su una riga.
Zubair Alam,

1
per me un semplice clic del tasto destro funziona come un fascino !! Basta un clic destro!
Fr0zenFyr

2
Perché stai usando un terminale e ssh vim non riesce a raggiungere gli appunti del tuo sistema nativo tramite SSL. SHIFT+INSERTfunziona perché è l'opzione incolla per il tuo terminale (o nel tuo caso PuTTY); tuttavia, il rientro sarà probabilmente sbagliato. Controlla l'ultimo paragrafo della mia risposta pastesull'opzione per correggere questo.
Conner,

1
@jinksPadlock. grazie. La copia da Windows a VIM è probabilmente solo tramite tastiera usando Putty, ma non nella direzione opposta. In bash per windows .. non è possibile farlo in nessuna delle due direzioni ATM. Compilato una lista di risorse per puntare le persone nella giusta direzione e anche per noi .. se avete qualcosa da add..maybe è possibile aggiungerli qui: stackoverflow.com/questions/45271895/...
alpha_989

1
@ alpha_989 later-better-than-never;) Non posso aggiungere a jinksPadlock 'poiché al momento non ho un sistema operativo Windows tra le dita. SHIFT+INSfunziona da un host Linux per ssh vim e fa anche il terzo clic del mouse.
tuk0z,

10

Non avevo + appunti quindi ho trovato questa soluzione alternativa usando xsel:

Aggiungi al tuo ~ / .vimrc:

vnoremap <C-C> :w !xsel -b<CR><CR>


1
Grazie per questa fantastica idea! Ho finito per usare:vnoremap <C-C> :w !xclip -i -sel c<CR><CR>
andy

6

Una breve nota per le persone la cui installazione di vim non supporta i registri * e +. Non è necessario scaricare una nuova installazione di VIM da incollare dagli Appunti. Ecco un metodo alternativo:

1) Installa parcellite (un gestore di appunti con un minimo ingombro di memoria);

2) Nel tuo file .vimrc, aggiungi quanto segue:

command Clip r !parcellite -c

3) Riavvia vim.

Ora quando digiti: Clip come comando ex, il contenuto degli appunti verrà incollato sul cursore. È inoltre possibile mappare il nuovo comando su un tasto funzione in modo da poterlo fare con un solo tasto.


4

Questo funziona per me: Ctrl+ Shift+V


3
La risposta di @ neel lo ha già dichiarato. Questo dovrebbe essere solo un commento, o meglio un voto positivo, se vuoi dire che ha funzionato anche per te.
ericbn,

3

La soluzione più semplice a questo, che funziona anche tra diverse macchine Linux attraverso sshè:

  1. Controllare se i supporti vim X-11 Appunti: vim --version | grep clipboard. Se riporta indietro -clipboarde -xterm_clipboarddovresti installare uno vim-gtko vim-gnome(gvim su arch linux)

  2. Aggiungi le seguenti righe al tuo .vimrc:

set clipboard=unnamedplus
set paste
  1. Se accedi su un altro computer tramite ssh, usa l'opzione -Y: ssh -Y machine

Ora copiare e incollare dovrebbe funzionare esattamente come previsto su un singolo e su macchine diverse usando solo yper yank e pper incolla. NB modificare .vimrcsu tutte le macchine in cui si desidera utilizzare questa funzione.


Penso che X Server dovrebbe essere disponibile anche nel server affinché funzioni. Si! potrebbe essere installato da vim-gtk. Penso che xvfb sarà un'opzione alternativa per eseguire X server.
Ajeeb.KP,

3

Mi sono imbattuto in questo problema in un mid-2017 Macbook Pro in esecuzione vimall'interno di iTerm2come il mio ambiente di sviluppo primario.

Come hanno suggerito altre risposte, ho corso vim --versione ho notato che ritorna -clipboard, il che significa che la versione di vimquella fornita con la mia macchina non è stata compilata con l'opzione Appunti.

Il homebrewpacchetto per vimsembra compilarsi con l' clipboardopzione, quindi la correzione per me era:

  1. Correre brew install vim
  2. Aggiungi set clipboard+=unnamedal mio ~/.vimrcfile
  3. Chiudi e riapri iTerm2

3

Copia negli Appunti del sistema operativo

Seleziona il testo in modalità visiva, premi "*y

Incolla dagli Appunti del sistema operativo

stampa "*p


2

A seguito di risposta di Conner, che era fantastico, ma C-R C-p + e C-R C-p *in modalità di inserimento è un po 'scomodo. Idem "*pe "+pdalla modalità comando.

un guru VIM ha suggerito quanto segue per mappare C-vciò che C-r C-p +fa.

Potresti avere solo :inoremap <C-v> <C-o>"+pper la modalità di inserimento

se volessi davvero scavalcare la modalità visuale a blocchi (non raccomandato da lui perché la modalità visiva è buona) potresti avere map <C-v> "+p


2

Se stai usando vim in MAC OSX, sfortunatamente viene fornito con una versione precedente e non conforme alle opzioni degli Appunti. Fortunatamente, l'homebrew può facilmente risolvere questo problema.

installa vim:

brew install vim --with-lua --with-override-system-vim

installa la versione gui di vim:

brew install macvim --with-lua --with-override-system-vim

riavviare il terminale per rendere effettive.


aggiungere la seguente riga a ~/.vimrc
set clipboard=unnamed

ora puoi copiare la linea in vim con yye incollarla a livello di sistema.


2

Se stai usando un mouse, fallo prima

 :set paste 

Quindi right click mousee il contenuto nel buffer verrà incollato


1

Oltre all'impostazione :set clipboard=unnamed, dovresti usare mvim -vciò che puoi ottenere brew install macvimse stai usando vim su Terminal.app su Mac OS X 10.9. Vim predefinito non supporta l'opzione Appunti.


1

Potrebbe anche essere utile menzionare, su OSX usando Vim, è possibile selezionare il testo con il mouse, Cmd-C per copiare negli appunti del sistema OSX, e il testo copiato sarà disponibile negli appunti fuori da Vim.

In altre parole, OSX lo considera come se fosse una finestra normale, ed è qui che il pulsante "Comando" di Apple, molto diffamato, è utile.

B-30


1
Questo vale anche per qualsiasi emulatore di terminale decente su qualsiasi altro sistema operativo. Apple non ha alcun vantaggio qui.
underscore_d

1

Sulla base della risposta @ lis2, utilizzo una configurazione più semplice che alla fine non imporrà la modalità di inserimento:

" Copy and paste
if has('clipboard') && !has('gui_running')
  vnoremap <C-c> "+y
  vnoremap <C-x> "+d
  vnoremap <C-v> "+p
  inoremap <C-v> <C-r><C-o>+
endif

Tieni presente che tutte queste sostituiscono le mappature Vim predefinite:

  • v_CTRL-C: arresta la modalità visiva
  • v_CTRL-X: sottrai [conta] dal numero
  • v_CTRL-V: modalità visuale a blocchi
  • i_CTRL-V: inserisci letteralmente la prossima non cifra, che è anche mappata i_CTRL-Q

In alternativa, si possono usare i tasti di ispirazione nel "Yank", "Cancella" e "put" Vim verbi: <C-y>, <C-d>e <C-p>, rispettivamente. Questi sovrascriverebbero solo un mapping predefinito:

  • i_CTRL-P: parola chiave di ricerca all'indietro per completamento

1

Le altre soluzioni sono buone se vuoi cambiare il tuo vimrc, ecc ... Comunque volevo un modo semplice per copiare da vim alla tastiera del mio sistema. Questo è quello che mi è venuto in mente.

  • Seleziona il testo che desideri copiare con la modalità visiva v
  • Premi :(si espanderà automaticamente per mostrare :'<,'>)
  • Digitare y * o y + (a seconda del sistema) per trascinare il testo selezionato negli Appunti di sistema


1

Poiché il tasto destro del mouse su vim 8 abilita la modalità visiva per impostazione predefinita. Questo impedisce il "normale" copia e incolla (chiamalo "difetto di progettazione" https://github.com/vim/vim/issues/1326 ). Risolvilo facendo:

echo "set mouse-=a" >> ~/.vimrc .

Esci e riavvia vim.


1

Con Vim 8+ su Linux o Mac, ora puoi semplicemente utilizzare la copia nativa del sistema operativo ( ctrl+shift+Vsu Linux, cmd+Vsu Mac). Non premere iper la modalità di inserimento.

Incollerà il contenuto degli appunti del sistema operativo, preservando gli spazi e le schede senza aggiungere autoindenting. E 'corrisponde alla vecchia :set paste, i, ctrl+shift+V, esc, :set nopastemetodo.

Non hai nemmeno più bisogno delle funzionalità di +clipboardo +xterm_clipboardvim installate. Questa funzione è chiamata "incolla tra parentesi". Per maggiori dettagli, vedi Disattivare il rientro automatico quando si incolla il testo in vim


0

Quando uso il mio Debian vim che non è integrato con Gnome (vim --version | grep clip # non mostra supporto negli appunti), posso copiare negli appunti dopo aver premuto il tasto Maiusc e aver selezionato il testo con il mouse, proprio come con qualsiasi altro altro programma di maledizioni. Come ho capito da un commento di @Conner, è il terminale (gnome-terminal nel mio caso) che disattiva la segnalazione degli eventi del mouse quando rileva la mia pressione del tasto Maiusc. Immagino che i programmi basati su maledizioni possano ricevere eventi del mouse dopo aver inviato una determinata sequenza di escape al terminale.


1
Questo sta usando il tuo terminale, non vim.
Conner,

0

Se sei su Windows e vuoi incollare il contenuto degli Appunti di sistema usando pquindi digita questo comando.

:set clipboard = unnamed

Questo ha risolto il mio problema.


0

Esistono due semplici modi per farlo. Crea il tuo file in modalità inserimento e 1) premi il pulsante centrale (la rotella di scorrimento) nel mouse o 2) Ctrl + Maiusc + V


0

Per alcune tastiere internazionali, potrebbe essere necessario premere "+ Spaceper ottenere a ".

Quindi in quei casi dovresti premere "Space+yo "Space*ycopiare.

E "Space+po " Space*pper incollare.


0

Ho usato la risposta di NM Pennypacker e ho installato vim tramite homebrew per un MacBook Pro dei primi anni del 2011:

brew install vim

Ora posso anche usare il registro "* per copiare e incollare il testo in vim. Non ho nemmeno dovuto cambiare qualcosa nel mio file ~ / .vimrc o nel $ PATH. Homebrew ha aggiunto collegamenti simbolici in / usr / local / bin, ad es. vim -> ../Cellar/vim/8.1.2350/bin/vim.

L'alternativa, che ha funzionato in precedenza, è quella di copiare alcune righe di testo all'interno di vim contrassegnandolo con il mouse e usando copia e incolla (cmd + c, cmd + v) su un mac. Questa opzione funziona solo se il testo che si desidera copiare e incollare ha dimensioni inferiori rispetto alle dimensioni della finestra di vim. Se vuoi copiare tutto il testo all'interno di vim contrassegnando l'intera finestra o usando cmd + a, questo copierà altre parti della console, scritte prima di avviare vim, il che è molto fastidioso.

Quindi, sono felice di aver trovato il nuovo metodo usando il registro di clippboard.

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.