| 1 | -- :redirErr <var> <cmd> |
|---|
| 2 | -- execute <cmd>, redirecting stderr to <var> |
|---|
| 3 | let redirErr varcmd = case span (not . Data.Char.isSpace) varcmd of { (var,_:cmd) -> return $ unlines [":set -fno-print-bind-result" ,"tmp <- System.Directory.getTemporaryDirectory" ,"(f,h) <- System.IO.openTempFile tmp \"ghci\"" ,"ste <- GHC.Handle.hDuplicate System.IO.stderr" ,"GHC.Handle.hDuplicateTo h System.IO.stderr" ,"System.IO.hClose h" ,"let readFileNow f = readFile f >>= \\t->length t `seq` return t" ,"let afterCmd _ = do { GHC.Handle.hDuplicateTo ste System.IO.stderr ; r <- readFileNow f ; System.Directory.removeFile f ; return $ \""++var++" <- return \"++show r }" ,":def afterCmd afterCmd", cmd, ":afterCmd", ":undef afterCmd" ] ; _ -> return "putStrLn \"usage: :redirErr <var> <cmd>\"" } |
|---|
| 4 | :def redirErr redirErr |
|---|
| 5 | |
|---|
| 6 | -- :le [<mod>] |
|---|
| 7 | -- try to :load <mod>, or :reload, if no <mod> given; |
|---|
| 8 | -- call editor (:set editor) on first error, if any |
|---|
| 9 | let loadEditErr m = return $ unlines [if null m then ":redirErr err :r" else ":redirErr err :l "++m ,"let match pat = Text.Regex.matchRegex (Text.Regex.mkRegex pat)" ,"let ms = Data.Maybe.catMaybes $ map (match \"^([^:]*):([^:]*):([^:]*):$\") $ lines err" ,":cmd return $ case ms of { ([mod,line,col]:_) -> (\":e +\"++line++\" \"++mod) ; _ -> \"\" }"] |
|---|
| 10 | :def le loadEditErr |
|---|