Allow users to disable Unicode with an env var
authorRon Mordechai <ronmrdechai@gmail.com>
Sun, 18 Aug 2019 16:22:01 +0000 (19:22 +0300)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Sat, 28 Sep 2019 02:11:06 +0000 (22:11 -0400)
Unicode renders funny on my terminal and I like to avoid it where
possible. Most applications which print out non-ascii characters allow
users to disable such prints with an environment variable (e.g.
Homebrew).

This diff disables Unicode usage when the environment variable
`GHC_NO_UNICODE` is set. To test, set the env var and compile a bad
program. Note that GHC does not print Unicode bullets but instead prints
out asterisks:

```
$ GHC_NO_UNICODE= _build/stage1/bin/ghc ../Temp.hs
[1 of 1] Compiling Temp             ( ../Temp.hs, ../Temp.o )

../Temp.hs:4:23: error:
    * Couldn't match type `Bool' with `a -> Bool'
      Expected type: Bool -> a -> Bool
        Actual type: Bool -> Bool
    * In the first argument of `foldl', namely `(&& (flip $ elem u))'
      In the expression: foldl (&& (flip $ elem u)) True v
      In an equation for `isPermut':
          isPermut u v = foldl (&& (flip $ elem u)) True v
    * Relevant bindings include
        v :: [a] (bound at ../Temp.hs:4:12)
        u :: [a] (bound at ../Temp.hs:4:10)
        isPermut :: [a] -> [a] -> Bool (bound at ../Temp.hs:4:1)
  |
4 | isPermut u v = foldl (&& (flip $ elem u)) True v
  |                       ^^^^^^^^^^^^^^^^^^
```

(Broken code taken from Stack Overflow)

compiler/main/DynFlags.hs
docs/users_guide/using.rst

index 429857a..f809bc3 100644 (file)
@@ -1894,6 +1894,10 @@ initDynFlags dflags = do
                           do str' <- peekCString enc cstr
                              return (str == str'))
                          `catchIOError` \_ -> return False
+ maybeGhcNoUnicodeEnv <- lookupEnv "GHC_NO_UNICODE"
+ let adjustNoUnicode (Just _) = False
+     adjustNoUnicode Nothing = True
+ let useUnicode' = (adjustNoUnicode maybeGhcNoUnicodeEnv) && canUseUnicode
  canUseColor <- stderrSupportsAnsiColors
  maybeGhcColorsEnv  <- lookupEnv "GHC_COLORS"
  maybeGhcColoursEnv <- lookupEnv "GHC_COLOURS"
@@ -1909,7 +1913,7 @@ initDynFlags dflags = do
         dirsToClean    = refDirsToClean,
         generatedDumps = refGeneratedDumps,
         nextWrapperNum = wrapperNum,
-        useUnicode    = canUseUnicode,
+        useUnicode    = useUnicode',
         useColor      = useColor',
         canUseColor   = canUseColor,
         colScheme     = colScheme',
index 8462a87..d97e3bd 100644 (file)
@@ -1153,3 +1153,14 @@ Some flags only make sense for a particular use case.
     included. This option can be used to specify the path to the
     ``ghcversions.h`` file to be included. This is primarily intended to be
     used by GHC's build system.
+
+Other environment variables
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. index::
+   single: environment variables
+
+GHC can also be configured using environment variables. Currently the only
+variable it supports is ``GHC_NO_UNICODE``, which, when set, disables Unicode
+output regardless of locale settings. ``GHC_NO_UNICODE`` can be set to anything
++(event an empty string) to trigger this behaviour.