From c4f48f8cf96735f4b6135cc3ce904c660709b812 Mon Sep 17 00:00:00 2001 From: Belal Elsabbagh Date: Sat, 15 Nov 2025 03:16:14 +0200 Subject: [PATCH] fix --- .config/nvim/init.lua | 64 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index e8724f1..3574e9f 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -88,16 +88,72 @@ vim.diagnostic.config { }, } +-- Brief aside: **What is LSP?** +-- +-- LSP is an initialism you've probably heard, but might not understand what it is. +-- +-- LSP stands for Language Server Protocol. It's a protocol that helps editors +-- and language tooling communicate in a standardized fashion. +-- +-- In general, you have a "server" which is some tool built to understand a particular +-- language (such as `gopls`, `lua_ls`, `rust_analyzer`, etc.). These Language Servers +-- (sometimes called LSP servers, but that's kind of like ATM Machine) are standalone +-- processes that communicate with some "client" - in this case, Neovim! +-- +-- LSP provides Neovim with features like: +-- - Go to definition +-- - Find references +-- - Autocompletion +-- - Symbol Search +-- - and more! +-- +-- Thus, Language Servers are external tools that must be installed separately from +-- Neovim. This is where `mason` and related plugins come into play. +-- +-- If you're wondering about lsp vs treesitter, you can check out the wonderfully +-- and elegantly composed help section, `:help lsp-vs-treesitter` + +-- This function gets run when an LSP attaches to a particular buffer. +-- That is to say, every time a new file is opened that is associated with +-- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this +-- function will be executed to configure the current buffer vim.api.nvim_create_autocmd('LspAttach', { group = vim.api.nvim_create_augroup('kickstart-lsp-attach', { clear = true }), callback = function(event) + -- NOTE: Remember that Lua is a real programming language, and as such it is possible + -- to define small helper and utility functions so you don't have to repeat yourself. + -- + -- In this case, we create a function that lets us more easily define mappings specific + -- for LSP related items. It sets the mode, buffer and description for us each time. local map = function(keys, func, desc, mode) mode = mode or 'n' vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = 'LSP: ' .. desc }) end + -- Rename the variable under your cursor. + -- Most Language Servers support renaming across files, etc. + map('grn', vim.lsp.buf.rename, '[R]e[n]ame') + + -- Execute a code action, usually your cursor needs to be on top of an error + -- or a suggestion from your LSP for this to activate. + map('ca', vim.lsp.buf.code_action, '[G]oto Code [A]ction', { 'n', 'x' }) + + -- This function resolves a difference between neovim nightly (version 0.11) and stable (version 0.10) + ---@param client vim.lsp.Client + ---@param method vim.lsp.protocol.Method + ---@param bufnr? integer some lsp support methods only in specific files + ---@return boolean + local function client_supports_method(client, method, bufnr) + return client:supports_method(method, bufnr) + end + + -- The following two autocommands are used to highlight references of the + -- word under your cursor when your cursor rests there for a little while. + -- See `:help CursorHold` for information about when this is executed + -- + -- When you move your cursor, the highlights will be cleared (the second autocommand). local client = vim.lsp.get_client_by_id(event.data.client_id) - if client and client.supports_method(vim.lsp.protocol.Methods.textDocument_documentHighlight) then + if client and client_supports_method(client, vim.lsp.protocol.Methods.textDocument_documentHighlight, event.buf) then local highlight_augroup = vim.api.nvim_create_augroup('kickstart-lsp-highlight', { clear = false }) vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { buffer = event.buf, @@ -120,7 +176,11 @@ vim.api.nvim_create_autocmd('LspAttach', { }) end - if client and client.supports_method(vim.lsp.protocol.Methods.textDocument_inlayHint) then + -- The following code creates a keymap to toggle inlay hints in your + -- code, if the language server you are using supports them + -- + -- This may be unwanted, since they displace some of your code + if client and client_supports_method(client, vim.lsp.protocol.Methods.textDocument_inlayHint, event.buf) then map('th', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled { bufnr = event.buf }) end, '[T]oggle Inlay [H]ints')