Can I "reset" my REPL?

Thanks @Chet_Murthy, you put me on the right track!

I got initially confused after a bit of fiddling and, mainly, I could not see a way to kill the ocaml REPL without relying on its name. That would be too coarse as I would also kill other processes, such as the one launched by: vim->merlin->ocaml.

Here’s what I got so far:

Step 1) Prepare a local .ocamlinit file for customization on REPL start.

Down looks appropriate for a minimal setup with readline functionality

$ cat ./.ocamlinit 
#use "down.top";;
#load "./hello.cmo";;

Step 2) Launch watchers with: foreman start -f Procfile.dev

Foreman is just a handy tool, launching those watchers via other terminal panes would also work.

$ cat ./Procfile.dev 
compile: find *.ml | entr -p ocamlc /_
kill_repl: find *.cmo | entr -p bash -c 'kill $(cat ./.ocaml.pid)'

Step 3a) Use a wrapper script to track the REPL PID

$ cat ./ocaml.exec 
#!/bin/bash

echo $$ >./.ocaml.pid
exec ocaml

Step 3b) Launch the wrapper in a loop, within the current shell

Here, I sleep in order to be able to ctrl-d, ctrl-c out of this loop.

while true;do ./ocaml.exec;sleep 0.1;done

It’s ok…ish

I still have a couple of problems:

  1. I get garbled output if I try to launch step 3b via a script (via another wrapper), not sure why.
  2. down won’t save history on receiving a kill signal

Regarding that last point, I’m not sure where at_exit is defined

I tried to play with sending different signals, but history did not save so I presume down relies on receiving ctrl+d to trigger at_exit. Is this correct if you don’t mind me asking @dbuenzli?

Once I got that sorted, the next step is to simulate pressing up then enter, after REPL reload (triggered itself by a file change). Tmux is handy for that, I could use something like this:

tmux send-keys -t "PROJ_NAME:PANE_NUM_WITH_REPL" Up
tmux send-keys -t "PROJ_NAME:PANE_NUM_WITH_REPL" Enter