У меня есть два (очень похожих) подхода к этому. Невозможно сделать это с помощью встроенной команды записи, но довольно легко сгенерировать собственную функцию, которая должна делать то, что вы хотите (и вы можете называть ее как хотите - даже W, если хотите).
Очень простой подход, который будет обрабатывать только однострочные диапазоны, - это иметь такую функцию:
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
Это называется с :'<,'>WriteLinePart test.txt
.
Если вы хотите поддерживать несколько диапазонов строк, вы можете либо расширить это, чтобы включить изменяющиеся условия, либо вы можете ущипнуть код из моего ответа на этот вопрос . Избавьтесь от подстановки обратной косой черты, и тогда у вас может быть очень простая функция, которая выполняет что-то вроде (хотя и не проверено ...) этого:
command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call writelines([GetVisualRange()], a:filename)