В энергии, как записать частичную строку в файл?

Я хочу использовать энергию для записи части моего файла в другой файл. Например, у меня есть следующий файл:

This is line 1

and this is the next line

Я хочу, чтобы мой выходной файл читал:

line 1

and this is

Я знаю, как использовать vi для записи диапазона строк в файл:

:20,22 w partial.txt

Альтернатива должна визуально выбрать требуемый текст и затем записать:

:'<'> w partial.txt

Однако при использовании этого метода, энергия настаивает на том, чтобы писать сплошную линию в выводе, и я не нашел способа записать частичную строку. Какие-либо мысли?

9
задан Magnus 23 December 2009 в 04:20
поделиться

1 ответ

У меня есть два (очень похожих) подхода к этому. Там' Это невозможно сделать с помощью встроенной команды записи, но довольно легко сгенерировать свою собственную функцию, которая должна делать то, что вы хотите (и вы можете называть ее как хотите - даже 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)
8
ответ дан 3 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: