I am
. I’m just using linux so uh, I don’t think I have a choice of scheduler. It’s fine most of the time. It’s really only if I hit 90% RAM usage that things start to lock up (though that’s easy to hit with Julia and VSCode and Zoom all going at once).
I upgraded to v4.5.1 yesterday and things are better now. I don’t know why but I was stuck on 4.1.0 and pkg> up wasn’t upgrading. Ahh, if this was all just because I had the wrong version I’m going to be sad.
My config is now back to basics:
$ cat ~/.config/helix/config.toml
theme = "autumn_night"
[editor]
trim-final-newlines = true
trim-trailing-whitespace = true
$ cat ~/.config/helix/languages.toml
[[language]]
# julia's formatter is expensive so disabled by default
name = "julia"
auto-format = true
$ julia --startup-file=no --quiet
(@v1.12) pkg> st
Status `~/.julia/environments/v1.12/Project.toml`
[5903a43b] Infiltrator v1.9.4
[2b0e0bc5] LanguageServer v4.5.1
[efd6af41] ProfileCanvas v0.1.7
$ helix --version
helix 25.07.1
and here’s an example showing that the formatter kicks in all by itself. The compiled jlfmt isn’t needed. There is a lag at boot, but it’s about 15s, which you can see as the screen hangs in the middle after the first time I try to save, which is longer than jlfmt, but it’s tolerable.
fwiw, here’s
helix.log
2025-11-12T19:32:14.847 helix_lsp::transport [ERROR] julia err <- "[ Info: Package LanguageServer (2b0e0bc5-e4fd-59b4-8912-456d1b03d8d7) is cached.\n"
2025-11-12T19:32:14.866 helix_lsp::transport [ERROR] julia err <- "[ Info: Package ProfileCanvas (efd6af41-a80b-495e-886c-e51b0c7d77a3) is cached.\n"
2025-11-12T19:32:14.866 helix_lsp::transport [ERROR] julia err <- "[ Info: Package Infiltrator (5903a43b-9cc3-4c30-8d17-598619ec4e9b) is cached.\n"
‘=’ works too – again, with a hang at the first use, but it’s not nearly as bad as before
I tried = on a bigger project. There the lag is much worse: up to a minute still. I discovered that LS is pretty slow about indexing imports. I think that was probably making things worse for me, because I was constantly killing julia before LanguageServer could fully index and write its index to disk (I still don’t know where its cache is but it’s working so it is somewhere). I’ve made it better for myself by creating Project.toml one import at a time, and running Helix until I see the symbol index working and saved. It took ~25 minutes to go through all my deps and have it cache everything. The 1 minute it takes to reload all that cache is still kind of high but it’s at least usable, and when working on a real project where I have helix open for a day or more at a time, probably not that big a deal. Probably.
tl;dr:
- Make sure you’re using the latest LanguageServer (v4.5.1 right now)
- You shouldn’t have to configure ~/.config/helix/languages.toml, the defaults work
- Make a toy script with no imports and no Project.toml; open it in Helix, mangle it a bit, and test
:formatand=. Expect them to lag out as Julia warms up, but be instant once the first formatting runs. - (Optionally) Make a toy project with a SINGLE import listed in a Project.toml with a SINGLE dependency.
-
Open this in Helix, make sure
space+kcan load the docs.Again, this will lag out as Julia warms up. actually first it give an error in the status bar, then it will lag out if you try again. But be patient and tail your logs (
tail -f ~/.cache/helix/helix.log) and it should work.- Once
space+kis able to load docs, your symbols should be cached, which means the LanguageServer shouldn’t take so long to start up. - Close Helix and reopen the file. Mangle it and try
:formator=. It should lag while it reloads the symbol cache, but not as long as the first time. - Close and reopen and retest just to confirm it’s still quick to get it working.
- Add another import. Close and reopen. See if formatting lags again – it probably will.
- Continue adding imports you want to use one by one until you have their caches all built up.
- Once
-
I would like to try to make a sysimage again like the wiki suggested now that I know where to look for logs. Hopefully I can get that minute of startup time down to a few seconds. And I might like to use a separate LanguageServer env like you did, @j_u to protect my tools from me experimenting. Though after seeing how touchy this all is I might stick with disabling the language server and defining formatter explicitly because that seems less fragile, and honestly I’m way more interested in formatting than code suggestions.
And yes, very happy to stay in touch about making workflows better!