Vim:在每次按键时写回我的文件

时间:2009-08-21 17:47:55

标签: file vim

我希望vim尽可能多地自动编写我的文件。理想的是每次按键。

我需要定期保存,以便我的后台构建过程能够看到它。这是一个乳胶文档的makefile,我希望预览器在我完成输入时向我显示一个近乎最新的文档。

最终答案(以下答案有助于实现这一点)

" Choose your own statusline here
let g:pbstatusline="%F\ %y\ %l:%c\ %m"
set statusline=%F\ %y\ %l:%c\ %m

autocmd FileType tex setlocal autowriteall

" Save the file every 5 keypresses
autocmd FileType tex setlocal statusline=%!pb:WriteFileViaStatusLine()

" Save the file every time this event fires.
autocmd FileType tex :autocmd InsertLeave,CursorHold,CursorHoldI * call pb:WriteFileViaStatusLine("always")

" 1 optional param: "always" is only allowed value.
let s:writefilecounter = 0
function! pb:WriteFileViaStatusLine(...)
   if s:writefilecounter > 5 || (a:0 > 0 && a:1 == "always")
      if &buftype == ""
         write
      endif
      let s:writefilecounter = 0
   else
      let s:writefilecounter = s:writefilecounter + 1
   endif

   return g:pbstatusline
endfunction

6 个答案:

答案 0 :(得分:10)

一个hack就是使用你的状态行:

function! WriteFile() 
  if &buftype == ""
    write
  endif
  return '%f %h%w%m%r%=%-14(%l,%c%V%) %(%P%)'
endfunction
setlocal statusline=%!WriteFile()
set laststatus=2

只要状态行可见,它就会在每次更改文件后更新。 更新后,将调用WriteFile()函数,该函数将写入文件(并在默认状态行返回我的近似值)。使用laststatus=2时,即使只有一个窗口打开,也会显示状态行。

这将在每次更改后保留当前缓冲区。

答案 1 :(得分:10)

不再需要这些黑客攻击了。无论何时更改,Vim都可以自动将文件写入磁盘。只需将其添加到$ MYVIMRC:

autocmd TextChanged,TextChangedI <buffer> write

我相信你需要Vim 7.4。与autosave=1相比,只要您更改文件,就会保存文件

答案 2 :(得分:6)

有CursorMoved和CursorMovedI autocmd事件,但我不认为每次在Insert模式下键入时都会应用。

您还可以,如此大胆,在插入模式下重新绑定每个可打印字符以保存然后键入字符。

答案 3 :(得分:4)

如果您正在运行Linux,可以查看
http://www.charlietanksley.net/philtex/vim-live-latex-preview/

他正在使用脚本和MuPDF(轻量级pdf查看器)进行乳胶标记的实时预览。
它是非常快的,是迄今为止我找到的最好/最简单的解决方案 我已经使用它已经有一段时间了,它很棒!

答案 4 :(得分:3)

糟糕!我被告知我忘了提到这个用法是在 TODO 列表中,并且是“ComingSoon®”。我几天前确实想要这个功能,发现它还没有用。 DRAT!

在.vimrc中使用自动保存选项(_vimrc for windows)

set autosave=4

这将在上次更改后4秒保存您的文件。将其设置为一个可以实现您正在寻找的东西。这将是自动的,始终有效。 (越简单越好)

TODO ...很明显我没有保留在我很久以前写这个答案时发现的地方。谢谢@sehe

答案 5 :(得分:0)

我建议使用我在类似的Save file after each edit in vim 问题中描述的方法:


CursorHoldCursorHoldI可能有所帮助。根据文件:

|CursorHold|        the user doesn't press a key for a while
|CursorHoldI|       the user doesn't press a key for a while in Insert mode

这些事件在不活动后仅触发一次,并依赖于updatetime变量(默认值:4000毫秒)。所以你可以:

:au CursorHold <buffer> :update

在正常模式下默认4秒不活动后,将更新当前缓冲区文件(即仅在修改后保存)。

如果要在插入模式下获得相同的行为,请为CursorHoldI添加自动命令。


设置CursorHoldCursorHoldI个事件以及非常短的updatetime将使vim在编辑后立即保存文件。