如何使用vim脚本将文本附加到文件?

Ren*_*ger 5 vim

我想要一个函数将文本附加到vim中的文件(而不是缓冲区).据我所见,没有appendfile().但所需的功能可以被模拟readfile()writefile():

fu! TQ84_log (S)

   let l:f = readfile('my.log')
   call add(l:f, a:S)
   call writefile(l:f, 'my.log')

endfu
Run Code Online (Sandbox Code Playgroud)

因为my.log可以增长很大,所以当我想添加一行时,我宁愿不读写整个文件.所以,我想出了另一个"解决方案":

fu! TQ84_log (S)
   silent execute "!echo " . a:S . ">> my.log"    
endfu
Run Code Online (Sandbox Code Playgroud)

这可以正常工作(在Windows上).然而,当我调用时TQ84_log(),该cmd.exe窗口弹出一小段时间.这有点让人分心.

对我的问题有更好的解决方案吗?

ben*_*her 12

如果当前缓冲区中有一系列要追加到日志文件的行,那么

:[range]w >> my.log
Run Code Online (Sandbox Code Playgroud)

完全符合你的要求.(好吧,也许不完全一样.例如,它具有制作my.log备用文件的副作用,如果你打算使用:e#或者某些东西,它可能会搞砸你.)

如果您已在变量中包含日志消息,则可以打开暂存缓冲区,使用append():put将行添加到暂存缓冲区,然后:w >> my.log关闭暂存缓冲区.

:help special-buffers
:help :put
:help :w
Run Code Online (Sandbox Code Playgroud)

这是一个完整的日志功能.还有改进的余地:如果你有分割窗口,可能会恢复布局:new,:q也可能不会恢复布局,而:put在空缓冲区上会留下你可能不想要的空白行.

function! Mylog(message, file)
  new
  setlocal buftype=nofile bufhidden=hide noswapfile nobuflisted
  put=a:message
  execute 'w >>' a:file
  q
endfun
Run Code Online (Sandbox Code Playgroud)


Yuj*_*oto 8

根据:help writefile()

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")
Run Code Online (Sandbox Code Playgroud)