Home

Awesome

Nim Language Server

Nim Language Server, or nimlangserver, is a language server for Nim.

Installation

IMPORTANT you might want to use latest build of the nimlangserver and/or build it from source.

nimlangserver requires nimble >= 0.16.1

Installing binaries

NB: nimlangserver requires nimsuggest version that supports --v3:

You can install the latest release into $HOME/.nimble/bin using e.g.:

nimble install nimlangserver

From Source

nimble build

VSCode

Sublime Text

Install LSP-nimlangserver from Package Control.

Zed Editor

Install Nim Extenstion from the Zed Editor extensions.

Neovim

lua <<EOF

require'lspconfig'.nim_langserver.setup{
  settings = {
    nim = {
      nimsuggestPath = "~/.nimble/bin/custom_lang_server_build"
    }
  }
}

EOF

Change configuration to your liking (most probably you don't need to provide any settings at all, defaults should work fine for the majority of the users). You might also want to read lsp-config documentation to setup key bindings, autocompletion and so on.

IMPORTANT you might want to use latest build of the nimlangserver and/or build it from source.

VIM/Neovim

{
  "languageserver": {
    "nim": {
      "command": "nimlangserver",
      "filetypes": ["nim"],
      "trace.server": "verbose",
      "settings": {
        "nim": {
          "nimsuggestPath": "~/.nimble/bin/nimsuggest"
        }
      }
    }
  }
}

Of course, change the configuration to your liking. You might also want to read coc.nvim documentation to setup key bindings, autocompletion and so on.

Configuration Options

{
    "nim.projectMapping": [{
        // open files under tests using one nimsuggest instance started with root = test/all.nim
        "projectFile": "tests/all.nim",
        "fileRegex": "tests/.*\\.nim"
    }, {
        // everything else - use main.nim as root.
        "projectFile": "main.nim",
        "fileRegex": ".*\\.nim"
    }]
}

Note when in a nimble project, nimble will drive the entry points for nimsuggest.

Features

nimlangserver supports the following LSP features:

You can install nimlangserver using the instructions for your text editor below:

Extension methods

In addition to the standard LSP methods, nimlangserver provides additional nim specific methods.

extension/macroExpand

type
  ExpandTextDocumentPositionParams* = ref object of RootObj
    textDocument*: TextDocumentIdentifier
    position*: Position
    level*: Option[int]

Where:

type
  ExpandResult* = ref object of RootObj
    range*: Range
    content*: string

Where:

Here it is sample request/response:

[Trace - 11:10:09 AM] Sending request 'extension/macroExpand - (141)'.
Params: {
  "textDocument": {
    "uri": "file:///.../tests/projects/hw/hw.nim"
  },
  "position": {
    "line": 27,
    "character": 2
  },
  "level": 1
}


[Trace - 11:10:10 AM] Received response 'extension/macroExpand - (141)' in 309ms.
Result: {
  "range": {
    "start": {
      "line": 27,
      "character": 0
    },
    "end": {
      "line": 28,
      "character": 19
    }
  },
  "content": "  block:\n    template field1(): untyped =\n      a.field1\n\n    template field2(): untyped =\n      a.field2\n\n    field1 = field2"
}

VSCode

Install the vscode-nim extension from here

Emacs

(add-hook 'nim-mode-hook #'lsp)

Transport

nimlangserver supports two transport modes:

To use socket mode, start nimlangserver with the --socket flag. You can set the port using the --port flag. If you don't specify the port, nimlangserver will automatically find an open port and print it in the console.

Related Projects

License

MIT