The Godot Q&A is currently undergoing maintenance!

Your ability to ask and answer questions is temporarily disabled. You can browse existing threads in read-only mode.

We are working on bringing this community platform back to its full functionality, stay tuned for updates.

godotengine.org | Twitter

0 votes

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. :(

Godot version v3.4.stable.official.206ba70f4
related to an answer for: GDScript LSP support
in Engine by (23 points)

1 Answer

0 votes

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!

by (25 points)
Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read Frequently asked questions and How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to [email protected] with your username.