2021-10-16 12:03:17 +02:00
|
|
|
local M = {}
|
2021-11-14 13:44:00 +01:00
|
|
|
local Log = require "lvim.core.log"
|
2021-07-25 13:55:19 +02:00
|
|
|
|
2021-10-16 12:03:17 +02:00
|
|
|
--- Load the default set of autogroups and autocommands.
|
2022-05-21 16:48:47 +02:00
|
|
|
function M.load_defaults()
|
2022-09-19 17:44:04 +02:00
|
|
|
vim.api.nvim_create_autocmd({ "FileType" }, {
|
|
|
|
pattern = {
|
|
|
|
"Jaq",
|
|
|
|
"qf",
|
|
|
|
"help",
|
|
|
|
"man",
|
|
|
|
"lspinfo",
|
|
|
|
"spectre_panel",
|
|
|
|
"lir",
|
|
|
|
"DressingSelect",
|
|
|
|
"tsplayground",
|
|
|
|
},
|
|
|
|
callback = function()
|
|
|
|
vim.cmd [[
|
|
|
|
nnoremap <silent> <buffer> q :close<CR>
|
|
|
|
set nobuflisted
|
|
|
|
]]
|
|
|
|
end,
|
|
|
|
})
|
2022-05-21 16:48:47 +02:00
|
|
|
local definitions = {
|
|
|
|
{
|
|
|
|
"TextYankPost",
|
2021-10-16 12:03:17 +02:00
|
|
|
{
|
2022-05-21 16:48:47 +02:00
|
|
|
group = "_general_settings",
|
|
|
|
pattern = "*",
|
|
|
|
desc = "Highlight text on yank",
|
|
|
|
callback = function()
|
2022-09-16 05:33:08 +02:00
|
|
|
require("vim.highlight").on_yank { higroup = "Search", timeout = 100 }
|
2022-05-21 16:48:47 +02:00
|
|
|
end,
|
2021-10-16 12:03:17 +02:00
|
|
|
},
|
2022-05-21 16:48:47 +02:00
|
|
|
},
|
2022-10-06 04:49:58 +02:00
|
|
|
{
|
|
|
|
"FileType",
|
|
|
|
{
|
|
|
|
group = "_hide_dap_repl",
|
|
|
|
pattern = "dap-repl",
|
|
|
|
command = "set nobuflisted",
|
|
|
|
},
|
|
|
|
},
|
2022-05-21 16:48:47 +02:00
|
|
|
{
|
|
|
|
"FileType",
|
2021-10-16 12:03:17 +02:00
|
|
|
{
|
2022-05-21 16:48:47 +02:00
|
|
|
group = "_filetype_settings",
|
|
|
|
pattern = "qf",
|
|
|
|
command = "set nobuflisted",
|
2021-10-16 12:03:17 +02:00
|
|
|
},
|
2021-10-04 09:15:26 +02:00
|
|
|
},
|
2022-05-21 16:48:47 +02:00
|
|
|
{
|
|
|
|
"FileType",
|
|
|
|
{
|
|
|
|
group = "_filetype_settings",
|
|
|
|
pattern = { "gitcommit", "markdown" },
|
|
|
|
command = "setlocal wrap spell",
|
|
|
|
},
|
2021-07-25 13:55:19 +02:00
|
|
|
},
|
2022-05-21 16:48:47 +02:00
|
|
|
{
|
|
|
|
"FileType",
|
|
|
|
{
|
|
|
|
group = "_buffer_mappings",
|
|
|
|
pattern = { "qf", "help", "man", "floaterm", "lspinfo", "lsp-installer", "null-ls-info" },
|
|
|
|
command = "nnoremap <silent> <buffer> q :close<CR>",
|
|
|
|
},
|
2021-07-25 13:55:19 +02:00
|
|
|
},
|
2022-05-21 16:48:47 +02:00
|
|
|
{
|
|
|
|
{ "BufWinEnter", "BufRead", "BufNewFile" },
|
|
|
|
{
|
|
|
|
group = "_format_options",
|
|
|
|
pattern = "*",
|
|
|
|
command = "setlocal formatoptions-=c formatoptions-=r formatoptions-=o",
|
|
|
|
},
|
2021-07-25 13:55:19 +02:00
|
|
|
},
|
2022-05-21 16:48:47 +02:00
|
|
|
{
|
|
|
|
"VimResized",
|
|
|
|
{
|
|
|
|
group = "_auto_resize",
|
|
|
|
pattern = "*",
|
|
|
|
command = "tabdo wincmd =",
|
|
|
|
},
|
2021-07-25 13:55:19 +02:00
|
|
|
},
|
2022-09-28 19:50:20 +02:00
|
|
|
{
|
|
|
|
"FileType",
|
|
|
|
{
|
|
|
|
group = "_filetype_settings",
|
|
|
|
pattern = "alpha",
|
|
|
|
callback = function()
|
|
|
|
vim.cmd [[
|
|
|
|
nnoremap <silent> <buffer> q :qa<CR>
|
|
|
|
nnoremap <silent> <buffer> <esc> :qa<CR>
|
|
|
|
set nobuflisted
|
|
|
|
]]
|
|
|
|
end,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"FileType",
|
|
|
|
{
|
|
|
|
group = "_filetype_settings",
|
|
|
|
pattern = "lir",
|
|
|
|
callback = function()
|
|
|
|
vim.opt_local.number = false
|
|
|
|
vim.opt_local.relativenumber = false
|
|
|
|
end,
|
|
|
|
},
|
|
|
|
},
|
2021-10-16 12:03:17 +02:00
|
|
|
}
|
2022-05-21 16:48:47 +02:00
|
|
|
|
|
|
|
M.define_autocmds(definitions)
|
2021-10-16 12:03:17 +02:00
|
|
|
end
|
2021-07-25 13:55:19 +02:00
|
|
|
|
2021-11-14 13:44:00 +01:00
|
|
|
local get_format_on_save_opts = function()
|
|
|
|
local defaults = require("lvim.config.defaults").format_on_save
|
|
|
|
-- accept a basic boolean `lvim.format_on_save=true`
|
|
|
|
if type(lvim.format_on_save) ~= "table" then
|
|
|
|
return defaults
|
|
|
|
end
|
|
|
|
|
|
|
|
return {
|
|
|
|
pattern = lvim.format_on_save.pattern or defaults.pattern,
|
|
|
|
timeout = lvim.format_on_save.timeout or defaults.timeout,
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2022-05-03 01:10:51 +02:00
|
|
|
function M.enable_format_on_save()
|
|
|
|
local opts = get_format_on_save_opts()
|
|
|
|
vim.api.nvim_create_augroup("lsp_format_on_save", {})
|
|
|
|
vim.api.nvim_create_autocmd("BufWritePre", {
|
|
|
|
group = "lsp_format_on_save",
|
|
|
|
pattern = opts.pattern,
|
|
|
|
callback = function()
|
2022-05-03 14:29:25 +02:00
|
|
|
require("lvim.lsp.utils").format { timeout_ms = opts.timeout, filter = opts.filter }
|
2022-05-03 01:10:51 +02:00
|
|
|
end,
|
|
|
|
})
|
2021-11-14 13:44:00 +01:00
|
|
|
Log:debug "enabled format-on-save"
|
|
|
|
end
|
|
|
|
|
|
|
|
function M.disable_format_on_save()
|
2022-05-21 16:48:47 +02:00
|
|
|
M.clear_augroup "lsp_format_on_save"
|
2021-11-14 13:44:00 +01:00
|
|
|
Log:debug "disabled format-on-save"
|
|
|
|
end
|
|
|
|
|
|
|
|
function M.configure_format_on_save()
|
|
|
|
if lvim.format_on_save then
|
2022-05-03 01:10:51 +02:00
|
|
|
M.enable_format_on_save()
|
2021-11-14 13:44:00 +01:00
|
|
|
else
|
|
|
|
M.disable_format_on_save()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function M.toggle_format_on_save()
|
2022-06-06 11:50:24 +02:00
|
|
|
local exists, autocmds = pcall(vim.api.nvim_get_autocmds, {
|
2022-05-03 01:10:51 +02:00
|
|
|
group = "lsp_format_on_save",
|
|
|
|
event = "BufWritePre",
|
|
|
|
})
|
2022-06-06 11:50:24 +02:00
|
|
|
if not exists or #autocmds == 0 then
|
2022-05-03 01:10:51 +02:00
|
|
|
M.enable_format_on_save()
|
2021-11-14 13:44:00 +01:00
|
|
|
else
|
|
|
|
M.disable_format_on_save()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-10-17 14:06:12 +02:00
|
|
|
function M.enable_reload_config_on_save()
|
|
|
|
local user_config_file = require("lvim.config"):get_user_config_path()
|
|
|
|
|
|
|
|
if vim.loop.os_uname().version:match "Windows" then
|
|
|
|
-- autocmds require forward slashes even on windows
|
|
|
|
user_config_file = user_config_file:gsub("\\", "/")
|
|
|
|
end
|
|
|
|
vim.api.nvim_create_autocmd("BufWritePost", {
|
|
|
|
group = "_general_settings",
|
|
|
|
pattern = user_config_file,
|
|
|
|
desc = "Trigger LvimReload on saving config.lua",
|
|
|
|
callback = function()
|
|
|
|
require("lvim.config"):reload()
|
|
|
|
end,
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
2022-01-04 09:47:59 +01:00
|
|
|
function M.enable_transparent_mode()
|
2022-05-21 16:48:47 +02:00
|
|
|
vim.api.nvim_create_autocmd("ColorScheme", {
|
|
|
|
pattern = "*",
|
|
|
|
callback = function()
|
|
|
|
local hl_groups = {
|
|
|
|
"Normal",
|
|
|
|
"SignColumn",
|
|
|
|
"NormalNC",
|
|
|
|
"TelescopeBorder",
|
|
|
|
"NvimTreeNormal",
|
|
|
|
"EndOfBuffer",
|
|
|
|
"MsgArea",
|
|
|
|
}
|
|
|
|
for _, name in ipairs(hl_groups) do
|
|
|
|
vim.cmd(string.format("highlight %s ctermbg=none guibg=none", name))
|
|
|
|
end
|
|
|
|
end,
|
|
|
|
})
|
|
|
|
vim.opt.fillchars = "eob: "
|
2022-01-04 09:47:59 +01:00
|
|
|
end
|
|
|
|
|
2022-05-21 16:48:47 +02:00
|
|
|
--- Clean autocommand in a group if it exists
|
|
|
|
--- This is safer than trying to delete the augroup itself
|
2022-01-03 11:06:45 +01:00
|
|
|
---@param name string the augroup name
|
2022-05-21 16:48:47 +02:00
|
|
|
function M.clear_augroup(name)
|
2022-01-03 11:06:45 +01:00
|
|
|
-- defer the function in case the autocommand is still in-use
|
2022-09-07 09:10:47 +02:00
|
|
|
Log:debug("request to clear autocmds " .. name)
|
2022-01-03 11:06:45 +01:00
|
|
|
vim.schedule(function()
|
2022-09-07 09:10:47 +02:00
|
|
|
pcall(function()
|
2022-05-21 16:48:47 +02:00
|
|
|
vim.api.nvim_clear_autocmds { group = name }
|
2022-09-07 09:10:47 +02:00
|
|
|
end)
|
2022-01-03 11:06:45 +01:00
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
|
|
|
--- Create autocommand groups based on the passed definitions
|
2022-05-21 16:48:47 +02:00
|
|
|
--- Also creates the augroup automatically if it doesn't exist
|
|
|
|
---@param definitions table contains a tuple of event, opts, see `:h nvim_create_autocmd`
|
|
|
|
function M.define_autocmds(definitions)
|
|
|
|
for _, entry in ipairs(definitions) do
|
|
|
|
local event = entry[1]
|
|
|
|
local opts = entry[2]
|
|
|
|
if type(opts.group) == "string" and opts.group ~= "" then
|
|
|
|
local exists, _ = pcall(vim.api.nvim_get_autocmds, { group = opts.group })
|
|
|
|
if not exists then
|
|
|
|
vim.api.nvim_create_augroup(opts.group, {})
|
|
|
|
end
|
2021-07-25 13:55:19 +02:00
|
|
|
end
|
2022-05-21 16:48:47 +02:00
|
|
|
vim.api.nvim_create_autocmd(event, opts)
|
2021-07-25 13:55:19 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-10-16 12:03:17 +02:00
|
|
|
return M
|