sandwich-0.2.0.0: src/Test/Sandwich/Formatters/TerminalUI/OpenInEditor.hs
module Test.Sandwich.Formatters.TerminalUI.OpenInEditor where
import Control.Applicative
import Data.Function
import qualified Data.Text as T
import GHC.Stack
import System.Environment
import System.Exit
import System.Process
autoOpenInEditor :: Maybe String -> (T.Text -> IO ()) -> SrcLoc -> IO ()
autoOpenInEditor terminalUIDefaultEditor debugFn (SrcLoc {..}) = do
maybeEditor' <- lookupEnv "EDITOR"
let maybeEditor = maybeEditor' <|> terminalUIDefaultEditor
case maybeEditor of
Nothing -> return ()
Just editorString -> do
let editor = editorString
& T.pack
& T.replace "LINE" (T.pack $ show srcLocStartLine)
& T.replace "COLUMN" (T.pack $ show srcLocStartCol)
& fillInFile
& T.unpack
debugFn ("Opening editor with command: " <> T.pack editor)
(_, _, _, p) <- createProcess ((shell editor) { delegate_ctlc = True })
waitForProcess p >>= \case
ExitSuccess -> return ()
ExitFailure n -> debugFn ("Editor failed with exit code " <> T.pack (show n))
where
fillInFile cmd
| "FILE" `T.isInfixOf` cmd = T.replace "FILE" (T.pack $ show srcLocFile) cmd
| otherwise = cmd <> " '" <> T.pack srcLocFile <> "'"
-- elisp = [i|(progn
-- (x-focus-frame (selected-frame))
-- (raise-frame)
-- (recenter)
-- )|]