repos/autosave.vim

vim plugin to autosave buffer when leaving cursor idle
Commits Files Refs README LICENSE
plugin/autosave.vim (56 lines)
   1 " default filetypes
   2 if !exists('g:auto_save_filetypes')
   3     let g:auto_save_filetypes = [ 'markdown', 'text' ]
   4 endif
   5 
   6 if !exists('g:auto_save_all_filetypes')
   7     let g:auto_save_all_filetypes = 0
   8 endif
   9 
  10 let s:auto_save_filetype_enabled = 0
  11 let s:auto_save_write = 0
  12 
  13 function s:auto_save()
  14     if s:auto_save_filetype_enabled == 1 || g:auto_save_all_filetypes == 1
  15         if s:auto_save_write == 1
  16             let s:auto_save_write = 0
  17             let l:filename = expand('%') 
  18             if &modified && l:filename != ""
  19                 let l:bytes = line2byte('$') + len(getline('$'))
  20                 let l:home = expand('$HOME')
  21                 let l:newfile = filereadable(l:filename) ? "" : "[New] "
  22 
  23                 if l:filename =~ '^' . l:home
  24                     let l:rel_filename = substitute(l:filename, l:home, '~', '')
  25                 else
  26                     let l:rel_filename = l:filename
  27                 endif
  28 
  29                 silent! write
  30                 let l:echo_msg = "\"" .. rel_filename .. "\" " .. l:newfile
  31                             \ .. line('$') .. "L, " .. l:bytes .. "B written [autosave]"
  32 
  33                 let l:echo_msg_len = len(l:echo_msg)
  34                 if (v:echospace - l:echo_msg_len) < 0
  35                     let l:echo_msg = l:echo_msg[l:echo_msg_len - v:echospace + 1: l:echo_msg_len]
  36                     let l:echo_msg = substitute(l:echo_msg, '^.', '<', '')
  37                 endif
  38 
  39                 echo l:echo_msg
  40             endif
  41         endif
  42     endif
  43 endfunction
  44 
  45 function s:autosave_current_buffer_enable()
  46     let s:auto_save_filetype_enabled = 1
  47     au TextChanged,TextChangedI <buffer> silent! let s:auto_save_write = 1
  48     au CursorHold,CursorHoldI <buffer> call s:auto_save()
  49 endfunction
  50 
  51 if g:auto_save_all_filetypes == 0
  52     au BufEnter,FileType * if index(g:auto_save_filetypes, &filetype) !=# -1 |
  53                 \ call s:autosave_current_buffer_enable() | endif
  54 else
  55     au BufEnter,FileType * call s:autosave_current_buffer_enable()
  56 endif