dotfiles/emacs/.emacs.d/elpa/lsp-mode-20260716.755/lsp-matlab.el

143 lines
5.3 KiB
EmacsLisp
Raw Normal View History

;;; 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