From d6ad146301f44a5e5f4e45c3f7f05e7791ebaf3c Mon Sep 17 00:00:00 2001
From: TJ DeVries <devries.timothyj@gmail.com>
Date: Wed, 15 Feb 2023 15:53:09 -0500
Subject: [PATCH] add example of autoformatting

---
 init.lua                     |  4 ++-
 lua/kickstart/autoformat.lua | 61 ++++++++++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+), 1 deletion(-)
 create mode 100644 lua/kickstart/autoformat.lua

diff --git a/init.lua b/init.lua
index 33cd4c21..4e6738a2 100644
--- a/init.lua
+++ b/init.lua
@@ -78,7 +78,7 @@ require('lazy').setup({
   },
 
   -- TODO:
-  -- { import = 'kickstart' },
+  { import = 'kickstart.plugins' },
   -- { import = 'custom.plugins' },
 }, {})
 
@@ -373,6 +373,8 @@ require('fidget').setup()
 local cmp = require 'cmp'
 local luasnip = require 'luasnip'
 
+luasnip.config.setup {}
+
 cmp.setup {
   snippet = {
     expand = function(args)
diff --git a/lua/kickstart/autoformat.lua b/lua/kickstart/autoformat.lua
new file mode 100644
index 00000000..7519c2ce
--- /dev/null
+++ b/lua/kickstart/autoformat.lua
@@ -0,0 +1,61 @@
+-- Toggle this on/off for autoformatting
+local autoformatting = false
+if not autoformatting then
+  return
+end
+
+-- 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
+
+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 format_is_enabled then
+          return
+        end
+
+        vim.lsp.buf.format { async = false }
+      end,
+    })
+  end,
+})