sposta la selezione in un file separato


12

Con vim, come posso spostare un pezzo di testo in un nuovo file? Per il momento, faccio questo:

  • seleziona il testo
  • uso :w new_file
  • seleziona di nuovo il testo
  • elimina il testo

C'è un modo più efficiente per farlo?

Prima

a.txt

sometext
some other text
some other other text
end

Dopo

a.txt

sometext
end

b.txt

some other text
some other other text

Risposte:


4

Che ne dici di questi comandi personalizzati:

:command! -bang -range -nargs=1 -complete=file MoveWrite  <line1>,<line2>write<bang> <args> | <line1>,<line2>delete _
:command! -bang -range -nargs=1 -complete=file MoveAppend <line1>,<line2>write<bang> >> <args> | <line1>,<line2>delete _

1
Questo è molto brutto, ma ehi, sembra fare in un solo passo esattamente quello che ho chiesto (ho provato). +1 e accettato. Stavo cercando un modo nativo per farlo rapidamente, ma poiché non sembra essercene uno, il tuo farà proprio bene. Grazie!
greg0ire,

1
La bellezza è negli occhi di chi guarda. Lo trovo piuttosto elegante; devi solo digitarlo una volta (nel tuo .vimrc).
Ingo Karkat,

Hai ragione, "molto brutto" dovrebbe essere stato "molto sconosciuto". Il tuo comando è molto utile e penso che sicuramente lo
intaglierò

8

Con "sposta un pezzo di testo in un nuovo file" suppongo che intendi tagliare quel pezzo di testo dal file corrente e creare un nuovo file contenente solo quel testo.

Vari esempi:

  • :1,1 w new_file per creare un nuovo file contenente solo il testo dalla riga numero 1
  • :5,50 w newfile per creare un nuovo file contenente il testo dalla riga 5 alla riga 50
  • :'a,'b w newfileper creare un nuovo file contenente il testo da un segno aall'altrob
    • imposta i tuoi segni usando mae mbdove vuoi

Quanto sopra copia solo il testo e crea un nuovo file contenente quel testo. Successivamente dovrai eliminare.

Questo può essere fatto usando lo stesso intervallo e il dcomando:

  • :5,50 d per eliminare il testo dalla riga 5 alla riga 50
  • :'a,'b dper eliminare il testo da un segno aall'altrob

O usando ddper il caso a riga singola.

Se invece selezioni il testo usando la modalità visiva e poi premi :mentre il testo è selezionato, vedrai quanto segue sulla riga di comando:

:'<,'>

Che indica il testo selezionato. È quindi possibile espandere il comando in:

:'<,'>w >> old_file

Che aggiungerà il testo a un file esistente. Quindi eliminare come sopra.


Una fodera:

:2,3 d | new +put! "

La ripartizione:

  • :2,3 d - elimina le righe da 2 a 3
  • | - tecnicamente questo reindirizza l'output del primo comando al secondo comando ma poiché il primo comando non genera nulla, stiamo solo concatenando i comandi insieme
  • new - apre un nuovo buffer
  • +put! "- inserisce il contenuto del registro senza nome ( ") nel buffer
    • Il botto ( !) è lì in modo che i contenuti vengano messi prima della riga corrente. Ciò causa una riga vuota alla fine del file. Senza di essa, c'è una riga vuota nella parte superiore del file.

Il tuo presupposto è giusto. Sembra buono, ho intenzione di testare. Potresti spiegare 2. un po 'di più? Non ho molta familiarità con le gamme. EDIT: Se provo questo sulla seconda riga, scrive la prima riga sull'altro file, non sulla seconda riga.
greg0ire,

@greg0ire Ho capito un po 'indietro, lo modificherò per spiegare meglio
embedded.kyle

Ho aggiunto un esempio per rendere più chiara la mia domanda.
greg0ire,

@ greg0ire Ho corretto la mia risposta. Sono ancora due passaggi. Le prime copie e scritture. Il secondo elimina.
embedded.kyle

1
Bella soluzione! Potresti anche scriverlo '<,'>d | new | 0put "per chiarezza.
atripes

1

Sulla base della risposta di @ embedded.kyle e di queste domande e risposte , ho finito con questa riga per aggiungere una selezione a un file ed eliminare dal file corrente. Dopo aver selezionato alcune righe con Shift+V, premi :ed esegui:

'<,'>w >> test | normal gvd 

La prima parte aggiunge le linee selezionate. Il secondo comando entra in modalità normale ed esegue gvdper selezionare l'ultima selezione e quindi elimina.


0

Selezionare il testo in modalità visiva, quindi premere yper "trascinarlo" nel buffer (copia) o dper "eliminarlo" nel buffer (tagliare).

Quindi puoi :split <new file name>dividere la finestra di VIM e premere pper incollare il testo strappato. Scrivi il file normalmente.

Per chiudere nuovamente la divisione, passare la divisione che si desidera chiudere :q.


1
Ho 4 passaggi per il momento: selezionare, scrivere, selezionare, eliminare. Con il tuo metodo, ho 6 passaggi: selezionare, eliminare, dividere, incollare, scrivere, chiudere. Ho chiesto qualcosa di più efficiente: P
greg0ire,

Bene, se :xinvece passi la divisione , puoi combinare la scrittura e la chiusura in una e farla in cinque passaggi. : P
Xyon,

Va meglio, ma 5 ancora> 4: P
greg0ire
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.