clojure-lsp logs most of what is doing to a file which location could be found:
:log-path
if specified in your clojure-lsp config, for example: {:log-path "/tmp/clojure-lsp.out"}
/tmp/clojure-lsp.<TIMESTAMP>.out
M-x
lsp-clojure-server-log
.
All LSP clients should provide a way to get the jsonrpc logs between client and server, this helps debug the requests and responses content and time.
Check below how to get the logs for most used clients:
An alternative is to pass --trace-level verbose
to clojure-lsp during process start and clojure-lsp will log the communication to the server-log.
Make sure you have the most recent version of clojure-lsp
Check if the executable is working running it from the command line, it should start up and start reading from stdin.
Type Content-Length: 51\n\n{"jsonrpc":"2.0","method":"foo","id":1,"params":{}}
. After a few moments you should get something like:
$ ./clojure-lsp
Content-Length: 51
{"jsonrpc":"2.0","method":"foo","id":1,"params":{}}
Content-Length: 101
{"jsonrpc":"2.0","id":1,"error":{"code":-32601,"message":"Method not found","data":{"method":"foo"}}}
If that is ok, clojure-lsp logs to /tmp/clojure-lsp.*.out
, so watch that file and start your editor.
LSP Clients also generally have a way to trace server interactions. Turn that on and attach both server and client logs to an issue if it's not obvious what's going on.
trace.server
is set to verbose
in your coc-settings.json
file,
e.g.,
"languageserver": {
"clojure-lsp": {
"command": "clojure-lsp",
"filetypes": ["clojure"],
"disableDiagnostics": false,
"rootPatterns": ["deps.edn", "project.clj"],
"additionalSchemes": ["jar", "zipfile"],
"trace.server": "verbose",
"initializationOptions": {
"project-specs": [{
"project-path": "deps.edn",
"classpath-cmd": ["clj", "-Spath"]
}],
"use-metadata-for-privacy?": true,
}
}
}
Then, once vim has loaded (and clojure-lsp has initialised), you can issue this command:
:CocCommand workspace.showOutput
This will show the JSON request/response bodies that go between vim and clojure-lsp. Please capture that information if you need help in tracking down the problem you are experiencing (either by reporting github issues, or talking with someone in Slack/Discord or whatever...)
clojure-lsp uses clj-kondo to analyze the classpath during server initialize for most features work, so make sure you don't see any "Error while looking up classpath..." on clojure-lsp log file.
Please note that clojure-lsp
comes bundled with clj-kondo
, so you do not have to install it separately.
For more information, check the Classpath scan settings section.
By default clojure-lsp knows how to scan most common clojure projects using the following rules:
project.clj
file, it'll run lein classpath
to get the classpath.deps.edn
file, it'll run clojure -Spath
to get the classpath.build.boot
file, it'll run boot show --fake-classpath
to get the classpath.shadow-cljs.edn
file, it'll run npx shadow-cljs classpath
to get the classpath.If your project doesn't follow the above rules or you need a custom command to get the classpath you need to configure the project-specs
clojure-lsp setting, for more details check the settings section.
By default clojure-lsp get source-paths from classpath, for more details check settings section.
If the definition lives under a different source dir, you can define source-aliases
or source-paths
setting as mentioned on settings section.
It is also important to get your project-root
correct in your client otherwise the source paths will not be found, check the project-root via your LSP client.
If you are using deps
and using a :local/root
dependency to reference another project, i.e.,
{:deps {foo.bar/baz {:local/root "/path/to/foo/project/containing/a/deps.edn"}}}
gotoDefinition
isn't working when attempting to jump to the namespace in the referenced project, then
it could be that your ~/.config/clojure-lsp/config.edn
(or legacy ~/.lsp/config.edn
) has a source paths entry, i.e., :source-paths ["src" "test"]
. This will prevent the lookup from working, as it restricts clojure-lsp to only scan those folders in the
current project for sources, and not the other project referenced via the :local/root
deps entry. It can be fixed by removing
the :source-paths
from the config (as clojure-lsp has good defaults anyway). If you do require more specific source paths,
then those can be added at the project level..clj-kondo/.cache
dir, try to remove that folder if you think it's not linting correctly.lsp/.cache/
folder, if you have issues with some specific feature,
try to remove that dir and restart the server.Add require...
on code actions when using CoC and (neo)vimIf you find, when executing the command
(coc-codeaction-line)
(or (coc-codeaction-selected)
or
(coc-codeaction-cursor)
), that you aren't getting back
all of the code actions you might expect, please ensure that you have,
in your coc-settings.json
the line disableDiagnostics
set to
false
or better yet, don't have the line there at all :-)
In some version of MacOS, Apple restrict the binary to run, to fix that run: xattr -d com.apple.quarantine /path/to/clojure-lsp
Can you improve this documentation? These fine people already did:
Eric Dallo, David Harrigan, Jacob Maine, ikappaki, Brandon Ringe, dcfrankel & caseEdit on GitHub
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close