Hey guys, I've developed a great extension on VS Code to write Wolfram under Microsoft's Language Server Protocol (LSP). It includes diagnostics, auto-completion, hovering and usage hints, etc. More features are on the way. It is NOT for syntax highlight. It could be easily extended to other editors too. For details, please check out our GitHub.
Wolfram Language Server


by kenkangxgwe and hxianglong
Wolfram Language Server (WLServer) is an implementation of the Microsoft's Language Server Protocol (LSP)
for Wolfram Language. This server is
implemented in Wolfram Language itself.
Our current goal is to provide the experience as good as the Mathematica FrontEnd
with addition power from the editor.
We have provided the client-side code for VS Code in this repo, which is based on some slight
modifications of [Microsoft's LSP
example][4].
If you are using other tools supporting LSP, some slight modifications to the
client would certainly work too.
Installation
Wolfram Mathematica (11.2 or
higher (1)).
Download the server from its
repository.
git clone https://github.com/kenkangxgwe/lsp-wl.git
- Install the client. Currently, we provide the VS Code extension on [Visual
Studio Marketplace: Wolfram Language Server][5]
Run the Server
Clients can start the server by running the init.wls
file from Wolfram
Mathematica executables
wolfram -script /path/to/lsp-wl/init.wls [args]
# or
wolframscript -f /path/to/lsp-wl/init.wls [args]
The posible arguments for the server are
--help, -h
to print help information.
--socket=port
to assign the port that the server connect to. (Default:
6536
)
Socket is the only channel that we currently support.
--log=level, -l level
to specify the logging level of the server.
(Levels: error
, warn
, info
, debug
. Default: info
)
--test, -t
to run the unit test for the server.
If you want to run the server from Mathematica you can use the following code.
initfile = "/path/to/lsp-wl/init.wls";
args = {};
Block[{$ScriptCommandLine = Prepend[args, initfile], Quit = Function[{}, Throw[Null]]},
Catch[<< (initfile)]
];
This is a good way to see the results from the unit tests.
You may also specify the following initializationOptions
.
"theme": "dark" | "light"
For better typesetting of documentation, SVG
images are used in the popup such as hovering. Since the background is
transparent, this setting is to ensure the text in the images are actually
visible. If you use dark themes, then choose dark
(2). (Default: dark
)
Features
Hover: Provide definitions for Wolfram functions and system variables, such
as String
and $Path
.
Completion: The completion is triggered by the client automatically.
Currently, Wolfram functions and system variables would be displayed.
Completion Resolve: Further information would be provided for the items in
the list.
Diagnostics: Syntax error would be underlined. However, the specific syntax
error is not supported at the moment.
This is an early release, so more features are on the way. Syntax highlight is
NOT supported according to the design of LSP, but there are already some good
enough extensions like [Wolfram
Language][6].
Here is a full list of LSP features.
Contribute
Design Principles
The files are located according to its context name. The init.wls
is the
entry script that parses the commandline arguments, loads packages
and starts the server.
We implemented an stateless server in WolframLanguageServer`Server`
that
will parse and handle the messages.
WolframLanguageServer`DataType`
is a simple type system
that supports pattern test on every field of a class. The operations on the
objects are designed to be immutable.
WolframLanguageServer`Test`*
stores the unit tests for some of
the packages.
Todo list
It will be nice if you want to make a contribution to the following topic.
Our server-client communication only supports Socket with TCP protocol. We
tried to use ZMQ_Stream protocol and SocketListen[]
to enable concurrency,
but it fails to send responses back to the client.
It will be helpful to implement a stdio channel, so that the Mathematica
earlier than 11.2 will also be supported.
Since we embed SVG image in the markupContent[]
and VS Code client cannot
resize the popup window according to its size, it is hard to tweak the image
width and the font size on every machine. We are looking for a better solution.
More editor clients are needed. You can feel free to open a repository and
create a pull request to add the clients in README.md once your client is released.
A scanner/parser might be needed to extract tokens for future usage. We have
investigated serveral implementations in other languages, but we are still
prefer a wolfram language scanner/parser written in wolfram language and can
be easily integrated into this project.
If you want to help us with this project, feel free to fork and create a pull
request. Do not forget to add unit tests if possible.
Donations
If you really like this project, please donate to us! $5 (or equivalently?35). A cup of coffee would certainly
brighten our day! Your donation would be the motivation for us to move forward,
thanks in advance :-) .
Footnotes
(1) SocketListen[] is used for server-client communication, which is introduced since 11.2. We plan to support stdio for better compatibility.
(2) This reminds me of a joke making fun of Project Managers. A programmer, who cannot put up with endless unreasonable requests from his project manager, complained about one stupid task from him online, which is to automatically change the theme of the app with the conion, 'Add an option for users to choose when launching the app, what is the color of your cell phone protector. Then change the them accordingly.'