My recent experiments with
Eglot and Java led
me to figure out how to speed up the connection to Eclipse JDT Language Server.
Basically I wanted a simpler version of
eglot--eclipse-jdt-contact to avoid
any prompt and just do the right thing for me.
Looking at Eglot’s bug tracker, there is an issue with some tips:
I followed the instructions and added the relevant code to my
(with-eval-after-load 'eglot (defconst mu-jdt-launcher (concat "/home/manuel/jdt/plugins" "/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar")) (defun mu-eglot-jdt-contact (_interactive) "See `eglot--eclipse-jdt-contact'." (let ((cp (or (getenv "CLASSPATH") path-separator))) (setenv "CLASSPATH" (concat cp path-separator mu-jdt-launcher)) (unwind-protect (eglot--eclipse-jdt-contact nil) (setenv "CLASSPATH" cp)))) (setcdr (assq 'java-mode eglot-server-programs) #'mu-eglot-jdt-contact))
However, I do not like the hard-coded path to the JDT jar file, mainly because I
have to manually update it every time I install a new version of the language
server. Fortunately, Emacs has what I need right under the hood:
(defconst mu-jdt-launcher (let ((path "~/jdt/plugins/org.eclipse.equinox.launcher_*")) (car (file-expand-wildcards path 'full))))
If you check the documentation of
file-expand-wildcards you will notice that
it returns a list of file names matching the given pattern. In this case, there
is only one element in that list, so
car can safely grab it. Again, the
documentation will also explain the meaning of that
'full argument, but I am
sure it is pretty clear already.