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)
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