142 lines
5.3 KiB
EmacsLisp
142 lines
5.3 KiB
EmacsLisp
;;; lsp-matlab.el --- LSP mode integration for MATLAB -*- lexical-binding: t; -*-
|
|
|
|
;;; Commentary:
|
|
;;
|
|
;; LSP client for the MATLAB language server
|
|
;;
|
|
|
|
;;; Code:
|
|
(require 'lsp-mode)
|
|
|
|
;;; MATLAB
|
|
(defgroup lsp-matlab nil
|
|
"Lsp support for MATLAB."
|
|
:group 'lsp-mode
|
|
:tag "Lsp MATLAB")
|
|
|
|
(defcustom lsp-clients-matlab-nodejs "node"
|
|
"Node.js to launch the MATLAB language server."
|
|
:group 'lsp-matlab
|
|
:type '(string))
|
|
|
|
(defcustom lsp-clients-matlab-server "/usr/local/apps/matlabls/out/index.js"
|
|
"Path to the MATLAB language server, index.js.
|
|
|
|
For an overview and detailed install instructions, see:
|
|
https://github.com/mathworks/Emacs-MATLAB-Mode/blob/doc/\
|
|
matlab-language-server-lsp-mode.org
|
|
|
|
To setup,
|
|
1. Download the language server (clone or unzip):
|
|
git clone https://github.com/mathworks/MATLAB-language-server.git
|
|
or Download and unzip a release from
|
|
https://github.com/mathworks/MATLAB-language-server
|
|
2. In the clone or unzip directory,
|
|
npm install
|
|
npm run compile
|
|
npm run package # optional JavaScript minimization
|
|
3. Set lsp-clients-matlab-server to the download directory, or
|
|
copy the ./out and ./matlab/ directory trees to an install location, e.g.
|
|
cp -r ./out/ /usr/local/apps/matlabls/out/
|
|
cp -r ./matlab/ /usr/local/apps/matlabls/matlab/
|
|
then set `lsp-clients-matlab-server' to the install location."
|
|
:group 'lsp-matlab
|
|
:type '(string))
|
|
|
|
(defcustom lsp-clients-matlab-server-args '("--stdio")
|
|
"MATLAB language server arguments."
|
|
:group 'lsp-matlab
|
|
:risky t
|
|
:type '(repeat string))
|
|
|
|
(defcustom lsp-clients-matlab-install-path ""
|
|
"Path to MATLAB to use.
|
|
If not specified, then matlab is used from the system path."
|
|
:group 'lsp-matlab
|
|
:type '(string))
|
|
|
|
(defcustom lsp-clients-matlab-cmd-args ""
|
|
"Extra arguments the language server should specify when starting MATLAB."
|
|
:group 'lsp-matlab
|
|
:type '(string))
|
|
|
|
(defcustom lsp-clients-matlab-connection-timing "onStart"
|
|
"When to start the MATLAB language server."
|
|
:group 'lsp-matlab
|
|
:type '(choice
|
|
(const "onStart")
|
|
(const "onDemand")
|
|
(const "never")))
|
|
|
|
(defcustom lsp-clients-matlab-index-workspace nil
|
|
"Whether or not to use the full background indexer.
|
|
|
|
Turning this on instructs the MATLAB language server to index all
|
|
*.m files under the project root. If there are thousands of *.m
|
|
files, then the MATLAB language server may become unresponsive,
|
|
causing hangs."
|
|
:group 'lsp-matlab
|
|
:type '(boolean))
|
|
|
|
(defun matlabls-command ()
|
|
"Return matlabls launch command LIST."
|
|
(let ((cmd (flatten-tree `(,lsp-clients-matlab-nodejs
|
|
,lsp-clients-matlab-server
|
|
,@lsp-clients-matlab-server-args))))
|
|
cmd))
|
|
|
|
;; lsp-register-custom-settings plus :initialized-fn send following.
|
|
;; For available settings, see src/lifecycle/ConfigurationManager.ts
|
|
;; Params: {
|
|
;; "settings": {
|
|
;; "MATLAB": {
|
|
;; "telemetry": false,
|
|
;; "matlabConnectionTiming": "onStart",
|
|
;; "installPath": "/path/to/matlab",
|
|
;; "indexWorkspace": false
|
|
;; }
|
|
;; }
|
|
;; }
|
|
;;
|
|
;; Messages from the MATLAB language server:
|
|
;; - "telemetry/logdata"
|
|
;; The client can provide usage (telemetry) data to the server which is collected to improve
|
|
;; the MATLAB language server. Setting telemetry to false tells the language server that the
|
|
;; client is not sending data which is what Emacs is currently doing.
|
|
;; - "mvmStateChange"
|
|
;; When the MATLAB Virtual Machine (mvm) detects a change in MATLAB's state (disconnected,
|
|
;; ready, or busy) the client will receive these messages. VS Code uses these messages for
|
|
;; the embedded MATLAB Command Window. Currently, Emacs ignores these.
|
|
;; - "matlab/connection/update/server”
|
|
;; This message indicates a change in connection between the language server and MATLAB
|
|
;; (connecting, connected, or disconnected). In our case, VS Code updates its UI affordance
|
|
;; to show the active state of MATLAB.
|
|
|
|
(lsp-register-custom-settings
|
|
`(("MATLAB.indexWorkspace" nil t)
|
|
("MATLAB.installPath" (lambda () lsp-clients-matlab-install-path))
|
|
("MATLAB.matlabConnectionTiming" ,lsp-clients-matlab-connection-timing)
|
|
("MATLAB.maxFileSizeForAnalysis" 0)
|
|
("MATLAB.telemetry" nil t)))
|
|
|
|
(lsp-register-client
|
|
(make-lsp-client :new-connection (lsp-stdio-connection #'matlabls-command)
|
|
:major-modes '(matlab-ts-mode matlab-mode)
|
|
:ignore-messages '("readFile .*? requested by MATLAB but content not available")
|
|
:server-id 'matlab-ls
|
|
:language-id "MATLAB"
|
|
:initialized-fn (lambda (workspace)
|
|
(with-lsp-workspace workspace
|
|
(lsp--set-configuration
|
|
(lsp-configuration-section "MATLAB"))))
|
|
:notification-handlers ;; See src/notifications/NotificationService.ts
|
|
(ht ("telemetry/logdata" #'ignore)
|
|
("matlab/connection/update/server" #'ignore)
|
|
("matlab/sections" #'ignore)
|
|
("mvmPromptChange" #'ignore)
|
|
("mvmStateChange" #'ignore))))
|
|
|
|
(provide 'lsp-matlab)
|
|
;;; lsp-matlab.el ends here
|
|
|
|
;; LocalWords: defcustom nodejs matlabls npm defun fn
|