How to allocate PTY using Shake?

75 Views Asked by At

I'm trying to run a command interactively from my build script:

#!/usr/bin/env stack
{- stack
script
--resolver lts-18.8
--ghc-options -Wall
-}
import Development.Shake

main :: IO ()
main = shakeArgs shakeOptions $ do
  phony "cfg" $ do
    command_ [] "vim" []

But it does not work. I suppose I need to allocate a terminal to be able to run vim interactively. How can I do that?

1

There are 1 best solutions below

1
Neil Mitchell On BEST ANSWER

The Shake functions for running commands (command, cmd etc) are designed for batch commands that run without user interaction. While there are things you can do to make them more compatible with something like Vim (e.g. InheritStdin) there are probably aspects of Shake that will make things harder (e.g. capturing the stderr, which might result in a memory leak).

Happily, Shake can work just as well with the functions in System.Process, so instead of calling command you can write:

liftIO $ System.Process.createProcess $ System.Process.shell "vim"

The createProcess takes a record with many types of process-related settings, so can be customised to make Vim work.