我希望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
答案 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 问题中描述的方法:
CursorHold
和CursorHoldI
可能有所帮助。根据文件:
|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
添加自动命令。
设置CursorHold
,CursorHoldI
个事件以及非常短的updatetime
将使vim在编辑后立即保存文件。