New: Julia for JetBrains IDEs (Flexible Julia)

No. I have applications that crash if multithreading is enabled. You already have a nice configuration page for the REPL’s startup parameters. Why not use those? OK, some, like if revise is enabled, might be different. But then you could have two checkboxes for revise, one for REPL mode and one for DEBUG mode.

1 Like

Hello,

I came here from the Julia debugging is extremely slow thread. I wanted to give Flexible Julia a try, and I must say I am struggling with the basics. I apologize if this is not the right place to ask, but I couldn’t find a simple tutorial. I installed IntelliJ, in case that matters (no experience with any of the Jetbrains tools, and it seemed to me that madppiper’s screenshots were made with IntelliJ).

My workflow in VSCode is that I typically open a directory in VSCode, immediately launch a Julia instance (Alt+J Alt+O), and then I either run the whole file with the “run arrow” or by typing include("myfile.jl"), or (more often) execute lines or cells one at a time.
In VSCode, all these actions take place in the same Julia instance, untill I use Alt+J Alt+R to restart it. This greatly helps with the TTFX problem. But in Flexible Julia, I struggle to understand “where I am” in terms of Julia instances. It seems the “run arrow” and “debug” launch instances that are not the same as the REPL one. This makes me think that I am probably not correctly understanding the basic workflow - is there a tutorial for “real” beginners with both IntelliJ and Flexible Julia?

1 Like

Hey there @mjmat,

glad you brought this up. I really have to update our onboarding tutorial to highlight debugging and/or add a page to the jetbrains marketplace.

In the meanwhile, let me give you a quick introduction on how it works (note: even though I am using intelliJ, you can use PyCharm or any of the other JetBrains products):

You have multiple options when it comes to debugging: you can use REPL or the inbuilt IDE debugger and you can run it on remote or local sessions. By default you are running a local julia session (the context for it you can define under File - Settings - Languages & Frameworks - Julia). This tells us the Julia version you are using and how you want to configure those sessions:

At the bottom of the same screen you can also setup SSH connections (those will be used for remote sessions)

REPL Debugging:
At the bottom of the IDE you will find a tab that says “Julia REPL”. Open it and you will start a REPL session:

The three icons on the top left (1) allow you to start/stop/restart the current repl session.
Next to it you will find the (2) system context, ie. local vs remote configurations. Followed by (3) the session context (global, project or otherwise). (4) opens our Julia tab:

The Julia tab will show you variables, dataframes, plots, julia docs and more.

Ignore the three buttons on the top right for now (5), I am launching an update today that is adding these so that launching a debug session is easier from here. Once the update is out, you will be able to use the buttons to run/debug the currently open file from your editor or launch a profile session (you will find the profiler icon in your screen too). (6) tells us where you want to run a file from.

All REPL commands work just like they do in VSCode, so you can use @run include(“yourfile.jl”) or @enter to start a debug session. One you do, it will look like this:

Don’t be confused. This is the IDEs internal Debugging interface. We connected the REPL debug sessions with it. If you click the “Debugger” tab in it, you will see all your current variables present (note: the julia panel is kept in sync):

It also comes with these commands to step over (F8), step into (F7), run to cursor (Alt+F9) or jump to next breakpoint (F9) commands.
image

As well as an option to evaluate expression (I often use this to quickly check something within my existing context - it cannot modify the context, but it can run Julia commands on your variables).

You can jump back to the REPL tab at any time. all commands given are reflected here and you can also just use the REPL debugger directly to work with the debug session.

You can add or remove breakpoints either via the REPL commands or by left clicking on the file gutter. It will add a breakpoint for you (which will be synced to repl debug):

JetBrains Debugging:
The alternative flow is via JetBrains Debugging options. For this you will need the icons on the top right of your ide:

(1) allows you to create a run/debug environment. click it and select “Edit Configurations” to create a new one. Click on + and select either Julia or Julia Remote from the dropdown:

It is here that you can define all the details about which file to run, in which context, how the session should behave etc. Some fields will be automatically set for you:

Click “OK” to finish your configuration and it will be added to the dropdown (1) list.

You can now use the (2) runtime controls to run the file/program or debug it. It will not be reflected in the REPL session (that is seperate), but it will use the already familiar JetBrains Debugger and Julia panel to display all information. All controls remain the same.

(Update: now that i spent some time on it, I will just post it up on the plugin page ;))

5 Likes

Apart from the above: please bare in mind that we are a super young plugin that pretty much started at around december last year. So changes to the interface cannot be avoided. I am super open for feedback, however, and if you find a bug or have an idea on how to improve the flow. Drop me a line :slight_smile:

