aboutsummaryrefslogtreecommitdiffhomepage
path: root/.config/nvim/lua/autosave.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/nvim/lua/autosave.lua')
-rw-r--r--.config/nvim/lua/autosave.lua80
1 files changed, 80 insertions, 0 deletions
diff --git a/.config/nvim/lua/autosave.lua b/.config/nvim/lua/autosave.lua
new file mode 100644
index 0000000..ae481ed
--- /dev/null
+++ b/.config/nvim/lua/autosave.lua
@@ -0,0 +1,80 @@
+local M = {}
+
+
+local INTERVAL_MS = 10 * 1000
+local SILENT = true
+
+
+-- Because a timer cannot be converted to Vim value,
+-- store indice of timers instead of timer instances.
+local timers = {}
+
+
+local function handler()
+ if not vim.bo.modified then
+ return
+ end
+ if vim.bo.readonly then
+ return
+ end
+ if vim.bo.buftype ~= '' then
+ return
+ end
+ if vim.fn.bufname() == '' then
+ return
+ end
+
+ if not SILENT then
+ vim.cmd([[echohl Comment]])
+ vim.cmd([[echo 'Auto-saving...']])
+ vim.cmd([[echohl None]])
+ end
+
+ vim.cmd([[silent! write]])
+
+ if not SILENT then
+ vim.cmd([[echohl Comment]])
+ vim.cmd([[echo 'Saved.']])
+ vim.cmd([[echohl None]])
+ end
+end
+
+
+function M.enable()
+ if vim.b.autosave_timer_id then
+ return
+ end
+
+ local timer = vim.loop.new_timer()
+ timer:start(INTERVAL_MS, INTERVAL_MS, vim.schedule_wrap(handler))
+ local tid = #timers + 1
+ timers[tid] = timer
+ vim.b.autosave_timer_id = tid
+end
+
+
+function M.disable()
+ if not vim.b.autosave_timer_id then
+ return
+ end
+
+ local tid = vim.b.autosave_timer_id
+ vim.b.autosave_timer_id = nil
+ if not timers[tid] then
+ return
+ end
+ timers[tid]:close()
+ timers[tid] = nil
+end
+
+
+function M.toggle()
+ if vim.b.autosave_timer_id then
+ M.disable()
+ else
+ M.enable()
+ end
+end
+
+
+return M