October 26, 2017 - Tagged as: en, haskell.
A GHCi macro is just a function of type String -> IO String
. The argument is parameter of the macro, and return value is evaluated by GHCi as a command.
Using this and the process
library we can implement a fuzzy module loader that works inside ghci:
(sorry for the gif quality)
Here I’m using fzf as the fuzzy file finder. Code for defining the macro:
import System.IO (withFile, IOMode (WriteMode))
import System.Process (runProcess, waitForProcess)
:{
let loadFuzzy _ = do
let f = "/tmp/fzf_out"
withFile f WriteMode $ \h -> do
p <- runProcess "fzf" [] Nothing Nothing Nothing (Just h) Nothing
_ <- waitForProcess p
out <- readFile f
return (":load " ++ init out)
:}
:def l loadFuzzy
Add this code to your global ghci config file (~/.ghci
) or your project-wide .ghci
(at the project root).
Only problem here is the process
dependency: when you use stack repl
or cabal repl
, process
won’t be importable in GHCi unless the project you’re loading into GHCi already has it as a dependency. One solution is to pass -package process
to cabal repl
or --ghci-options="-package process"
to stack repl
. Because process
is distributed with GHC this will always work.