module System.ReadEditor
(
readEditor
, openEditor
, openEditorWithPrompt
, prompt
, withSystemTempFile
)
where
import Control.Exception (finally)
import System.Directory (getTemporaryDirectory, removeFile)
import System.Environment (getEnv)
import System.IO (Handle, hClose, hFlush, openTempFile,
stdout)
import System.IO.Error (catchIOError)
import System.Process (system)
readEditor :: IO String
readEditor = withSystemTempFile "read-editor" $ \fp _ -> do
openEditor fp
readFile fp
openEditor :: FilePath -> IO ()
openEditor = openEditorWithPrompt "What editor should I use? "
openEditorWithPrompt :: String -> FilePath -> IO ()
openEditorWithPrompt p fp = do
editorCmd <- catchIOError (getEnv "EDITOR") (const promptForEditor)
_ <- system $ editorCmd ++ " " ++ fp
return ()
where promptForEditor = prompt p
prompt :: String -> IO String
prompt str = do
putStr str
hFlush stdout
getLine
withSystemTempFile :: String -> (FilePath -> Handle -> IO a) -> IO a
withSystemTempFile templ fn = do
tempdir <- catchIOError getTemporaryDirectory (\_ -> return ".")
(tempfile, temph) <- openTempFile tempdir templ
finally (fn tempfile temph) (hClose temph >> removeFile tempfile)