How to get the godot LSP to work with nvim-lsp

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By TobiasDev

Hello,

So I’ve been using nvim-lsp for Unity and some other stuff. But I have never got it running with godot… I have installed NetCat separately since it seems like I need to to do that, but I have had no look whatsoever to get this working.

Has anyone here gotten the Godot LSP working with nvim-lsp and nvim-cmp? If so, could you somehow help me setting it up with a guide or such.

It seems like it can find the server, but it does not attach it to any buffer.

     Detected filetype:   gdscript
 
 0 client(s) attached to this buffer: 
 
 Other clients that match the filetype: gdscript
 
 Config: gdscript
 	filetypes:         gd, gdscript
 	root directory:    C:\Projects\godot_truetears
 	cmd:               nc localhost 6008
 	cmd is executable: true
 	autostart:         true
 	custom handlers:   

I tried everything I can think of, and would really love the help since I don’t want to go back to VS Code again. :frowning:

:bust_in_silhouette: Reply From: xananax

Much late, but:

TL, DR

  1. Install LunarVim
  2. Install Netcat
  3. Run lvim, type :TSIntall gdscript
  4. open the config file, and paste the config below at the end. Save.

Long Version:

For anyone getting here and seeking to make Godot work with NeoVim/LunarVim, I made it work this way, using LunarVim

  1. Install nvim-tree-sitter. In LunarVim, this is installed by default, so skip this step.
  2. Install GDScript by typing :TSInstall gdscript(you may also additionally install :TSInstall godot_resource
  3. Install nvim-DAP. It comes preinstalled with lunarvim, so again if you use LunarVim, skip this step.
  4. Add the configuration for DAP as specified here (pictured below)
  5. Add the configuration for the LSP as specified here (pictured below)

Here’s the tail of my own config.lua file:

-- DAP configuration
local dap = require('dap')
dap.adapters.godot = {
  type = "server",
  host = '127.0.0.1',
  port = 6006,
}

dap.configurations.gdscript = {
  {
    type = "godot",
    request = "launch",
    name = "Launch scene",
    project = "${workspaceFolder}",
    launch_scene = true,
  }
}


-- LSP Mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
local opts = { noremap=true, silent=true }
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist, opts)

-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
local on_attach = function(client, bufnr)
  -- Enable completion triggered by <c-x><c-o>
  vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')

  -- Mappings.
  -- See `:help vim.lsp.*` for documentation on any of the below functions
  local bufopts = { noremap=true, silent=true, buffer=bufnr }
  vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)
  vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
  vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)
  vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
  vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts)
  vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, bufopts)
  vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, bufopts)
  vim.keymap.set('n', '<space>wl', function()
    print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
  end, bufopts)
  vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, bufopts)
  vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, bufopts)
  vim.keymap.set('n', '<space>ca', vim.lsp.buf.code_action, bufopts)
  vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
  vim.keymap.set('n', '<space>f', function() vim.lsp.buf.format { async = true } end, bufopts)

  local _notify = client.notify

  client.notify = function (method, params)
    if method == 'textDocument/didClose' then
      -- Godot doesn't implement didClose yet
      return
    end
    _notify(method, params)
  end
end

-- LSP Config for Godot

local lsp_flags = {
  -- This is the default in Nvim 0.7+
  debounce_text_changes = 150,
}

require'lspconfig'.gdscript.setup{
  on_attach = on_attach,
  flags = lsp_flags,
  filetypes = { "gd", "gdscript", "gdscript3" },
}

You will need netcat installed. On Arch, this is sudo pacman -S netcat
(pick option 1 when pacman asks you).

Run Godot, open a project

Run lvim . in the project’s directory (with a project.godot at the root).

Select a file, start typing!