From b87090c9527d4190ce1dc391f4cee983263f4853 Mon Sep 17 00:00:00 2001
From: David Luevano Alvarado <david@luevano.xyz>
Date: Fri, 23 Feb 2024 01:16:07 -0600
Subject: refactor: lspconfig/mason and add null-ls, add c and python support

---
 lua/config/set.lua         |   3 +
 lua/plugins/lspconfig.lua  | 193 +++++++++++++++++++++++++--------------------
 lua/plugins/null-ls.lua    |  23 ++++++
 lua/plugins/treesitter.lua |   1 +
 4 files changed, 135 insertions(+), 85 deletions(-)
 create mode 100644 lua/plugins/null-ls.lua

diff --git a/lua/config/set.lua b/lua/config/set.lua
index 1f4d774..aaa7e42 100644
--- a/lua/config/set.lua
+++ b/lua/config/set.lua
@@ -47,3 +47,6 @@ vim.api.nvim_create_autocmd('TextYankPost', {
   group = highlight_group,
   pattern = '*',
 })
+
+-- Clang
+vim.g.c_syntax_for_h = true
diff --git a/lua/plugins/lspconfig.lua b/lua/plugins/lspconfig.lua
index 27ad7b7..3390b51 100644
--- a/lua/plugins/lspconfig.lua
+++ b/lua/plugins/lspconfig.lua
@@ -1,4 +1,5 @@
 local servers = {
+  clangd = {},
   gopls = {   -- just the key for the gopls config
     gopls = { -- settings parameter in lspconfig.setup requires a this table with another "gopls" name
       completeUnimported = true,
@@ -15,7 +16,6 @@ local servers = {
       allFeatures = true,
     },
   },
-  -- jedi_language_server = {},
   pyright = {},
   lua_ls = {
     Lua = {
@@ -29,104 +29,127 @@ local servers = {
         }
       },
     },
-  }
+  },
+  gdscript = {},
 }
 
 return {
-  'neovim/nvim-lspconfig',
-  dependencies = {
-    'hrsh7th/cmp-nvim-lsp',
-    -- Required for the keybinds
-    'nvim-telescope/telescope.nvim',
+  {
     'williamboman/mason.nvim',
-    'williamboman/mason-lspconfig.nvim',
-    { 'j-hui/fidget.nvim', tag = 'legacy', opts = {} },
-    { 'folke/neodev.nvim', opts = {} },
+    opts = {
+      ensure_installed = {
+        'clangd',
+        'clang-format',
+        'gopls',
+        'rust-analyzer',
+        'mypy',
+        'ruff',
+        'autopep8',
+        'pyright',
+        'lua-language-server',
+      },
+    },
+    config = function(_, opts)
+      local mason = require("mason")
+      mason.setup(opts)
+
+      -- taken from the nvchad
+      vim.api.nvim_create_user_command("MasonInstallAll", function()
+        if opts.ensure_installed and #opts.ensure_installed > 0 then
+          vim.cmd("MasonInstall " .. table.concat(opts.ensure_installed, " "))
+        end
+      end, {})
+
+      vim.g.mason_binaries_list = opts.ensure_installed
+    end,
   },
-  config = function()
-    local lspconfig = require('lspconfig')
-    local mason = require('mason')
-    local mason_lspconfig = require('mason-lspconfig')
+  {
+    'neovim/nvim-lspconfig',
+    dependencies = {
+      'hrsh7th/cmp-nvim-lsp',
+      -- Required for the keybinds
+      'nvim-telescope/telescope.nvim',
+      { 'j-hui/fidget.nvim', tag = 'legacy', opts = {} },
+      { 'folke/neodev.nvim', opts = {} },
+    },
+    config = function()
+      local lspconfig = require('lspconfig')
 
-    -- nvim-cmp supports additional completion capabilities, so broadcast that to servers
-    local capabilities = vim.lsp.protocol.make_client_capabilities()
-    capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)
+      -- nvim-cmp supports additional completion capabilities, so broadcast that to servers
+      local capabilities = vim.lsp.protocol.make_client_capabilities()
+      capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)
 
-    local on_attach = function(_, bufnr) -- _ is client
-      -- Create a command `:Format` local to the LSP buffer
-      vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
-        -- on 0.8, you should use vim.lsp.buf.format({ bufnr = bufnr }) instead
-        -- on later neovim version, you should use vim.lsp.buf.format({ async = false }) instead
-        vim.lsp.buf.format()
-      end, { desc = 'Format current buffer with LSP' })
+      -- TODO: change keybinds to the autocmd suggested by the lspconfig github
+      local on_attach = function(_, bufnr) -- _ is client
+        -- Create a command `:Format` local to the LSP buffer
+        vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
+          vim.lsp.buf.format({ async = false })
+        end, { desc = 'Format current buffer with LSP' })
 
