ansi-terminal-0.6.2.3: Simple ANSI terminal support, with Windows compatibility

Safe HaskellSafe
LanguageHaskell98

System.Console.ANSI

Contents

Description

Provides ANSI terminal support for Windows and ANSI terminal software running on a Unix-like operating system.

The ANSI escape codes are described at http://en.wikipedia.org/wiki/ANSI_escape_code and provide a rich range of functionality for terminal control, which includes:

  • Colored text output, with control over both foreground and background colors
  • Hiding or showing the cursor
  • Moving the cursor around
  • Clearing parts of the screen

The most frequently used parts of this ANSI command set are exposed with a platform independent interface by this module. Every function exported comes in three flavours:

  • Vanilla: has an IO () type and doesn't take a Handle. This just outputs the ANSI command directly on to the terminal corresponding to stdout. Commands issued like this should work as you expect on both Windows and Unix.
  • Chocolate: has an IO () type but takes a Handle. This outputs the ANSI command on the terminal corresponding to the supplied handle. Commands issued like this should also work as your expect on both Windows and Unix.
  • Strawberry: has a String type and just consists of an escape code which can be added to any other bit of text before being output. This version of the API is often convenient to use, but due to fundamental limitations in Windows ANSI terminal support will only work on Unix. On Windows these codes will always be the empty string, so it is possible to use them portably for e.g. coloring console output on the understanding that you will only see colors if you are running on a Unix-like operating system.

Example:

-- Set colors and write some text in those colors.
sgrExample :: IO ()
sgrExample = do
    setSGR [SetColor Foreground Vivid Red]
    setSGR [SetColor Background Vivid Blue]
    putStr "Red-On-Blue"
    setSGR [Reset]
    putStr "White-On-Black"

For many more examples, see the project's extensive Example.hs file.

Synopsis

Basic data types

data Color Source #

ANSI colors: come in various intensities, which are controlled by ColorIntensity

Constructors

Black 
Red 
Green 
Yellow 
Blue 
Magenta 
Cyan 
White 

data ColorIntensity Source #

ANSI colors come in two intensities

Constructors

Dull 
Vivid 

Instances

Bounded ColorIntensity Source # 
Enum ColorIntensity Source # 
Eq ColorIntensity Source # 
Ord ColorIntensity Source # 
Read ColorIntensity Source # 
Show ColorIntensity Source # 
Ix ColorIntensity Source # 

data ConsoleLayer Source #

ANSI colors can be set on two different layers

Constructors

Foreground 
Background 

Instances

Bounded ConsoleLayer Source # 
Enum ConsoleLayer Source # 
Eq ConsoleLayer Source # 
Ord ConsoleLayer Source # 
Read ConsoleLayer Source # 
Show ConsoleLayer Source # 
Ix ConsoleLayer Source # 

data BlinkSpeed Source #

ANSI blink speeds: values other than NoBlink are not widely supported

Constructors

SlowBlink

Less than 150 blinks per minute

RapidBlink

More than 150 blinks per minute

NoBlink 

Instances

Bounded BlinkSpeed Source # 
Enum BlinkSpeed Source # 
Eq BlinkSpeed Source # 
Ord BlinkSpeed Source # 
Read BlinkSpeed Source # 
Show BlinkSpeed Source # 
Ix BlinkSpeed Source # 

data Underlining Source #

ANSI text underlining

Constructors

SingleUnderline 
DoubleUnderline

Not widely supported

NoUnderline 

Instances

Bounded Underlining Source # 
Enum Underlining Source # 
Eq Underlining Source # 
Ord Underlining Source # 
Read Underlining Source # 
Show Underlining Source # 
Ix Underlining Source # 

data ConsoleIntensity Source #

ANSI general console intensity: usually treated as setting the font style (e.g. BoldIntensity causes text to be bold)

Constructors

BoldIntensity 
FaintIntensity

Not widely supported: sometimes treated as concealing text

NormalIntensity 

Instances

Bounded ConsoleIntensity Source # 
Enum ConsoleIntensity Source # 
Eq ConsoleIntensity Source # 
Ord ConsoleIntensity Source # 
Read ConsoleIntensity Source # 
Show ConsoleIntensity Source # 
Ix ConsoleIntensity Source # 

data SGR Source #

ANSI Select Graphic Rendition command

Constructors

Reset 
SetConsoleIntensity ConsoleIntensity 
SetItalicized Bool

Not widely supported: sometimes treated as swapping foreground and background

SetUnderlining Underlining 
SetBlinkSpeed BlinkSpeed 
SetVisible Bool

Not widely supported

SetSwapForegroundBackground Bool 
SetColor ConsoleLayer ColorIntensity Color 

Instances

Eq SGR Source # 

Methods

(==) :: SGR -> SGR -> Bool #

(/=) :: SGR -> SGR -> Bool #

Ord SGR Source # 

Methods

compare :: SGR -> SGR -> Ordering #

(<) :: SGR -> SGR -> Bool #

(<=) :: SGR -> SGR -> Bool #

(>) :: SGR -> SGR -> Bool #

(>=) :: SGR -> SGR -> Bool #

max :: SGR -> SGR -> SGR #

min :: SGR -> SGR -> SGR #

Read SGR Source # 
Show SGR Source # 

Methods

showsPrec :: Int -> SGR -> ShowS #

show :: SGR -> String #

showList :: [SGR] -> ShowS #

