Package: nwscript-language-server
nwscript-lspThe LSP is built onpyglsandrollnw.  It is derived from thePygls Playgroundand aims, at this point, only to be a tested bed for implementing LSP features.  A more robust implementation will come later maybe integrating withnasher.cfg.  For now only the current document path will be added to the include path of the script context resman.That the testbed extension is for vscode is out of simplicity, obviously plugins for any LSP client emacs, (neo)vim, etc will be supported.Currently, it implements:CompletionsHoverWorkspace DiagnosticsDocument SymbolsSignature HelpSetup - NeovimInstall the language serverpython -m pip install nwscript-language-serverMake surenwscript-language-serveris on your PATH!Setup neovim config - Obviously people's tastes will differ here and not all of it is fully implemented.require("config.lazy")vim.api.nvim_exec([[autocmd FileType nwscript setlocal lsp]],false)locallspconfig=require("lspconfig")localconfigs=require("lspconfig.configs")ifnotconfigs.nwscript_language_serverthenconfigs.nwscript_language_server={default_config={cmd={"nwscript-language-server"},filetypes={"nwscript"},root_dir=lspconfig.util.root_pattern(".git","nasher.cfg"),},}endlspconfig.nwscript_language_server.setup({on_attach=function(client,bufnr)-- Custom on_attach function (optional)print("nwscript language server attached!")require("lsp_signature").on_attach({bind=true,-- This is mandatory, otherwise border config won't get registered.handler_opts={border="rounded",},},bufnr)-- Enable snippet support (if your completion plugin supports snippets)vim.bo[bufnr].expandtab=falsevim.bo[bufnr].shiftwidth=4end,settings={["nwscript-language-server"]={disableSnippets="on",},},})-- Global mappings.-- See `:help vim.diagnostic.*` for documentation on any of the below functionsvim.keymap.set("n","<space>e",vim.diagnostic.open_float)vim.keymap.set("n","[d",vim.diagnostic.goto_prev)vim.keymap.set("n","]d",vim.diagnostic.goto_next)vim.keymap.set("n","<space>q",vim.diagnostic.setloclist)-- Use LspAttach autocommand to only map the following keys-- after the language server attaches to the current buffervim.api.nvim_create_autocmd("LspAttach",{group=vim.api.nvim_create_augroup("UserLspConfig",{}),callback=function(ev)-- Enable completion triggered by <c-x><c-o>vim.bo[ev.buf].omnifunc="v:lua.vim.lsp.omnifunc"-- Buffer local mappings.-- See `:help vim.lsp.*` for documentation on any of the below functionslocalopts={buffer=ev.buf}vim.keymap.set("n","gD",vim.lsp.buf.declaration,opts)vim.keymap.set("n","gd",vim.lsp.buf.definition,opts)vim.keymap.set("n","K",vim.lsp.buf.hover,opts)vim.keymap.set("n","gi",vim.lsp.buf.implementation,opts)vim.keymap.set("n","<C-k>",vim.lsp.buf.signature_help,opts)vim.keymap.set("n","<space>wa",vim.lsp.buf.add_workspace_folder,opts)vim.keymap.set("n","<space>wr",vim.lsp.buf.remove_workspace_folder,opts)vim.keymap.set("n","<space>wl",function()print(vim.inspect(vim.lsp.buf.list_workspace_folders()))end,opts)vim.keymap.set("n","<space>D",vim.lsp.buf.type_definition,opts)vim.keymap.set("n","<space>rn",vim.lsp.buf.rename,opts)vim.keymap.set({"n","v"},"<space>ca",vim.lsp.buf.code_action,opts)vim.keymap.set("n","gr",vim.lsp.buf.references,opts)vim.keymap.set("n","<space>f",function()vim.lsp.buf.format({async=true})end,opts)end,})Setup - VS Code Extension debug modeInstall Server DependenciesOpen a terminal in the repository's root directoryCreate a virtual environmentpython -m venv envInstall pyglspython -m pip install -r requirements.txtInstall Client DependenciesOpen terminal in the same directory as this file and execute following commands:Install node dependenciesnpm installCompile the extensionnpm run compileAlternatively you can runnpm run watchif you are going to be actively working on the extension itself.Run ExtensionOpen this directory in VS CodeThe playground relies on thePython extension for VSCodefor choosing the appropriate Python environment in which to run the example language servers.
If you haven't already, you will need to install it and reload the window.Open the Run and Debug view (ctrl + shift + D)SelectLaunch Clientand pressF5, this will open a second VSCode window with thevscode-playgroundextension enabled.You will need to make sure that VSCode is using a virtual environment that contains an installation ofpygls.
ThePython: Select Interpretercommand can be used to pick the correct one.Alternatively, you can set thepygls.server.pythonPathoption in the.vscode/settings.jsonfile