Simulate plugin experience in Helix
How to emulate a plugin-like experience in the Helix editor.
09/5/1444
I like helix, especially multi-cursor supports which unfortunately for nvim seems hard to add
So everyone is waiting for the plugin system, till then here is a not so bad plugin like experience
- Create a folder to hold our scripts
mkdir -p ~/dev/helix/scripts/source
- Make helix aware of our scripts by adding scripts to the PATH only for helix
This example uses fish, other shell have similar abilities
function hx
set PATH_TMP $PATH
set PATH ~/dev/helix/scripts/ $PATH
helix $argv
set PATH $PATH_TMP
end
funcsave hx
So now hx is aliased to helix that knows about our scripts path
- Create a script
I’m going to use deno here, but any compiled program can work
The advantage of deno, is the programs have 0 permissions by default which works actually very well as a plugin
But realisticly you want a compiled language, for the fastest cold startup time. I prefer Zig for this since it makes the lowest amount of syscalls possible by default in linux for example.
cd ~/dev/helix/scripts
Here is an example for a script I just needed that just simply flips ] to ) and [ to (
source/f.ts
const buf = new Uint8Array(256);
const n = await Deno.stdin.read(buf);
const a = new TextDecoder().decode(buf.slice(0, n!));
let r;
switch (a) {
case "]":
r = ")";
break;
case "[":
r = "(";
break;
default:
r = a;
}
Deno.stdout.writeSync(new TextEncoder().encode(r));
Or another script that acts as a snippet (just inserts console.log)
Deno.stdout.writeSync(new TextEncoder().encode("console.log("));
- Compile our scripts
This example uses fish syntax, other shell have similar workflow
for f in (ls source)
deno compile source/$f
end
That’s it, now when running helix, we can pipe a selection to our scripts using the pipe command
which is bound to | key by default (can be changed, I have personally "µ" = "shell_pipe" for azerty keyboard)