Skip to content
hammerfunctor edited this page Sep 3, 2022 · 22 revisions

Editor Support

Visual Studio Code

Get the Extension from Visual Studio Marketplace

GNU Emacs

lsp-mode

Tested under Linux. Not working for Windows, since sockets are not supported. See Windows.

(add-to-list 'lsp-language-id-configuration '(wolfram-mode . "Mathematica"))

(lsp-register-client
 (make-lsp-client :language-id 'wolfram
                  :new-connection (lsp-tcp-server-command
                                   (lambda (port)
                                     `("wolfram" ;; or "wolframscript"
                                       "-script" ;; or "-file"
                                       "path/to/lsp-wl/init.wls"
                                       ,(concat
                                         "--socket="
                                         (number-to-string port)
                                         ))))
                  :major-modes '(wolfram-mode)
                  :server-id 'lsp-wl
                  ))

Windows

For windows, emacs does not support socket communications. We can write a small script (in whatever language that supports stdio and TCP) to bridge between stdio and socket. An example js script can be found here: https://gist.github.com/kenkangxgwe/67e7a830848650bf88bbc36f8d3e2af5.

Then the emacs config becomes:

(add-to-list 'lsp-language-id-configuration '(wolfram-mode . "Mathematica"))

(lsp-register-client
 (make-lsp-client :language-id 'wolfram
                  :new-connection (lsp-stdio-connection
                                   '("node"
                                    "/path/to/lsp-wl-stdio-bridge.js"))
                  :activation-fn (lsp-activate-on "Mathematica")
                  :major-modes '(wolfram-mode)
                  :server-id 'lsp-wl
                  )) 

eglot

eglot intentionally avoids pipe due to the same reason. Tested only on Linux, but it may work on Windows.

(let ((wlserver (expand-file-name "path/to/lsp-wl/init.wls")))
  (when (and (file-exists-p wlserver) (executable-find "wolframscript"))
    (with-eval-after-load 'eglot
      (add-to-list 'eglot-server-programs
                   `(wolfram-mode . ("wolframscript" "-f" ,wlserver
                                     "--tcp-server" :autoport))))))

(Neo)vim

Use coc.nvim together with coc-lsp-wl.

Troubleshooting

Enable Logging

To reveal the internal debug and kernel message, change info to debug at init.wls#L188 or the similar place if you check out another branch. It reads:

    loglevel = ArgumentValue["--log"|"-l", Alternatives @@ LoggingLevels]
        // Replace[_Missing -> "debug"];

You can see the logging message in the output console of the editor. You may also dump it to a file. Uncomment init.wls#L194 or the similar place in another branch, so it reads:

    logstreams = {
        OpenWrite[WolframLanguageServer`RootDirectory <> "wlserver.log"],
        First @ Streams["stderr"]
    };

It will be saved to path/to/lsp-wl/wlserver.log.

Working with Mathematica 12.3/13.0

Mathematica 12.3 & 13.0 are shipped with a new ZeroMQLink paclet version 1.2.0 which was found to have issues with TCP connections.

Please manually upgrade the ZeroMQLink paclet to version 1.2.6 or later:

PacletInstall["ZeroMQLink"]

Working with Wolfram Engine

Some versions of Wolfram Engine do not come with symbol usages. Thus all the hovering and completion documentation will be empty with that particular version.

As a workaround, you can copy an existing Usage.m file from Mathematica or another version of Wolfram Engine.

The path is $InstallationDirectory\SystemFiles\Kernel\TextResources\$Language\Usage.m.

Cannot start w/ Mathematica 11.2

The Curry issue has been resolved in 0.2.1. If it still happens, please file an issue.

  • Currys has been replaced by lambda expressions project-widely.

    Meanwhile, I figured out that Curry is not so efficient as the lambda function, so I started to transform them back into Function.

    Mathematica 11.2 doesn't have Curry function, so far, you just need to checkout the develop branch, where I implemented my own MyCurry function.

Related Posts

中文