X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fghci%2FInteractiveUI.hs;h=55384bc63e3f89c9031a62ffbdea99e0e0548959;hb=49ea1fa53acd2569b0b74c86a981b0d3779515dd;hp=d92cc53ad9eec9be4efcf4f346fe97ebb93f52e2;hpb=03803f88cccbee0d2a4180015fffa02a803c20d6;p=ghc-hetmet.git diff --git a/compiler/ghci/InteractiveUI.hs b/compiler/ghci/InteractiveUI.hs index d92cc53..55384bc 100644 --- a/compiler/ghci/InteractiveUI.hs +++ b/compiler/ghci/InteractiveUI.hs @@ -67,6 +67,7 @@ import System.Posix #endif #else import GHC.ConsoleHandler ( flushConsole ) +import System.Win32 ( setConsoleCP, setConsoleOutputCP ) #endif #ifdef USE_READLINE @@ -240,8 +241,9 @@ jumpFunction session@(Session ref) (I# idsPtr) hValues location b new_ic = ictxt { ic_rn_local_env = new_rn_env, ic_type_env = new_type_env } writeIORef ref (hsc_env { hsc_IC = new_ic }) + is_tty <- hIsTerminalDevice stdin withExtendedLinkEnv (zip names hValues) $ - startGHCi (runGHCi [] Nothing) + startGHCi (interactiveLoop is_tty True) GHCiState{ progname = "", args = [], prompt = location++"> ", @@ -361,8 +363,8 @@ runGHCi paths maybe_expr = do case maybe_expr of Nothing -> -#if defined(mingw32_HOST_OS) do +#if defined(mingw32_HOST_OS) -- The win32 Console API mutates the first character of -- type-ahead when reading from it in a non-buffered manner. Work -- around this by flushing the input buffer of type-ahead characters, @@ -373,6 +375,9 @@ runGHCi paths maybe_expr = do | otherwise -> io (ioError err) Right () -> return () #endif + -- initialise the console if necessary + io setUpConsole + -- enter the interactive loop interactiveLoop is_tty show_prompt Just expr -> do @@ -518,7 +523,7 @@ runCommand c = ghciHandle handler (doCommand c) runCommandEval c = ghciHandle handleEval (doCommand c) where handleEval (ExitException code) = io (exitWith code) - handleEval e = do showException e + handleEval e = do handler e io (exitWith (ExitFailure 1)) doCommand (':' : command) = specialCommand command @@ -1528,7 +1533,7 @@ revertCAFs = do foreign import ccall "revertCAFs" rts_revertCAFs :: IO () -- Make it "safe", just in case --- ----------------------------------------------------------------------------- +-- ---------------------------------------------------------------------------- -- Utils expandPath :: String -> GHCi String @@ -1539,3 +1544,27 @@ expandPath path = return (tilde ++ '/':d) other -> return other + +-- ---------------------------------------------------------------------------- +-- Windows console setup + +setUpConsole :: IO () +setUpConsole = do +#ifdef mingw32_HOST_OS + -- On Windows we need to set a known code page, otherwise the characters + -- we read from the console will be be in some strange encoding, and + -- similarly for characters we write to the console. + -- + -- At the moment, GHCi pretends all input is Latin-1. In the + -- future we should support UTF-8, but for now we set the code pages + -- to Latin-1. + -- + -- It seems you have to set the font in the console window to + -- a Unicode font in order for output to work properly, + -- otherwise non-ASCII characters are mapped wrongly. sigh. + -- (see MSDN for SetConsoleOutputCP()). + -- + setConsoleCP 28591 -- ISO Latin-1 + setConsoleOutputCP 28591 -- ISO Latin-1 +#endif + return ()