diff --git a/chezmoi/private_dot_config/nvim/init.lua b/chezmoi/private_dot_config/nvim/init.lua
index cc9c75d..b05f835 100644
--- a/chezmoi/private_dot_config/nvim/init.lua
+++ b/chezmoi/private_dot_config/nvim/init.lua
@@ -315,25 +315,34 @@ later(function()
     })
 
     -- only perform these mappings if an LSP is attached
-    local on_attach = function(client, buffnr)
-        local lsp_key = function(lhs, rhs, desc)
-            vim.keymap.set('n', lhs, rhs, { silent = true, buffer = buffnr, desc = desc })
-        end
+    vim.api.nvim_create_autocmd("LspAttach", {
+        callback = function(args)
+            local client = vim.lsp.get_client_by_id(args.data.client_id)
+            if not client then
+                return
+            end
 
-        lsp_key('<leader>lr', vim.lsp.buf.rename, 'Rename symbol')
-        lsp_key('<leader>la', vim.lsp.buf.code_action, 'Code action')
-        lsp_key('<leader>ld', vim.lsp.buf.type_definition, 'Type definition')
+            local buffnr = args.buf
 
-        lsp_key('gd', vim.lsp.buf.definition, 'Goto Definition')
-        lsp_key('gr', vim.lsp.buf.references, 'Goto References')
-        lsp_key('gI', vim.lsp.buf.implementation, 'Goto Implementation')
-        lsp_key('gD', vim.lsp.buf.declaration, 'Goto Declaration')
+            local lsp_key = function(lhs, rhs, desc)
+                vim.keymap.set('n', lhs, rhs, { silent = true, buffer = buffnr, desc = desc })
+            end
 
-        -- setup :Lsp* commands
-        local basics = require('lsp_basics')
-        basics.make_lsp_commands(client, buffnr)
-        basics.make_lsp_mappings(client, buffnr)
-    end
+            lsp_key('<leader>lr', vim.lsp.buf.rename, 'Rename symbol')
+            lsp_key('<leader>la', vim.lsp.buf.code_action, 'Code action')
+            lsp_key('<leader>ld', vim.lsp.buf.type_definition, 'Type definition')
+
+            lsp_key('gd', vim.lsp.buf.definition, 'Goto Definition')
+            lsp_key('gr', vim.lsp.buf.references, 'Goto References')
+            lsp_key('gI', vim.lsp.buf.implementation, 'Goto Implementation')
+            lsp_key('gD', vim.lsp.buf.declaration, 'Goto Declaration')
+
+            -- setup :Lsp* commands
+            local basics = require('lsp_basics')
+            basics.make_lsp_commands(client, buffnr)
+            basics.make_lsp_mappings(client, buffnr)
+        end,
+    })
 
     require('mason').setup()
     require('mason-lspconfig').setup({
@@ -341,18 +350,14 @@ later(function()
         -- read documentation for one-off configurations if an LSP needs/wants non-default configuration
         handlers = {
             function (server_name)
-                require('lspconfig')[server_name].setup({
-                    on_attach = on_attach
-                })
+                require('lspconfig')[server_name].setup({})
             end
         }
     })
 
     -- make sure LSPs are autostarted if already installed at neovim start
     for _, server_name in pairs(require('mason-lspconfig').get_installed_servers()) do
-        require('lspconfig')[server_name].setup({
-            on_attach = on_attach
-        })
+        require('lspconfig')[server_name].setup({})
     end
 
     -- TODO see if there is a way to automatically do this rather than having to manually specify them