summaryrefslogtreecommitdiff
path: root/lua/kickstart/plugins/autoformat.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/kickstart/plugins/autoformat.lua')
-rw-r--r--lua/kickstart/plugins/autoformat.lua74
1 files changed, 74 insertions, 0 deletions
diff --git a/lua/kickstart/plugins/autoformat.lua b/lua/kickstart/plugins/autoformat.lua
new file mode 100644
index 0000000..bc56b15
--- /dev/null
+++ b/lua/kickstart/plugins/autoformat.lua
@@ -0,0 +1,74 @@
+-- autoformat.lua
+--
+-- Use your language server to automatically format your code on save.
+-- Adds additional commands as well to manage the behavior
+
+return {
+ 'neovim/nvim-lspconfig',
+ config = function()
+ -- Switch for controlling whether you want autoformatting.
+ -- Use :KickstartFormatToggle to toggle autoformatting on or off
+ local format_is_enabled = true
+ vim.api.nvim_create_user_command('KickstartFormatToggle', function()
+ format_is_enabled = not format_is_enabled
+ print('Setting autoformatting to: ' .. tostring(format_is_enabled))
+ end, {})
+
+ -- Create an augroup that is used for managing our formatting autocmds.
+ -- We need one augroup per client to make sure that multiple clients
+ -- can attach to the same buffer without interfering with each other.
+ local _augroups = {}
+ local get_augroup = function(client)
+ if not _augroups[client.id] then
+ local group_name = 'kickstart-lsp-format-' .. client.name
+ local id = vim.api.nvim_create_augroup(group_name, { clear = true })
+ _augroups[client.id] = id
+ end
+
+ return _augroups[client.id]
+ end
+
+ -- Whenever an LSP attaches to a buffer, we will run this function.
+ --
+ -- See `:help LspAttach` for more information about this autocmd event.
+ vim.api.nvim_create_autocmd('LspAttach', {
+ group = vim.api.nvim_create_augroup('kickstart-lsp-attach-format', { clear = true }),
+ -- This is where we attach the autoformatting for reasonable clients
+ callback = function(args)
+ local client_id = args.data.client_id
+ local client = vim.lsp.get_client_by_id(client_id)
+ local bufnr = args.buf
+
+ -- Only attach to clients that support document formatting
+ if not client.server_capabilities.documentFormattingProvider then
+ return
+ end
+
+ -- Tsserver usually works poorly. Sorry you work with bad languages
+ -- You can remove this line if you know what you're doing :)
+ if client.name == 'tsserver' then
+ return
+ end
+
+ -- Create an autocmd that will run *before* we save the buffer.
+ -- Run the formatting command for the LSP that has just attached.
+ vim.api.nvim_create_autocmd('BufWritePre', {
+ group = get_augroup(client),
+ buffer = bufnr,
+ callback = function()
+ if not format_is_enabled then
+ return
+ end
+
+ vim.lsp.buf.format {
+ async = false,
+ filter = function(c)
+ return c.id == client.id
+ end,
+ }
+ end,
+ })
+ end,
+ })
+ end,
+}