2 Likes

Just a quick update here - I’ve been getting deep into different aspects of the debugger. After the last update I found various inconsistencies that broke the experience and so i wanted to address those first, before moving on.

Hence the reason why I haven’t pushed any update this week. I am almost done, though and will also add a few other request that were sent to me via Github.

3 Likes

Thank you for taking the time to reply with instructions.
I can debug with the “JetBrains” debugging you describe, but I think what I am really after is the REPL debugging (especially “evaluate expression”) . However, I cannot get it to work. I will try again (never used @run or @enter before). What I get is this output:

julia> @run include("myfile.jl")
[ Info: Loading JuliaInterpreter.jl...
WARNING: using JuliaInterpreter.@breakpoint in module Main conflicts with an existing identifier.
[ 2 breakpoint(s) synced from IDE ]
[ 2 breakpoint(s) registered with JuliaInterpreter ]
  Activating project at `C:\Users\MJMat\.julia\environments\scratch`

======================================================================
[ Debug session ended - Returned to julia> prompt ]
[ To debug again, use: @run your_function() ]
======================================================================

But Julia does not stop. It seems to “see” the breakpoints, but does not stop. I am probably missing something…

1 Like

There will be a fix for that coming in later today :slight_smile:

Since not everybody may be aware of this, here’s a quick heads-up:

JetBrains offers a 100% discount for university students and faculty members and we do too! They do have 50% discounts for startups, too. Our plugin will be automatically discounted at checkout.

New Release: Flexible Julia 2026.9.3

New Features:

  • Another Debugger Rewrite: Reimplemented the expression evaluator and fixed bugs across pretty much all states, proper breakpoint syncing for remote and local sessions
  • Improved Plot Backends: Makie support and additional SVG rendering (#70)
  • Auto-Sync on Save: Julia files now auto-sync to remote on save for seamless Revise.jl hot-reload in remote/tmux sessions (#74)
  • Visual refresh to the settings page
  • Various debug/run action improvements in remote REPL sessions (WARNING: must exit() old tmux session to take effect)

Performance:

  • Replaced O(n²) getParentOfType inside findChildrenOfType loops with single-pass tree walkers in unused/undefined variable inspections and scope analyzer

Fixes:

  • False positive unused variable warnings for top-level typed assignments used inside function bodies
  • Breakpoint sync timeout: debug/request_breakpoints now dispatched synchronously, eliminating 5s timeout on @run include(...) (#75)
  • IPC listener leak: DAP launcher no longer accumulates JuliaIpcHandler instances across repeated debug runs (#76)
  • DAP evaluator UndefVarError: locals now wrapped in a let block so frame variables are visible in compiled-mode evaluation (#77)
  • tmux hook loss: fixed remote hook paths + auto-reload after Julia restarts inside tmux (#78)
  • JULIA_DEPOT_PATH now detected from shell profile when IDE launched from desktop (#68)


Another big debugger release. I reimplemented the expression evaluator from scratch and fixed bugs across basically every debug state. Breakpoint syncing between local and remote sessions is now working much better. I also updated the REPL window a bit, so you can now directly start/debug the currently open file.

The auto-sync on save feature is making remote development easier - your files sync to the remote server automatically, once you hit CTRL+S to save, so Revise.jl picks up changes immediately. Before I’d do that only first connection, which is useless for some scenarios like remote tmux sessions. Not it syncs when we do connect, and again whenever you save a file.

Also tackled some nasty resource leaks - the DAP launcher was accumulating IPC handlers across debug runs, and tmux sessions would lose their hooks after Julia restarts. Both fixed.

The O(n²) inspection performance issue was causing slowdowns on larger files - now using single-pass tree walkers instead.

@tmux users: you must exit() your session once, to really benefit from the changes. In the future the scripts will auto-update.


@RGerzaguet: Thanks for requesting externalized plot backend support!
@arnaud-ma: Depot path detection from shell profile is in!
@xgdgsc: Auto file sync for remote tmux is live - should make Revise workflows much smoother!
@ufechner7: False positive warnings fixed - and thanks for the performance report!

4 Likes

For those who want to try out the release without waiting for Jetbrains approval flow:

https://plugins.jetbrains.com/plugin/download?rel=true&updateId=977431

(File - Settings - Plugins - Install from disk)

So yesterday I needed to use the remote REPL feature but I couldn’t figure out how to get plots to show. I had ImageIO / FileIO / ImageShow installed in the remote environment I was using, but when I did display(img) I didn’t see the image show up in the plot pane. I also did not see the image print to the REPL, so it seems like the handler is registered but the image was not coming through for some reason. It might be relevant that I had multiple PyCharm windows open and before I had ImageIO / FileIO installed, I saw messages about displaying images in other unrelated projects when I was switching between them.

1 Like

Oh I got to check that. It could be that it tries to reconnect rather than open a new port if a port is taken. I should probably randomize the ports better. That would explain it a bit. Thanks for bringing it up. Gotta fix that quick

1 Like

New Release: Flexible Julia 2026.9.4

Fixes:

  • Remote display(img): session-unique plot dirs, REPL confirmation, SFTP error handling, stale dir cleanup
  • π and Unicode math symbols (α, β, θ, γ, φ, …) no longer show “Undefined variable” warning; catalan, eulergamma, golden added as known constants (#76)
  • Remote sync now respects “Remote working directory” from SSH profile instead of always using ~/julia_projects/ (#74)
  • Sync-on-save: improved diagnostic logging and path resolution for remote file sync (#74)

Quick bugfix release. The Unicode math symbols showing as undefined was particularly annoying - π is kind of important in Julia. Fixed, along with some remote display and sync issues.


@csvance: Thanks for reporting the remote REPL image display issues!
@ufechner7: π warnings are gone!
@xgdgsc: Remote sync directory handling fixed!

2 Likes

New Release: Flexible Julia 2026.9.5

Fixes:

  • Generator expression variables (maximum(p[3] for p in s.pos)) no longer show “Undefined variable” warning (#78)
  • For-loop variable detection hardened against false positives from tuple expressions in loop body (#78)
  • Unicode cross product × and dot product operators now recognized as multiply-level operators (#79)
  • False “mixed types” warning for string arrays containing digits like ["aoa_3", "aoa_4"] (#80)
  • SDK auto-selection now shows a notification balloon instead of happening silently (#61)
  • Package installation failure now shows actual error details (#39)
  • Reduced type inference depth limit to prevent infinite language loops (#81)

Minor bugfix release with another round of inspection fixes. Generator expressions, Unicode operators, and string arrays with digits were all triggering false positives. Also made SDK auto-selection and package installation failures more visible.


@ufechner7: Thanks for the continued testing - four issues knocked out in one release!
@xgdgsc: SDK and package installation feedback is in!

3 Likes

I forgot to mention the remote development support file sync does not seem to smash files when enabled on a shared file system between the client and server. Of course I turn off the file sync because NFS takes care of the synchronization already, but its good that the default behavior doesn’t seem to cause problems in this configuration.

Ever since the fix remote plotting has been working flawlessly as well.

1 Like

So glad to hear! Thanks for this.

1 Like

New Release: Flexible Julia 2026.9.7 (+ 2026.9.6)

New Features:

  • Built-in String Prefixes: md"...", html"...", text"...", s"..." with proper lexer, parser, and highlighting support
  • YAML Hover Docs: BenchmarkTools.jl (@benchmark, @btime, BenchmarkGroup, etc.)
  • YAML Hover Docs: JuMP.jl (Model, @variable, @constraint, @objective, optimize!, etc.)
  • YAML Hover Docs: Revise.jl (revise, includet, track, entr, etc.)
  • Live Templates for Testing: test:testset, test:testitem, test:approx, etc.
  • Live Templates for Benchmarking: bench:benchmark, bench:btime, bench:suite, etc.
  • JETLS Arguments Setting: Pass startup args like --threads 1,0 (#83)

Fixes:

  • JETLS crash notifications now show stderr output for diagnostics (#83)
  • JETLS detection: no longer shows “install LanguageServer” warning when JETLS is selected but crashes (#83)
  • LanguageServer.jl now installed in dedicated flexible-julia-lsp environment instead of global (#82)


Documentation and developer experience release. Added hover docs for BenchmarkTools, JuMP, and Revise. I also added live templates tht should speed up writing tests and benchmarks. Type test:testset or bench:benchmark and expand.

Also cleaned up the language server installation - LS now goes into its own dedicated environment instead of polluting your global one. And JETLS crash diagnostics actually show useful information now.


Next up: I am playing around with some debugger improvements, I got a few ideas on how to make it all faster, but it needs additional testing :slight_smile:


@ufechner7: Thanks for the JETLS and LS environment reports - much cleaner setup now!

5 Likes

Since I am constantly looking for ideas, for anyone reading: please leave me a message through any of the channels on which aspects you’d want improved.

I’m really eager to hear all your thoughts and curious to see what works or doesn’t work for you!

2 Likes