-      -- autoformatting on save from: https://github.com/jose-elias-alvarez/null-ls.nvim/wiki/Formatting-on-save
-      -- pretty sure this will autoformat any code
-      -- temporarily disabled as using the keymap is better so far, else a lot of unnecessary changes will be made to random files (such as thesenvim configs)
-      -- local augroup = vim.api.nvim_create_augroup('LspFormatting', {})
-      -- if client.supports_method('textDocument/formatting') then
-      --   vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr })
-      --   vim.api.nvim_create_autocmd('BufWritePre', {
-      --     group = augroup,
-      --     buffer = bufnr,
-      --     callback = function()
-      --       vim.cmd('Format')
-      --     end,
-      --   })
-      -- end
+        -- autoformatting on save from: https://github.com/jose-elias-alvarez/null-ls.nvim/wiki/Formatting-on-save
+        -- pretty sure this will autoformat any code
+        -- temporarily disabled as using the keymap is better so far, else a lot of unnecessary changes will be made to random files (such as thesenvim configs)
+        -- local augroup = vim.api.nvim_create_augroup('LspFormatting', {})
+        -- if client.supports_method('textDocument/formatting') then
+        --   vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr })
+        --   vim.api.nvim_create_autocmd('BufWritePre', {
+        --     group = augroup,
+        --     buffer = bufnr,
+        --     callback = function()
+        --       vim.cmd('Format')
+        --     end,
+        --   })
+        -- end
 
-      local nmap = function(keys, func, desc)
-        if desc then
-          desc = 'LSP: ' .. desc
+        local nmap = function(keys, func, desc)
+          if desc then
+            desc = 'LSP: ' .. desc
+          end
+          vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc })
         end
-        vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc })
-      end
 
-      nmap('<leader>f', '<CMD>Format<CR>', '[F]ormat')
-      nmap('<leader>R', '<CMD>LspRestart<CR>', '[R]estart (lsp)')
-      nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame')
-      nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction')
+        nmap('<leader>f', '<CMD>Format<CR>', '[F]ormat')
+        nmap('<leader>R', '<CMD>LspRestart<CR>', '[R]estart (lsp)')
+        nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame')
+        nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction')
 
-      nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition')
-      nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
-      nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation')
-      nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition')
-      nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
-      nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols')
+        nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition')
+        nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
+        nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation')
+        nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition')
+        nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
+        nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols')
 
-      -- See `:help K` for why this keymap
-      nmap('<leader>k', vim.lsp.buf.hover, 'Hover Documentation')
-      nmap('<leader>K', vim.lsp.buf.signature_help, 'Signature Documentation')
+        -- See `:help K` for why this keymap
+        nmap('<leader>k', vim.lsp.buf.hover, 'Hover Documentation')
+        nmap('<leader>K', vim.lsp.buf.signature_help, 'Signature Documentation')
 
-      -- Lesser used LSP functionality
-      nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
-      nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder')
-      nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder')
-      nmap('<leader>wl', function()
-        print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
-      end, '[W]orkspace [L]ist Folders')
-    end
+        -- Lesser used LSP functionality
+        nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
+        nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder')
+        nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder')
+        nmap('<leader>wl', function()
+          print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
+        end, '[W]orkspace [L]ist Folders')
+      end
 
-    mason.setup({})
-    mason_lspconfig.setup({
-      ensure_installed = vim.tbl_keys(servers),
-      handlers = {
-        function(server_name)
-          lspconfig[server_name].setup({
-            capabilities = capabilities,
-            on_attach = on_attach,
-            settings = servers[server_name],
-          })
-        end,
-      }
-    })
+      -- generic server setup
+      local function setup_server(server_name)
+        lspconfig[server_name].setup({
+          capabilities = capabilities,
+          on_attach = on_attach,
+          settings = servers[server_name],
+        })
+      end
 
-    -- At the end, add GDscript support, which is only supported by lspconfig itself
-    lspconfig.gdscript.setup({
-      capabilities = capabilities,
-      on_attach = on_attach,
-      -- Need a better setup, this is for wsl -> win setup, but the ip will change dynamically
-      -- cmd = { 'nc', '172.30.112.1', '6005' },
-    })
-  end,
+      setup_server('clangd')
+      setup_server('gopls')
+      setup_server('rust_analyzer')
+      setup_server('pyright')
+      setup_server('lua_ls')
+      -- change the gdscript cmd for wsl -> win support, need to set:
+      -- cmd = { 'nc', '172.30.112.1', '6005' }, but the ip changes dynamically
+      setup_server('gdscript')
+    end,
+  },
 }
diff --git a/lua/plugins/null-ls.lua b/lua/plugins/null-ls.lua
new file mode 100644
index 0000000..91f94e6
--- /dev/null
+++ b/lua/plugins/null-ls.lua
@@ -0,0 +1,23 @@
+return {
+  'nvimtools/none-ls.nvim',
+  dependencies = {
+    'nvim-lua/plenary.nvim',
+  },
+  config = function()
+    local null_ls = require("null-ls")
+
+    null_ls.setup({
+      sources = {
+        null_ls.builtins.formatting.clang_format,
+        null_ls.builtins.formatting.autopep8,
+        null_ls.builtins.diagnostics.mypy.with({
+          extra_args = function()
+            local virtual = os.getenv("VIRTUAL_ENV") or os.getenv("CONDA_PREFIX") or "/usr"
+            return { "--python-executable", virtual .. "/bin/python" }
+          end,
+        }),
+        null_ls.builtins.diagnostics.ruff,
+      },
+    })
+  end
+}
diff --git a/lua/plugins/treesitter.lua b/lua/plugins/treesitter.lua
index 5f4cb18..eaa6b33 100644
--- a/lua/plugins/treesitter.lua
+++ b/lua/plugins/treesitter.lua
@@ -8,6 +8,7 @@ return {
   -- as it has to be configured with the required...'.config'
   opts = {
     ensure_installed = {
+      'c',
       'bash',
       'ini',
       'go',
-- 
cgit v1.2.3-70-g09d2