Skip to content

more flexibility for autocmd control #41

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 17 commits into from
Aug 9, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
new modules and done testing
  • Loading branch information
xiaoshihou514 committed Aug 3, 2023
commit 0c404a2949f6cad3bde894fe421f38005ff3a867
72 changes: 72 additions & 0 deletions lua/guard/api.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
local api = vim.api
local ft_handler = require('guard.filetype')
local events = require('guard.events')
local format = require('guard.format')

local function disable(opts)
local guard_aus = api.nvim_get_autocmds({ group = 'Guard' })
if #opts.fargs == 0 then
for _, au in ipairs(guard_aus) do
api.nvim_del_autocmd(au.id)
end
return
end
if #guard_aus == 0 then
return
end
local arg = opts.args
local _, bufnr = pcall(tonumber, arg)
if bufnr then
local bufau = api.nvim_get_autocmds({ group = 'Guard', event = 'BufWritePre', buffer = bufnr })
if #bufau ~= 0 then
api.nvim_del_autocmd(bufau[1].id)
end
else
local listener = api.nvim_get_autocmds({ group = 'Guard', event = 'FileType', pattern = arg })
if #listener ~= 0 then
api.nvim_del_autocmd(listener[1].id)
end
local bufaus = api.nvim_get_autocmds({ group = 'Guard', event = 'BufWritePre' })
for _, au in ipairs(bufaus) do
if vim.bo[au.buffer].ft == arg then
api.nvim_del_autocmd(au.id)
end
end
end
end

local function enable(opts)
if #opts.fargs == 0 and #api.nvim_get_autocmds({ group = 'Guard' }) == 0 then
local pattern = vim.tbl_keys(ft_handler)
events.watch_ft(pattern)
for _, buf in ipairs(api.nvim_list_bufs()) do
if vim.tbl_contains(pattern, vim.bo[buf].ft) then
format.attach_to_buf(buf)
end
end
return
end
local arg = opts.args
local _, bufnr = pcall(tonumber, arg)
if bufnr then
local bufau = api.nvim_get_autocmds({ group = 'Guard', event = 'BufWritePre', buffer = bufnr })
if #bufau == 0 then
format.attach_to_buf(bufnr)
end
else
local listener = api.nvim_get_autocmds({ group = 'Guard', event = 'FileType', pattern = arg })
if #listener == 0 then
events.watch_ft(arg)
end
for _, buf in ipairs(api.nvim_list_bufs()) do
if vim.bo[buf].ft == arg then
format.attach_to_buf(buf)
end
end
end
end

return {
disable = disable,
enable = enable,
}
49 changes: 49 additions & 0 deletions lua/guard/events.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
local api = vim.api
local group = api.nvim_create_augroup('Guard', { clear = true })
local ft_handler = require('guard.filetype')
local format = require('guard.format')

local function watch_ft(fts)
api.nvim_create_autocmd('FileType', {
group = group,
pattern = fts,
callback = function(args)
format.attach_to_buf(args.buf)
end,
desc = 'guard',
})
end

local function create_lspattach_autocmd(fmt_on_save)
api.nvim_create_autocmd('LspAttach', {
group = group,
callback = function(args)
local client = vim.lsp.get_client_by_id(args.data.client_id)
---@diagnostic disable-next-line: need-check-nil
if not client.supports_method('textDocument/formatting') then
return
end
local ft = vim.bo[args.buf].filetype
if not(ft_handler[ft] and ft_handler[ft].format) then
ft_handler(ft):fmt('lsp')
end

if
fmt_on_save
and #api.nvim_get_autocmds({
group = group,
event = 'FileType',
pattern = ft,
})
== 0
then
format.attach_to_buf(args.buf)
end
end,
})
end

return {
watch_ft = watch_ft,
create_lspattach_autocmd = create_lspattach_autocmd,
}
25 changes: 12 additions & 13 deletions lua/guard/format.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,10 @@ local api = vim.api
---@diagnostic disable-next-line: deprecated
local uv = vim.version().minor >= 10 and vim.uv or vim.loop
local spawn = require('guard.spawn').try_spawn
local get_prev_lines = require('guard.util').get_prev_lines
local util = require('guard.util')
local get_prev_lines = util.get_prev_lines
local filetype = require('guard.filetype')
local formatter = require('guard.tools.formatter')
local util = require('guard.util')

local function attach_to_buf(buf)
api.nvim_create_autocmd('BufWritePre', {
group = api.nvim_create_augroup('Guard', {}),
buffer = buf,
callback = function(opt)
require('guard.format').do_fmt(opt.buf)
end,
})
end


local function ignored(buf, patterns)
local fname = api.nvim_buf_get_name(buf)
Expand Down Expand Up @@ -165,6 +154,16 @@ local function do_fmt(buf)
end))
end

local function attach_to_buf(buf)
api.nvim_create_autocmd('BufWritePre', {
group = 'Guard',
buffer = buf,
callback = function(opt)
require('guard.format').do_fmt(opt.buf)
end,
})
end

