Я хочу использовать энергию для записи части моего файла в другой файл. Например, у меня есть следующий файл:
This is line 1
and this is the next line
Я хочу, чтобы мой выходной файл читал:
line 1
and this is
Я знаю, как использовать vi для записи диапазона строк в файл:
:20,22 w partial.txt
Альтернатива должна визуально выбрать требуемый текст и затем записать:
:'<'> w partial.txt
Однако при использовании этого метода, энергия настаивает на том, чтобы писать сплошную линию в выводе, и я не нашел способа записать частичную строку. Какие-либо мысли?
У меня есть два (очень похожих) подхода к этому. Там' Это невозможно сделать с помощью встроенной команды записи, но довольно легко сгенерировать свою собственную функцию, которая должна делать то, что вы хотите (и вы можете называть ее как хотите - даже 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)