From 2eada65d5231a14765a257078b102984529a6f63 Mon Sep 17 00:00:00 2001 From: TJ DeVries Date: Mon, 19 Dec 2022 17:50:28 -0500 Subject: [PATCH] init: autoformat sub-plugin --- .gitignore | 1 + after/plugin/autoformat.lua | 60 +++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 after/plugin/autoformat.lua diff --git a/.gitignore b/.gitignore index d699e1d6..1b83131b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ tags test.sh .luarc.json nvim +plugin/packer_compiled.lua diff --git a/after/plugin/autoformat.lua b/after/plugin/autoformat.lua new file mode 100644 index 00000000..250b848e --- /dev/null +++ b/after/plugin/autoformat.lua @@ -0,0 +1,60 @@ +local enable_autoformat = true +if not enable_autoformat then + return +end + +-- Switch for controlling whether you want autoformatting. +-- Use :KickstartFormatToggle to toggle autoformatting on or off +local enabled = true +vim.api.nvim_create_user_command('KickstartFormatToggle', function() + enabled = not enabled + print('Setting autoformatting to: ' .. tostring(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 + +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 + + vim.api.nvim_create_autocmd('BufWritePre', { + group = get_augroup(client), + buffer = bufnr, + callback = function() + if not enabled then + return + end + + vim.lsp.buf.format { async = false } + end, + }) + end, +})