J'ai deux approches (très similaires) à cela. Il n'y a aucun moyen de le faire avec la commande d'écriture intégrée, mais il est assez facile de générer votre propre fonction qui devrait faire ce que vous voulez (et vous pouvez l'appeler comme vous voulez - même W si vous voulez).
Une approche très simple qui ne va gérer une seule ligne est d'avoir une fonction comme ceci:
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
Ceci est appelé avec :'<,'>WriteLinePart test.txt
.
Si vous souhaitez prendre en charge plusieurs plages de lignes, vous pouvez étendre ce champ pour inclure des conditions variables, ou vous pouvez pincer le code de ma réponse à this question. Débarrassez-vous de la substitution des barres obliques inverses et vous pourriez avoir une fonction très simple qui fait quelque chose comme (non testé ...):
command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call writelines([GetVisualRange()], a:filename)
Excellent, cela fait exactement ce dont j'ai besoin. Je n'avais besoin que d'une seule gamme, mais il est bon de connaître la solution multi-gamme si j'en ai besoin à l'avenir. Merci, et Joyeux Noël (ou Super Solstice, si Noël n'est pas votre truc)! – Magnus