return {
do_fmt = do_fmt,
attach_to_buf = attach_to_buf,
Expand Down
9 changes: 5 additions & 4 deletions lua/guard/init.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
local ft_handler = require('guard.filetype')
local util = require('guard.util')
local ft_handler = require('guard.filetype')
local events = require('guard.events')

local function register_cfg_by_table(fts_with_cfg)
for ft, cfg in pairs(fts_with_cfg or {}) do
Expand All @@ -23,6 +24,7 @@ local function resolve_multi_ft()
ft_handler[item] = vim.deepcopy(ft_handler[key])
retval[#retval + 1] = item
end
ft_handler[key] = nil
else
retval[#retval + 1] = key
end
Expand All @@ -37,13 +39,12 @@ local function setup(opt)
}

register_cfg_by_table(opt.ft)
local parsed = resolve_multi_ft()

if opt.fmt_on_save then
util.watch_ft(parsed)
events.watch_ft(resolve_multi_ft())
end
if opt.lsp_as_default_formatter then
util.create_lspattach_autocmd(opt.fmt_on_save)
events.create_lspattach_autocmd(opt.fmt_on_save)
end

local lint = require('guard.lint')
Expand Down
93 changes: 0 additions & 93 deletions lua/guard/util.lua
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
---@diagnostic disable-next-line: deprecated
local get_clients = vim.version().minor >= 10 and vim.lsp.get_clients or vim.lsp.get_active_clients
local api = vim.api
local group = api.nvim_create_augroup('Guard', { clear = true })
local ft_handler = require('guard.filetype')
local util = {}

function util.get_prev_lines(bufnr, srow, erow)
Expand Down Expand Up @@ -31,95 +29,4 @@ function util.as_table(t)
return vim.tbl_islist(t) and t or { t }
end

function util.watch_ft(fts)
api.nvim_create_autocmd('FileType', {
group = group,
pattern = fts,
callback = function(args)
require('guard.format').attach_to_buf(args.buf)
end,
desc = 'guard',
})
end

function util.create_lspattach_autocmd(fmt_on_save)
api.nvim_create_autocmd('LspAttach', {
callback = function(args)
local client = vim.lsp.get_client_by_id(args.data.client_id)
---@diagnostic disable-next-line: need-check-nil
if not client.supports_method('textDocument/formatting') then
return
end
if ft_handler[vim.bo[args.buf].filetype] and ft_handler[vim.bo[args.buf].filetype].format then
table.insert(ft_handler[vim.bo[args.buf].filetype].format, 1, 'lsp')
else
ft_handler(vim.bo[args.buf].filetype):fmt('lsp')
end

local ok, au = pcall(api.nvim_get_autocmds, {
group = 'Guard',
event = 'FileType',
pattern = vim.bo[args.buf].filetype,
})
if
fmt_on_save
and ok
and #au == 0
then
require('guard.format').attach_to_buf(args.buf)
end
end,
})
end

function util.disable(opts)
if #opts.fargs == 0 then
pcall(api.nvim_del_augroup_by_id, group)
return
end
if not pcall(api.nvim_get_autocmds, { group = group }) then
return
end
local arg = opts.args
local _, bufnr = pcall(tonumber, arg)
if bufnr then
local bufau = api.nvim_get_autocmds({ group = group, event = 'BufWritePre', buffer = bufnr })
if #bufau ~= 0 then
api.nvim_del_autocmd(bufau[1].id)
end
else
local listener = api.nvim_get_autocmds({ group = group, event = 'FileType', pattern = arg })
if #listener ~= 0 then
api.nvim_del_autocmd(listener[1].id)
local bufaus = api.nvim_get_autocmds({ group = group, event = 'BufWritePre' })
for _, au in ipairs(bufaus) do
if vim.bo[au].ft == arg then
api.nvim_del_autocmd(au.id)
end
end
end
end
end

function util.enable(opts)
if #opts.fargs == 0 and not pcall(api.nvim_get_autocmds, { group = group }) then
group = api.nvim_create_augroup('Guard', { clear = true })
util.watch_ft(ft_handler)
return
end
local arg = opts.args
local _, bufnr = pcall(tonumber, arg)
if bufnr then
local bufau = api.nvim_get_autocmds({ group = group, event = 'BufWritePre', buffer = bufnr })
if #bufau == 0 then
require('guard.format').attach_to_buf(bufnr)
end
else
local listener = api.nvim_get_autocmds({ group = group, event = 'FileType', pattern = arg })
if #listener == 0 then
util.watch_ft(arg)
end
end
end

return util
4 changes: 2 additions & 2 deletions plugin/guard.lua
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ if loaded then
end
loaded = true
vim.api.nvim_create_user_command('GuardDisable', function(opts)
require('guard.util').disable(opts)
require('guard.api').disable(opts)
end, { nargs = '?' })
vim.api.nvim_create_user_command('GuardEnable', function(opts)
require('guard.util').enable(opts)
require('guard.api').enable(opts)
end, { nargs = '?' })
vim.api.nvim_create_user_command('GuardFmt', function()
require('guard.format').do_fmt()
Expand Down