

Blessed UK charity (thrift) shop find
Y2K tour Tshirt - £3.75!


Y2K tour Tshirt - £3.75!
Data science workflows often involve keeping a Python session running and iteratively running lines, e.g. when performing exploratory data analysis.
I do this a lot and often find myself jumping into the REPL to run e.g. my_data.columns to check I'm using the right column names in my code.
It turns out that if you're using IPython there are some pretty powerful mechanisms for implementing custom completions in scenarios just like this.
I wrote a blog post showing how you can do this, e.g. to expose Pyspark DataFrame columns as autocomplete suggestions. If you tend to work interactively in a long-running Python session, the techniques used are widely applicable to whatever libraries/classes you tend to work with:
<https://jacobnscott.com/posts/hacking-python-autocomplete/>
Repo: https://github.com/wurli/jet.nvim
Not yet implemented
No existing Jupyter plugins did what I wanted:
jet.nvim achieves all this stuff by building on Jet, a custom Rust backend built to power this plugin, but which does some other sick stuff too.
There are a billion different kernels out there - jet.nvim doesn't favour any particular one. Instead, jet.nvim aims to provide tools which can be used to create full-featured extension plugins for R, Python, Julia, etc. Existing extensions I'm already using are jet.ark (R) and jet.ipy (Python).
Benefits of this architecture:
Jupyter != notebooks. Jupyter is a standard/protocol which interactive languages can use to tell editors about state and execution results. It's cool. Jupyter kernels wrap interactive languages to implement the protocol; frontends need to implement a Jupyter 'client' to talk to kernels (this is non-trivial because you have to handle ØMQ, tonnes of different message types, etc). jet.nvim implements a Jupyter client using Rust for low-level stuff and Neovim's Lua for the high-level API. jet.nvim extensions can now build on this foundation to talk to kernels and implement language-specific behaviour which was previously not possible. E.g. jet.ark implements a plots pane where plots automatically redraw to fit the window dimensions.
Testers wanted! I've been dogfooding this plugin for like 2 months and it works very nicely, but I've only been using it in anger for Python and R. All feedback is very appreciated, but especially if you use Julia or some other esoteric kernel. No gripe is too small to report!
Enjoy, and thanks for reading ✈️
Pandoc is a tool for converting between a myriad of different document formats. In particular, as of September 2025, it supports vimdoc outputs, allowing you to generate rather nice plugin documentation from markdown.
I gave the native vimdoc writer a spin and wasn't quite satisfied with some of the behaviour, so I wrote a pandoc extension (i.e. filter) pandoc-better-vim which provides a bit more control and produces outputs slightly closer to those you see in neovim/vim.
For example, using the filter, pandoc's 'definition lists' render like so:
Input markdown:
definition 1
: first item
definition 2
: second item
* with a sub-bullet
* and another sub-bullet
definition 3
: third item
Output vimdoc:
• definition 1 first item
• definition 2 second item
• with a sub-bullet
• and another sub-bullet
• definition 3 third item
The filter's other features are listed on GitHub :)
Note: for earlier versions of Pandoc you can also use panvimdoc, which also includes a GitHub Action.