如何在vim中将列表添加到文件中?

6
我想在VimL中将一系列字符串附加到文件中,以下是我的解决方案代码:
let lines = ["line1\n", "line2\n", "line3\n"]
call writefile(lines, "/tmp/tmpfile")
call system("cat /tmp/tmpfile >> file_to_append_to")

有没有办法在vim中直接追加到文件中?应该有,但我找不到相关内容。
4个回答

7

尝试使用readfile()+writefile()

如果您正在使用Vim 7.3.150+,(您确信所涉及的文件以\n结尾):

function AppendToFile(file, lines)
    call writefile(readfile(a:file)+a:lines, a:file)
endfunction

对于Vim版本早于7.3.150的情况:

" lines must be a list without trailing newlines.
function AppendToFile(file, lines)
    call writefile(readfile(a:file, 'b')+a:lines, a:file, 'b')
endfunction

" Version working with file *possibly* containing trailing newline
function AppendToFile(file, lines)
    let fcontents=readfile(a:file, 'b')
    if !empty(fcontents) && empty(fcontents[-1])
        call remove(fcontents, -1)
    endif
    call writefile(fcontents+a:lines, a:file, 'b')
endfunction

我对你最后一句话感到困惑。:h readfile() 表示,没有 'b',"最后一行是否以 NL 结尾并不重要。" (Vim7.4.26) - Justin M. Keyes
1
@JustinM.Keyes 更新到版本7.2.446(提交http://code.google.com/p/vim/source/detail?r=9577a28005e10fab0a0cada6c41b96c9a3e1bfe9)。请注意,文件必须完全不包含换行符才能看到错误(`readfile()`返回空列表)。还要注意,可能不是最后一个存在错误的版本。 - ZyX
1
@JustinM.Keyes 这个问题在版本7.3.150(2011年4月1日)中得到了修复。据我所记,在编写代码时,我只是利用了我的readfile()、VAM和版本7.2*的经验,并且由于其稳定性我没有重新检查。当我修改VAM以始终使用readfile(, 'b')时是在2010年7月4日,当时最新版本为7.2.445(除了vim73分支的更改)。我肯定正在使用Gentoo(无论是稳定版还是~arch版本),这意味着我使用的版本已经稍微过时了一些。不过并不重要,因为这个bug一直存在到7.3.150版本。 - ZyX

6
write 命令可用于将整个当前缓冲区附加到文件中:
:write >> append_file.txt

如果需要的话,您可以限制范围为当前缓冲区中的行。例如,这将在将行1到8追加到append_file.txt的末尾:

:1,8write >> append_file.txt

1
这是一种更好、更容易的做事方式。 - user4089193
可视化选择完成后,执行 :'<,'>w >> test.txt 命令会显示 "test.txt" 3L, 119C appended。这绝对是我要找的答案。(注意:与 shell 的 append 不同,文件必须已经存在!) - DaveGauer

5

Vim 7.4.503 增加了对使用"a"标志的writefile方法进行文件追加的支持:

:call writefile(["foo"], "event.log", "a")

From :h writefile:

writefile({list}, {fname} [, {flags}])
    Write |List| {list} to file {fname}.  Each list item is
    separated with a NL.  Each list item must be a String or
    Number.

    When {flags} contains "a" then append mode is used, lines are
    appended to the file:
        :call writefile(["foo"], "event.log", "a")
        :call writefile(["bar"], "event.log", "a")

3

这可能有用,但它会将内容追加到当前文件。

创建一个数组,从每个字段中删除\n

:let lines = ["line1", "line2", "line3"]

在当前文件末尾追加:

:call append( line('$'), lines )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接