Copia e incolla il contenuto da un file a un altro file in vi


256

Sto lavorando con due file e ho bisogno di copiare alcune righe da un file e incollarlo in un altro file. So come copiare (yy) e incollare (p) nello stesso file. Ma questo non funziona per file diversi. Come si fa?

Inoltre, c'è un modo per tagliare e incollare? Ho provato a cercare su Google, ma la maggior parte delle risorse parla solo di copia e incolla.


Sei sicuro che non funzioni? Lo uso abbastanza spesso per copiare le linee tra i file.
sabato

Bene, quando lo faccio, ricevo solo le virgolette?
macha,

4
Il comando dd funziona come se fosse tagliato.
Martin Stålberg,

Risposte:


218

Dato che sai già come tagliare / strappare il testo, ecco alcune idee per incollarlo nuovamente in un altro file:

  • Modifica il primo file, strappando il testo che desideri. Quindi apri il tuo secondo file da vi ( :e /path/to/other/file) e incollalo
  • Apri entrambi i file insieme in una finestra divisa e naviga tra loro usando Ctrl+ w, Up/ Downo:

    • vi -o /path/to/file1 /path/to/file2
    • Dall'interno del primo file, Ctrl+ w,s

Ho due finestre aperte di stucco, sto facendo prima "v per la modalità visiva e poi seleziono tutte le linee e faccio una" y "per lo strappo, non sto facendo una scheda alt + per accedere all'altro file e quando lo faccio una "p" per mettere, stampa solo un segno di virgolette.
Macha