Cursor movement by character

cursorUp Source #

Arguments

:: Int

Number of lines or characters to move

-> IO () 

cursorDown Source #

Arguments

:: Int

Number of lines or characters to move

-> IO () 

cursorForward Source #

Arguments

:: Int

Number of lines or characters to move

-> IO () 

cursorBackward Source #

Arguments

:: Int

Number of lines or characters to move

-> IO () 

hCursorUp Source #

Arguments

:: Handle 
-> Int

Number of lines or characters to move

-> IO () 

hCursorDown Source #

Arguments

:: Handle 
-> Int

Number of lines or characters to move

-> IO () 

hCursorForward Source #

Arguments

:: Handle 
-> Int

Number of lines or characters to move

-> IO () 

hCursorBackward Source #

Arguments

:: Handle 
-> Int

Number of lines or characters to move

-> IO () 

cursorUpCode Source #

Arguments

:: Int

Number of lines or characters to move

-> String 

cursorDownCode Source #

Arguments

:: Int

Number of lines or characters to move

-> String 

cursorForwardCode Source #

Arguments

:: Int

Number of lines or characters to move

-> String 

cursorBackwardCode Source #

Arguments

:: Int

Number of lines or characters to move

-> String 

Cursor movement by line

cursorUpLine Source #

Arguments

:: Int

Number of lines to move

-> IO () 

cursorDownLine Source #

Arguments

:: Int

Number of lines to move

-> IO () 

hCursorUpLine Source #

Arguments

:: Handle 
-> Int

Number of lines to move

-> IO () 

hCursorDownLine Source #

Arguments

:: Handle 
-> Int

Number of lines to move

-> IO () 

cursorUpLineCode Source #

Arguments

:: Int

Number of lines to move

-> String 

cursorDownLineCode Source #

Arguments

:: Int

Number of lines to move

-> String 

Directly changing cursor position

setCursorColumn Source #

Arguments

:: Int

0-based column to move to

-> IO () 

hSetCursorColumn Source #

Arguments

:: Handle 
-> Int

0-based column to move to

-> IO () 

setCursorColumnCode Source #

Arguments

:: Int

0-based column to move to

-> String 

setCursorPosition Source #

Arguments

:: Int

0-based row to move to

-> Int

0-based column to move to

-> IO () 

hSetCursorPosition Source #

Arguments

:: Handle 
-> Int

0-based row to move to

-> Int

0-based column to move to

-> IO () 

setCursorPositionCode Source #

Arguments

:: Int

0-based row to move to

-> Int

0-based column to move to

-> String 

Clearing parts of the screen

Scrolling the screen

scrollPageUp Source #

Arguments

:: Int

Number of lines to scroll by

-> IO () 

Scroll the displayed information up or down the terminal: not widely supported

scrollPageDown Source #

Arguments

:: Int

Number of lines to scroll by

-> IO () 

Scroll the displayed information up or down the terminal: not widely supported

hScrollPageUp Source #

Arguments

:: Handle 
-> Int

Number of lines to scroll by

-> IO () 

Scroll the displayed information up or down the terminal: not widely supported

hScrollPageDown Source #

Arguments

:: Handle 
-> Int

Number of lines to scroll by

-> IO () 

Scroll the displayed information up or down the terminal: not widely supported

scrollPageUpCode Source #

Arguments

:: Int

Number of lines to scroll by

-> String 

Scroll the displayed information up or down the terminal: not widely supported

scrollPageDownCode Source #

Arguments

:: Int

Number of lines to scroll by

-> String 

Scroll the displayed information up or down the terminal: not widely supported

Select Graphic Rendition mode: colors and other whizzy stuff

setSGR Source #

Arguments

:: [SGR]

Commands: these will typically be applied on top of the current console SGR mode. An empty list of commands is equivalent to the list [Reset]. Commands are applied left to right.

-> IO () 

Set the Select Graphic Rendition mode

hSetSGR Source #

Arguments

:: Handle 
-> [SGR]

Commands: these will typically be applied on top of the current console SGR mode. An empty list of commands is equivalent to the list [Reset]. Commands are applied left to right.

-> IO () 

Set the Select Graphic Rendition mode

setSGRCode Source #

Arguments

:: [SGR]

Commands: these will typically be applied on top of the current console SGR mode. An empty list of commands is equivalent to the list [Reset]. Commands are applied left to right.

-> String 

Set the Select Graphic Rendition mode

Cursor visibilty changes

Changing the title

setTitle Source #

Arguments

:: String

New title

-> IO () 

Set the terminal window title

hSetTitle Source #

Arguments

:: Handle 
-> String

New title

-> IO () 

Set the terminal window title

setTitleCode Source #

Arguments

:: String

New title

-> String 

Set the terminal window title

Thanks to Brandon S. Allbery and Curt Sampson for pointing me in the right direction on xterm title setting on haskell-cafe. The "0" signifies that both the title and "icon" text should be set: i.e. the text for the window in the Start bar (or similar) as well as that in the actual window title. This is chosen for consistent behaviour between Unixes and Windows.

Checking if handle supports ANSI

hSupportsANSI :: Handle -> IO Bool Source #

Use heuristics to determine whether the functions defined in this package will work with a given handle.

The current implementation checks that the handle is a terminal, and that the TERM environment variable doesn't say dumb (whcih is what Emacs sets for its own terminal).