Как автоматически сохранять файл каждую секунду в vim?

Я не хочу знать, почему вы не должны автоматически сохранять, или есть файл подкачки и т. Д., Или какие-либо причины, по которым автоматическое сохранение не выполняется.

Я просто хочу автоматически сохранять текущий рабочий файл, чтобы сохранять его каждую секунду в vim.

Как я могу этого добиться?


person user537488    schedule 09.08.2011    source источник
comment
Для читателей 2021 года: если вы тоже используете Coc.nvim, прочтите мой ответ. Я эксперт по Vim.   -  person Rainning    schedule 03.05.2021


Ответы (4)


Это сохраняет буфер при изменении текста. (Vim 7.4)

autocmd TextChanged,TextChangedI <buffer> silent write

person Sameer    schedule 09.12.2014
comment
Большой палец вверх за элегантность и простоту! Работал как ветер! [Это нужно поместить в его _vimrc.] - person llinfeng; 22.08.2016
comment
Это не решает буквально поставленную проблему, но кажется действительно хорошей заменой. Можно ли это отметить как решение? - person philo vivero; 28.09.2019
comment
autocmd TextChanged,TextChangedI * silent write работает для любого буфера. - person ayorgo; 23.06.2020

Когда вы начинаете читать файл, установите переменную буфера на текущее время:

au BufRead,BufNewFile * let b:save_time = localtime()

Установите событие, чтобы проверить, прошло ли достаточно времени с момента последнего сохранения и обновить, если нет:

au CursorHold * call UpdateFile()

Установите период автосохранения в секундах:

let g:autosave_time = 1

При необходимости определите функцию для сохранения файла:

" save if needed / update the save_time after the save
function! UpdateFile()
  if((localtime() - b:save_time) >= g:autosave_time)
      update
      let b:save_time = localtime()
  else
      " just debugging info
      echo "[+] ". (localtime() - b:save_time) ." seconds have elapsed so far."
  endif
endfunction

Затем, чтобы явно сбросить время сохранения:

au BufWritePre * let b:save_time = localtime()

Я не тестировал вышеперечисленное на vim 7.0 и новее. Кроме того, события CursorHold вряд ли будет достаточно для такого небольшого периода автосохранения (оно также не срабатывает при записи) - возможно, вам также следует вызвать UpdateFile() на CursorMoved.

Также рассмотрите возможность использования файлов подкачки. По умолчанию файл подкачки записывается после ввода 200 символов или 4 секунд бездействия. Восстановление из свопа довольно простое и, может быть, более надежное, если что-то пойдет не так.

person Michael Foukarakis    schedule 09.08.2011
comment
Похоже, что эта функция уже запланирована в следующих версиях Vim (в Vim 7.3 :help autosave отображается с todo.txt). На данный момент я считаю, что нет подходящего autocmd / event для написания vimscript для выполнения сохранения каждую секунду. Но решение, предложенное Майклом, должно работать в большинстве случаев, потому что даже если оно не выполняет сохранения, когда курсор не перемещается, маловероятно, что вы внесете какие-либо изменения, не перемещая курсор. - person mMontu; 09.08.2011
comment
В vim 7.4 встроенная функция автосохранения все еще указана в списке улучшений, которые будут добавлены в будущих версиях. - person joelostblom; 19.02.2016

Для читателей в 2021 году, и вы используете плагин CoC.nvim

Используйте это, совместимое с Coc.nvim:

autocmd InsertLeave * if &readonly==0 && filereadable(bufname('%')) \
                       | silent update | endif

Принятый ответ приведет к сбою автозаполнения.

Мир.

person Rainning    schedule 03.05.2021

Плагин vim-workspace имеет довольно настраиваемую функцию автосохранения, которая может удовлетворить ваши потребности (с автоматическое чтение, так что вы получите поведение «последний писатель побеждает»). Вы можете настроить его на постоянное автосохранение (по умолчанию оно автоматически сохраняется только во время сеанса рабочей области) и соответствующим образом установить время обновления.

let g:workspace_autosave_always = 1
updatetime=1000
person jaybay    schedule 07.02.2017