summaryrefslogtreecommitdiff
path: root/nvim/lua/plugins/autosave.lua
blob: 9cbcd839ea508e198d32a934bddaec507d0577ba (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
return {
	"okuuva/auto-save.nvim",
	enabled = true,
	cmd = "ASToggle", -- optional for lazy loading on command
	event = { "InsertLeave", "TextChanged" }, -- optional for lazy loading on trigger events
	opts = {
		enabled = true, -- start auto-save when the plugin is loaded (i.e. when your package manager loads it)
		trigger_events = { -- See :h events
			-- -- vim events that trigger an immediate save
			-- -- I'm disabling this, as it's autosaving when I leave the buffer and
			-- -- that's autoformatting stuff if on insert mode and following a tutorial
			-- -- Re-enabling this to only save if NOT in insert mode in the condition below
			-- immediate_save = { nil },
			immediate_save = { "BufLeave", "FocusLost", "QuitPre", "VimSuspend" }, -- vim events that trigger an immediate save
			-- vim events that trigger a deferred save (saves after `debounce_delay`)
			defer_save = {
				"InsertLeave",
				"TextChanged",
				{ "User", pattern = "VisualLeave" },
				{ "User", pattern = "FlashJumpEnd" },
				{ "User", pattern = "SnacksInputLeave" },
				{ "User", pattern = "SnacksPickerInputLeave" },
			},
			cancel_deferred_save = {
				"InsertEnter",
				{ "User", pattern = "VisualEnter" },
				{ "User", pattern = "FlashJumpStart" },
				{ "User", pattern = "SnacksInputEnter" },
				{ "User", pattern = "SnacksPickerInputEnter" },
			},
		},
		-- function that takes the buffer handle and determines whether to save the current buffer or not
		-- return true: if buffer is ok to be saved
		-- return false: if it's not ok to be saved
		-- if set to `nil` then no specific condition is applied
		condition = function(buf)
			-- Do not save when I'm in insert mode
			-- Do NOT ADD VISUAL MODE HERE or the cancel_deferred_save wont' work
			-- If I STAY in insert mode and switch to another app, like YouTube to
			-- take notes, the BufLeave or FocusLost immediate_save will be ignored
			-- and the save will not be triggered
			local mode = vim.fn.mode()
			if mode == "i" then
				return false
			end

			-- Disable auto-save for the harpoon plugin, otherwise it just opens and closes
			-- https://github.com/ThePrimeagen/harpoon/issues/434
			--
			-- don't save for `sql` file types
			-- I do this so when working with dadbod the file is not saved every time
			-- I make a change, and a SQL query executed
			-- Run `:set filetype?` on a dadbod query to make sure of the filetype
			local filetype = vim.bo[buf].filetype
			if filetype == "harpoon" or filetype == "mysql" then
				return false
			end

			-- Skip autosave if you're in an active snippet
			if require("luasnip").in_snippet() then
				return false
			end

			return true
		end,
		write_all_buffers = false, -- write all buffers when the current one meets `condition`
		-- Do not execute autocmds when saving
		-- If you set noautocmd = true, autosave won't trigger an auto format
		-- https://github.com/okuuva/auto-save.nvim/issues/55
		noautocmd = false,
		lockmarks = false, -- lock marks when saving, see `:h lockmarks` for more details
		-- delay after which a pending save is executed (default 1000)
		debounce_delay = 2000,
		-- log debug messages to 'auto-save.log' file in neovim cache directory, set to `true` to enable
		debug = false,
	},
}