10
Se lavori con 2 finestre di stucco, devi usare il modo di copia / incolla di stucco / windows. Questo è facile. Contrassegna le cose che vuoi copiare con il mouse (non devi fare nient'altro, quel testo contrassegnato viene ora copiato negli appunti.) Passa all'altra finestra dello stucco. Entra in modalità inserimento in vim (premi i). Premi il pulsante destro del mouse: il mouse destro in una finestra di stucco incollerà tutto ciò che è negli appunti.
nn.

3
Quello che stai facendo non funzionerà: Yanking in vi non inserirà il testo negli appunti di Windows e il buffer yank non verrà condiviso tra istanze vim aperte.
Adam Batkin,

1
Non capisco che cosa si suppone che l'ultimo punto da fare: * Da all'interno del primo file, Ctrl+ w, s.
svassr

1
per me ha diviso la finestra ma aprendo esattamente lo stesso file. Come scegli quale file aprire allora? Ho visto il comando :sp myfileche si divide in orizzontale e apre il file specificato, ma come farei se preferissi dividere la finestra in verticale?
svassr

50

Se stai usando Vim su Windows, puoi accedere agli appunti (copia / incolla di MS) usando:

"*dd - tagliare una linea (o 3dd per tagliare tre linee)

"*yy - copia una riga (o 3yy per copiare tre righe)

"*p - incolla la linea (e) sulla linea dopo il cursore

"*P - incolla la linea (e) sulla linea prima del cursore

Ti consente di incollare tra finestre Vim separate o tra applicazioni Vim e PC ( Blocco note , Microsoft Word , ecc.).


17
Utilizzare +come registro di appunti del sistema multipiattaforma (Windows e Linux) vs. *, che è solo Windows ( +funziona esattamente come in Windows *).
Stephen Swensen,

42

Usa le variazioni di dlikedd per tagliare.

Per scrivere un intervallo di righe in un altro file è possibile utilizzare:

:<n>,<m> w filename

Dove <n>e<m> sono numeri (o simboli) che designano un intervallo di linee.

Per usare gli appunti sul desktop, dai un'occhiata ai +gcomandi.


Per fare ciò con i segni, crea due segni (aeb, ad esempio) attorno al testo che desideri scrivere in un file: sposta sulla prima riga ma,, passa all'ultima riga mb,. Quindi aggiungi 'a alla lettera del segno quando usi il comando sopra::'a,'b w filename
EchoLynx,

ottima soluzione per gamme ad ampio raggio!
Yasin Okumuş,

29

Puoi aprire l'altro file e digitare :r file_to_be_copied_from. Oppure puoi bufferizzare. Oppure vai al primo file, vai sulla riga che vuoi copiare, digita "qY, vai al file che vuoi incollare e digitare "qP.

"buffer_name, copia nel buffer. Yè uno strattone e Pviene messo. Spero che aiuti!


Grazie! Questo mi ha aiutato moltissimo
Atsushi Yamamoto il

28

Ecco un modo per farlo;

  • Avvia Vim e apri file1 che è il file su cui stai lavorando.
  • :e file2 che visualizzerà file2, il file da cui si desidera copiare le righe.
  • individuare le linee che si desidera copiare. Se sono tre linee, colpisci3yy
  • :b1 questo passerà al buffer 1, dove si trova file1
  • capire dove si desidera inserire le linee strappate e colpire p

Potresti avere anche entrambi i file visualizzabili. Dividi lo schermo con ad es . Ctrl+ w s.

Per quanto riguarda il taglio, dtaglia e posiziona le cose tagliate nel buffer dello yank. dd"taglierà" una linea.


2
off-topic: come posso ottenere quelle cose simili a pulsanti di tastiera?
Verifica il


Che dire dei due file si trovano su due diversi server SSH, in cui lo stesso client si trova in due diversi terminali in Linux / MacOS? Voglio dire, nessuno stucco da usare, e i due file non possono essere aperti nella stessa sessione vi in ​​un terminale.
Qiang Xu

1
Se il client può accedere a due server, può anche usare scp o sftp per quei due server. Quindi il modo più veloce è semplicemente copiare il file da un server all'altro in modo che risiedano sullo stesso server, modificare quei file come descritto e, se necessario, copiare nuovamente il file sull'altro server.
nn

16

Questi sono tutti ottimi suggerimenti, ma se conosci la posizione del testo in un altro file usa sed con facilità. :r! sed -n '1,10 p' < input_file.txtCiò inserirà 10 righe in un file già aperto nella posizione corrente del cursore.


stranamente ho ottenuto un codice di uscita di 1 quando lo eseguo purtroppo su OS X, non so perché.
jayunit100,

1
Grazie per questo suggerimento! Ho usato head invece di sed perché volevo le prime 2 righe::r ! head -n2 file.py
Federico Ponzi,

7

Durante la modifica del file, segna il punto in cui desideri utilizzare l'inizio e la fine

ma- imposta il asegno

mb- imposta il bsegno

Quindi, per copiarlo in un altro file, basta usare il wcomando:

:'a,'bw /name/of/output/file.txt

7

Aggiornamento 2017-05:

Ho appena scoperto che se aggiungi la seguente riga nel tuo file vimrc,

set appunti = senza nome

quindi Vim sta usando gli Appunti di sistema.


Ho appena scoperto che il modo yank non funzionerà sul modo in cui copio il contenuto tra diverse finestre dell'istanza di Vim. (Almeno, non funziona in base alle mie conoscenze su Vim. Non so se esiste un altro modo per consentirgli di funzionare).

Il modo yank funziona solo nel modo in cui più file vengono aperti nella stessa finestra secondo il mio test.

Se vuoi farlo, è meglio usare il sistema operativo come copia-copia-passato come Ctrl+ x, Ctrl+ c(sotto Windows).


5

Questi rimappa funzionano come un incanto per me:

vmap <C-c> "*y     " Yank current selection into system clipboard
nmap <C-c> "*Y     " Yank current line into system clipboard (if nothing is selected)
nmap <C-v> "*p     " Paste from system clipboard

Quindi, quando sono in modalità visiva, seleziono le linee che desidero e premo Ctrl+ ce quindi Ctrl+v per inserire il testo nel file del destinatario. Potresti usare anche "* y, ma penso che sia difficile da ricordare a volte.

Questo è anche utile per copiare il testo da Vim negli Appunti.

Fonte: copia e incolla tra le sessioni utilizzando un file temporaneo


4

La copia di testo tra due buffer (== file) aperti nella stessa istanza di Vim non è un problema:

Basta semplicemente tirare in un buffer con y(supponendo che prima sia stata contrassegnata un'area da copiare in modalità visiva), quindi incollare l'altro buffer conp . Funziona anche con diverse schede purché siano nella stessa istanza di Vim.

Come aprire due file nella stessa istanza di Vim dipende dal tuo sistema:

  • Su Win32, c'è un'opzione nel menu contestuale che dice Modifica con una vim se selezioni due o più file
  • Quando sei sulla console, puoi ottenerlo con vim file1 file2
  • Se usi Vim come editor per un altro strumento, assicurati di specificare l' --remote-silentopzione per assicurarti che tutti i file vengano aperti nella stessa istanza

Se hai aperto i due file in due diverse istanze di Vim, devi andare con gli appunti di sistema: nella prima istanza di Vim, trascina il testo negli appunti di sistema usando "+y(di nuovo, segna l'area da strappare in modalità visiva prima ), poi andare alla seconda Vim e incollare gli appunti lì: "+p.


: tabedit nomefile può essere utilizzato per aprire il file di destinazione e quindi solo p per incollare le linee. Penso che sia più veloce.
jabalv,

4

Obbiettivo : salvare un pezzo di un file in un altro file.

Soluzione :

  1. Seleziona il testo che desideri salvare:
    • Posiziona il cursore nel punto in cui desideri iniziare la selezione
    • Premere vper selezionare caratteri O maiuscolo Vper selezionare intere righe
    • Spostare il cursore alla fine di ciò che si desidera selezionare
  2. Salva il testo selezionato nel nuovo file. Digitare :wSpacee il nome del nuovo file. In realtà vedrai

    :'<,'>w new.txt

    Quindi premere Enter


Come incollare indietro dal file temporaneo.?
Vineet,

3

Il mio scenario era che dovevo copiare n numero di righe in mezzo, n sconosciuto, dal file 1 al file 2.

:'a,'bw /name/of/output/file.txt

2
  1. Assicurati di avere la versione di Vim compilata con il supporto degli appunti
    • :echo has('clipboard') dovrebbe tornare 1
    • se restituisce 0(ad esempio Mac OS X, almeno v10.11 (El Capitan), v10.9 (Mavericks) e v10.8 (Mountain Lion) - viene fornito con una versione Vim priva del supporto degli appunti), è necessario installare un Versione Vim con supporto per appunti, dire via brew install vim(non dimenticare di riavviare i terminali dopo l'installazione)
  2. Inserisci una modalità visiva ( V- multilinea, v- semplice o Ctrlv- blocco visivo)
  3. Seleziona le righe che desideri copiare
  4. "*y - per copiare selezionato
  5. "*p - per incollare copiato

PS:

  • puoi sostituire i passaggi 2-5 con le istruzioni della risposta di JayG , se devi copiare e incollare una sola riga
  • per facilitare la selezione delle linee, puoi aggiungerle set mouse+=aal tuo .vimrc- ti permetterà di selezionare le linee in Vim usando il mouse, senza selezionare elementi estranei (come numeri di linea, ecc.) AVVISO: bloccherà la possibilità di copiare il testo selezionato dal mouse negli appunti di sistema di Vim .

1

Esempio: fileA e fileB: iniziare da fileA alla riga 25, copiare 50 righe e incollare nel fileB

fileA

Goto 25th line

25G

copy 50 lines into buffer v

"v50yy

Goto fileB

:e fileB

Goto line 10

10G    

paste contents of buffer v
"vp

1

L'opzione di seguito funziona la maggior parte del tempo e anche per incollare in seguito.

 "xnyy
x - buffer name
n - number of line to Yank - optional

Le righe strappate verranno memorizzate nel buffer 'x'. Può essere utilizzato ovunque nella modifica.

Per incollare le righe nell'altro file,

:e filename&location

Esempio: digitare il comando seguente nella modifica corrente

:e /u/test/Test2.sh
and paste using "xP
P - before cursor
p - after cursor

Operazione completa

apri il file 1:

vi Test1.sh

a10yy

-Yanked 10 lines

- Ora apri il secondo file dalla modifica corrente

*:e /u/test/Test2.sh*

-sposta il cursore sulla riga in cui devi incollare

*"ap*

- Le righe dal buffer '*a*'verranno copiate dopo il cursore corrente pos


1

Se vuoi copiare una parte di un file e incollare quel contenuto nel mezzo di un altro file, puoi farlo in questo modo.

:linenumber,linenumber write newfile

Esempio:

:2,34 write temp1

O

:'mark, 'mark write newfile

Esempio:

:'a,'b write temp1

Ora le linee vengono copiate in un altro file. Se si desidera eliminare quelle righe dopo la copia, è possibile farlo

:linenumber1,linenumber2 d

O

:'mark1,'mark2 d

Ora vai su un altro file. Quindi mantieni il cursore sulla linea in cui desideri incollare.

genere

:r!cat temp1

Ora, il contenuto del file temporaneo viene incollato qui. È possibile eliminare il file temporaneo dalla riga di comando stessa, dopo aver incollato il contenuto.

:!rm temp1

Ciò sarebbe d'aiuto se si desidera copiare e incollare più volte.


0

Un altro modo potrebbe essere quello di aprire i due file in due buffer divisi e utilizzare il seguente "frammento" dopo la selezione visiva delle linee di interesse.

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p

0

Entra in modalità comando ed esegui

:r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from

Ad esempio per estrarre le righe 20-30dal filenamefile attualmente aperto

:r! sed -n '20, 30p' filename
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.