A language server for Bioware's nwscript
Project description
nwscript-lsp
The LSP is built on pygls and rollnw. It is derived from the Pygls Playground and aims, at this point, only to be a tested bed for implementing LSP features. A more robust implementation will come later maybe integrating with nasher.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:
- Completions
- Hover
- Workspace Diagnostics
- Document Symbols
- Signature Help
Setup - Neovim
-
Install required package
python -m pip install rollnw -
Install the language server
python -m pip install nwscript-language-server
Note: Sometimes "--break-system-packages" is needed to install
python -m pip install --break-system-packages rollnw
python -m pip install --break-system-packages nwscript-language-server
-
Make sure
nwscript-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 ) local lspconfig = require("lspconfig") local configs = require("lspconfig.configs") if not configs.nwscript_language_server then configs.nwscript_language_server = { default_config = { cmd = { "nwscript-language-server" }, filetypes = { "nwscript" }, root_dir = lspconfig.util.root_pattern(".git", "nasher.cfg"), }, } end lspconfig.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 = false vim.bo[bufnr].shiftwidth = 4 end, settings = { ["nwscript-language-server"] = { disableSnippets = "on", }, }, }) -- Global mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions vim.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 buffer vim.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 functions local opts = { 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 mode
Install Server Dependencies
Open a terminal in the repository's root directory
-
Create a virtual environment
python -m venv env -
Install pygls
python -m pip install -r requirements.txt
Install Client Dependencies
Open terminal in the same directory as this file and execute following commands:
-
Install node dependencies
npm install -
Compile the extension
npm run compileAlternatively you can run
npm run watchif you are going to be actively working on the extension itself.
Run Extension
-
Open this directory in VS Code
-
The playground relies on the Python extension for VSCode for 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) -
Select
Launch 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 of
pygls. ThePython: Select Interpretercommand can be used to pick the correct one.Alternatively, you can set the
pygls.server.pythonPathoption in the.vscode/settings.jsonfile
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nwscript_language_server-0.12.dev0.tar.gz.
File metadata
- Download URL: nwscript_language_server-0.12.dev0.tar.gz
- Upload date:
- Size: 13.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.4 CPython/3.11.10 Linux/5.15.0-1073-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6470b6af879ecbfd16112174f8a4c4104ad3a2d994915c39f4d4d74385ca8985
|
|
| MD5 |
371e46e16de7afc97f1557d232e836f3
|
|
| BLAKE2b-256 |
6d51f40bbd0f1eacdaf9b7f3cb56f62c2f4b14e653ce62b21da98cd76300d20d
|
File details
Details for the file nwscript_language_server-0.12.dev0-py3-none-any.whl.
File metadata
- Download URL: nwscript_language_server-0.12.dev0-py3-none-any.whl
- Upload date:
- Size: 13.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.4 CPython/3.11.10 Linux/5.15.0-1073-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a6198aedaf32dd7b4f0c5c068335e7b6cbc65fd8556403eb7c471dead34f21e
|
|
| MD5 |
200a47c9f544453ea2592181901b0318
|
|
| BLAKE2b-256 |
6e856d85c8fac009d2a545c2ffa07eb4224de0429df11e460e6ce4462f10193c
|