2009-12-23 20 views
7

Voglio usare vim per scrivere una parte del mio file in un altro file. Ad esempio, ho il seguente file:In vim, come scrivere una riga parziale in un file?

This is line 1

and this is the next line

voglio che il mio file di output per la lettura:

line 1

and this is

so come usare vi scrivere una serie di linee in un file:

:20,22 w partial.txt

Un'alternativa è quello di selezionare visivamente il testo desiderato e quindi scrivere:

:'<'> w partial.txt

Tuttavia, quando si utilizza questo metodo, vim insiste a scrivere la riga intera nell'output e non ho trovato modo di scrivere una riga parziale. qualche idea?

risposta

5

Ho due approcci (molto simili) a questo. Non c'è modo di farlo con il comando di scrittura incorporato, ma è abbastanza facile generare la tua funzione che dovrebbe fare ciò che vuoi (e puoi chiamarlo come vuoi - anche W se vuoi).

Un approccio molto semplice che gestire solo varia a linea singola è di avere una funzione come questa:

command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call WriteLinePart(<f-args>) 

function! WriteLinePart(filename) range 
    " Get the start and end of the ranges 
    let RangeStart = getpos("'<") 
    let RangeEnd = getpos("'>") 

    " Result is [bufnum, lnum, col, off] 

    " Check both the start and end are on the same line 
    if RangeStart[1] == RangeEnd[1] 
     " Get the whole line 
     let WholeLine = getline(RangeStart[1]) 

     " Extract the relevant part and put it in a list 
     let PartLine = [WholeLine[RangeStart[2]-1:RangeEnd[2]-1]] 

     " Write to the requested file 
     call writefile(PartLine, a:filename) 
    endif 
endfunction 

Questo viene chiamato con :'<,'>WriteLinePart test.txt.

Se si desidera supportare più intervalli di righe, è possibile estenderlo per includere condizioni variabili oppure è possibile pizzicare il codice dalla mia risposta a this question. Sbarazzarsi del bit sulla sostituzione dei backslash e si potrebbe quindi avere una funzione molto semplice che fa qualcosa come (non testata però ...) questo:

command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call writelines([GetVisualRange()], a:filename) 
+0

Eccellente, questo fa esattamente quello che mi serve. Avevo bisogno solo di una singola gamma, ma è bello sapere della soluzione multi-gamma se ne ho bisogno in futuro. Grazie e Buon Natale (o Super Solstizio, se il Natale non è il tuo genere)! – Magnus

Problemi correlati