В vim как записать частичную строку в файл? - PullRequest
9 голосов
/ 23 декабря 2009

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

This is line 1

and this is the next line

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

line 1

and this is

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

:20,22 w partial.txt

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

:'<'> w partial.txt

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

1 Ответ

8 голосов
/ 23 декабря 2009

У меня есть два (очень похожих) подхода к этому. Невозможно сделать это с помощью встроенной команды записи, но довольно легко сгенерировать собственную функцию, которая должна делать то, что вы хотите (и вы можете называть ее как хотите - даже 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...