在vim中,如何将部分行写入文件?

时间:2009-12-23 14:20:20

标签: vim

我想使用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 个答案:

答案 0 :(得分:8)

我有两个(非常相似)的方法。使用内置的write命令无法做到这一点,但生成你自己的功能相当容易,你应该做你想做的事情(如果你愿意的话,你也可以称之为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调用此方法。

如果您想支持多个行范围,可以将其展开以包含不同的条件,或者可以从我对this question的答案中捏合代码。摆脱关于替换反斜杠的一点,然后你可以有一个非常简单的函数来执行类似的事情(虽然未经测试......):

command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call writelines([GetVisualRange()], a:filename)