# Helix + LanguageServer.jl + JuliaFormatter.jl

**URL:** https://discourse.julialang.org/t/helix-languageserver-jl-juliaformatter-jl/133755
**Category:** New to Julia
**Tags:** question, languageserver, formatting
**Created:** [November 9, 2025, 6:02am UTC](https://discourse.julialang.org/t/helix-languageserver-jl-juliaformatter-jl/133755 "2025-11-09T06:02:14Z")
**Posts on this page:** 1
**Showing post:** 12

<div class="post-metadata">

### Author: ![kousu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kousu/32/219064_2.png) [@kousu](https://discourse.julialang.org/u/kousu)
#### Post date: [November 13, 2025, 1:07am UTC](https://discourse.julialang.org/t/helix-languageserver-jl-juliaformatter-jl/133755/12 "2025-11-13T01:07:09Z")

</div>

> [@j\_u](#):
>
> I guess you must be on Arch, btw. What scheduler are you using, if I may ask? Also, I’m wondering, how’s your Arch congestion control algorithm stack performing today? Are you experiencing similar issues as with the language server?

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).

> [@j\_u](#):
>
> I’m currently on the latest stable Julia v1.12.1 and using LanguageServer v4.5.1

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:

```julia-auto
$ 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**
>
> ```julia-auto
> 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](https://discourse.julialang.org/t/helix-languageserver-cache/133797) 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 `:format` and `=`. _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`+`k` can load the docs.

I would like to try to make a sysimage again like the [wiki suggested](https://github.com/julia-vscode/LanguageServer.jl/wiki/Helix) 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](https://discourse.julialang.org/t/helix-languageserver-jl-juliaformatter-jl/133755/2) 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!

---

_[View the full topic](https://discourse.julialang.org/t/helix-languageserver-jl-juliaformatter-jl/133755)._
