Tengo dos enfoques (muy similares) para esto. No hay forma de hacerlo con el comando de escritura incorporado, pero es bastante fácil generar su propia función que debe hacer lo que quiera (y puede llamarlo como desee, incluso W si lo desea).
Un enfoque muy simple que sólo manejará oscila de una sola línea es tener una función como esta:
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
Esto se llama con :'<,'>WriteLinePart test.txt
.
Si desea admitir rangos de línea múltiples, puede expandir esto para incluir condiciones variables, o puede pellizcar el código de mi respuesta al this question. Deshacerse de la broca sobre la sustitución de las barras invertidas y, a continuación, podría tener una función muy simple que hace algo así (no probado, aunque ...) esto:
command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call writelines([GetVisualRange()], a:filename)
Excelente, esto es exactamente lo que necesito. Solo necesitaba un rango único, pero es grandioso saber sobre la solución de rango múltiple si la necesito en el futuro. Gracias, y Feliz Navidad (o Súper Solsticio, si la Navidad no es lo tuyo)! – Magnus