-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | A command-line interface for user input, written in Haskell. -- -- Haskeline provides a user interface for line input in command-line -- programs. This library is similar in purpose to readline, but since it -- is written in Haskell it is (hopefully) more easily used in other -- Haskell programs. -- -- Haskeline runs both on POSIX-compatible systems and on Windows. @package haskeline @version 0.8.0.1 module System.Console.Haskeline.Completion -- | Performs completions from the given line state. -- -- The first String argument is the contents of the line to the -- left of the cursor, reversed. The second String argument is the -- contents of the line to the right of the cursor. -- -- The output String is the unused portion of the left half of the -- line, reversed. type CompletionFunc m = (String, String) -> m (String, [Completion]) data Completion Completion :: String -> String -> Bool -> Completion -- | Text to insert in line. [replacement] :: Completion -> String -- | Text to display when listing alternatives. [display] :: Completion -> String -- | Whether this word should be followed by a space, end quote, etc. [isFinished] :: Completion -> Bool -- | Disable completion altogether. noCompletion :: Monad m => CompletionFunc m -- | Create a finished completion out of the given word. simpleCompletion :: String -> Completion -- | If the first completer produces no suggestions, fallback to the second -- completer's output. fallbackCompletion :: Monad m => CompletionFunc m -> CompletionFunc m -> CompletionFunc m -- | A custom CompletionFunc which completes the word immediately to -- the left of the cursor. -- -- A word begins either at the start of the line or after an unescaped -- whitespace character. completeWord :: Monad m => Maybe Char -> [Char] -> (String -> m [Completion]) -> CompletionFunc m -- | A custom CompletionFunc which completes the word immediately to -- the left of the cursor, and takes into account the line contents to -- the left of the word. -- -- A word begins either at the start of the line or after an unescaped -- whitespace character. completeWordWithPrev :: Monad m => Maybe Char -> [Char] -> (String -> String -> m [Completion]) -> CompletionFunc m completeQuotedWord :: Monad m => Maybe Char -> [Char] -> (String -> m [Completion]) -> CompletionFunc m -> CompletionFunc m completeFilename :: MonadIO m => CompletionFunc m -- | List all of the files or folders beginning with this path. listFiles :: MonadIO m => FilePath -> m [Completion] filenameWordBreakChars :: String instance GHC.Show.Show System.Console.Haskeline.Completion.Completion instance GHC.Classes.Ord System.Console.Haskeline.Completion.Completion instance GHC.Classes.Eq System.Console.Haskeline.Completion.Completion -- | This module provides a low-level API to the line history stored in the -- InputT monad transformer. -- -- For most application, it should suffice to instead use the following -- Settings flags: -- --
-- import System.Console.Haskeline -- -- main :: IO () -- main = runInputT defaultSettings loop -- where -- loop :: InputT IO () -- loop = do -- minput <- getInputLine "% " -- case minput of -- Nothing -> return () -- Just "quit" -> return () -- Just input -> do outputStrLn $ "Input was: " ++ input -- loop --module System.Console.Haskeline -- | A monad transformer which carries all of the state and settings -- relevant to a line-reading application. data InputT m a -- | Run a line-reading application. This function should suffice for most -- applications. -- -- This function is equivalent to runInputTBehavior -- defaultBehavior. It uses terminal-style interaction if -- stdin is connected to a terminal and has echoing enabled. -- Otherwise (e.g., if stdin is a pipe), it uses file-style -- interaction. -- -- If it uses terminal-style interaction, Prefs will be read from -- the user's ~/.haskeline file (if present). If it uses -- file-style interaction, Prefs are not relevant and will not be -- read. runInputT :: (MonadIO m, MonadMask m) => Settings m -> InputT m a -> m a -- | Returns True if the current session uses terminal-style -- interaction. (See Behavior.) haveTerminalUI :: Monad m => InputT m Bool -- | Map a user interaction by modifying the base monad computation. mapInputT :: (forall b. m b -> m b) -> InputT m a -> InputT m a -- | Haskeline has two ways of interacting with the user: -- --
-- getInputLineWithInitial "prompt> " ("left", "") -- The cursor starts at the end of the line. -- getInputLineWithInitial "prompt> " ("left ", "right") -- The cursor starts before the second word. --getInputLineWithInitial :: (MonadIO m, MonadMask m) => String -> (String, String) -> InputT m (Maybe String) -- | Reads one character of input. Ignores non-printable characters. -- -- When using terminal-style interaction, the character will be read -- without waiting for a newline. -- -- When using file-style interaction, a newline will be read if it is -- immediately available after the input character. getInputChar :: (MonadIO m, MonadMask m) => String -> InputT m (Maybe Char) -- | Reads one line of input, without displaying the input while it is -- being typed. When using terminal-style interaction, the masking -- character (if given) will replace each typed character. -- -- When using file-style interaction, this function turns off echoing -- while reading the line of input. -- -- Note that if Haskeline is built against a version of the -- Win32 library earlier than 2.5, getPassword will -- incorrectly echo back input on MinTTY consoles (such as Cygwin or -- MSYS). getPassword :: (MonadIO m, MonadMask m) => Maybe Char -> String -> InputT m (Maybe String) -- | Waits for one key to be pressed, then returns. Ignores the value of -- the specific key. -- -- Returns True if it successfully accepted one key. Returns -- False if it encountered the end of input; i.e., an EOF -- in file-style interaction, or a Ctrl-D in terminal-style -- interaction. -- -- When using file-style interaction, consumes a single character from -- the input which may be non-printable. waitForAnyKey :: (MonadIO m, MonadMask m) => String -> InputT m Bool -- | Write a Unicode string to the user's standard output. outputStr :: MonadIO m => String -> InputT m () -- | Write a string to the user's standard output, followed by a newline. outputStrLn :: MonadIO m => String -> InputT m () -- | Return a printing function, which in terminal-style interactions is -- thread-safe and may be run concurrently with user input without -- affecting the prompt. getExternalPrint :: MonadIO m => InputT m (String -> IO ()) -- | Application-specific customizations to the user interface. data Settings m Settings :: CompletionFunc m -> Maybe FilePath -> Bool -> Settings m -- | Custom tab completion. [complete] :: Settings m -> CompletionFunc m -- | Where to read/write the history at the start and end of each line -- input session. [historyFile] :: Settings m -> Maybe FilePath -- | If True, each nonblank line returned by getInputLine -- will be automatically added to the history. [autoAddHistory] :: Settings m -> Bool -- | A useful default. In particular: -- --
-- defaultSettings = Settings { -- complete = completeFilename, -- historyFile = Nothing, -- autoAddHistory = True -- } --defaultSettings :: MonadIO m => Settings m -- | Because complete is the only field of Settings depending -- on m, the expression defaultSettings {completionFunc = -- f} leads to a type error from being too general. This function -- works around that issue, and may become unnecessary if another field -- depending on m is added. setComplete :: CompletionFunc m -> Settings m -> Settings m -- | Prefs allow the user to customize the terminal-style -- line-editing interface. They are read by default from -- ~/.haskeline; to override that behavior, use readPrefs -- and runInputTWithPrefs. -- -- Each line of a .haskeline file defines one field of the -- Prefs datatype; field names are case-insensitive and -- unparseable lines are ignored. For example: -- --
-- editMode: Vi -- completionType: MenuCompletion -- maxhistorysize: Just 40 --data Prefs -- | Read Prefs from a given file. If there is an error reading the -- file, the defaultPrefs will be returned. readPrefs :: FilePath -> IO Prefs -- | The default preferences which may be overwritten in the -- .haskeline file. defaultPrefs :: Prefs -- | Run a line-reading application. Uses defaultBehavior to -- determine the interaction behavior. runInputTWithPrefs :: (MonadIO m, MonadMask m) => Prefs -> Settings m -> InputT m a -> m a -- | Run a line-reading application. runInputTBehaviorWithPrefs :: (MonadIO m, MonadMask m) => Behavior -> Prefs -> Settings m -> InputT m a -> m a -- | Get the current line input history. getHistory :: MonadIO m => InputT m History -- | Set the line input history. putHistory :: MonadIO m => History -> InputT m () -- | Change the current line input history. modifyHistory :: MonadIO m => (History -> History) -> InputT m () -- | If Ctrl-C is pressed during the given action, throw an exception of -- type Interrupt. For example: -- --
-- tryAction :: InputT IO () -- tryAction = handle (\Interrupt -> outputStrLn "Cancelled.") -- $ withInterrupt $ someLongAction ---- -- The action can handle the interrupt itself; a new Interrupt -- exception will be thrown every time Ctrl-C is pressed. -- --
-- tryAction :: InputT IO () -- tryAction = withInterrupt loop -- where loop = handle (\Interrupt -> outputStrLn "Cancelled; try again." >> loop) -- someLongAction ---- -- This behavior differs from GHC's built-in Ctrl-C handling, which may -- immediately terminate the program after the second time that the user -- presses Ctrl-C. withInterrupt :: (MonadIO m, MonadMask m) => InputT m a -> InputT m a data Interrupt Interrupt :: Interrupt -- | Catch and handle an exception of type Interrupt. -- --
-- handleInterrupt f = handle $ \Interrupt -> f --handleInterrupt :: MonadMask m => m a -> m a -> m a module System.Console.Haskeline.Internal -- | This function may be used to debug Haskeline's input. -- -- It loops indefinitely; every time a key is pressed, it will print that -- key as it was recognized by Haskeline. Pressing Ctrl-C will stop the -- loop. -- -- Haskeline's behavior may be modified by editing your -- ~/.haskeline file. For details, see: -- https://github.com/judah/haskeline/wiki/CustomKeyBindings debugTerminalKeys :: IO a -- | This module provides a stateful, IO-based interface to Haskeline, -- which may be easier to integrate into some existing programs or -- libraries. -- -- It is strongly recommended to use the safer, monadic API of -- System.Console.Haskeline, if possible, rather than the explicit -- state management functions of this module. -- -- The equivalent REPL example is: -- --
-- import System.Console.Haskeline -- import System.Console.Haskeline.IO -- import Control.Concurrent -- -- main = bracketOnError (initializeInput defaultSettings) -- cancelInput -- This will only be called if an exception such -- -- as a SigINT is received. -- (\hd -> loop hd >> closeInput hd) -- where -- loop :: InputState -> IO () -- loop hd = do -- minput <- queryInput hd (getInputLine "% ") -- case minput of -- Nothing -> return () -- Just "quit" -> return () -- Just input -> do queryInput hd $ outputStrLn -- $ "Input was: " ++ input -- loop hd --module System.Console.Haskeline.IO data InputState -- | Initialize a session of line-oriented user interaction. initializeInput :: Settings IO -> IO InputState -- | Finish and clean up the line-oriented user interaction session. Blocks -- on an existing call to queryInput. closeInput :: InputState -> IO () -- | Cancel and clean up the user interaction session. Does not block on an -- existing call to queryInput. cancelInput :: InputState -> IO () -- | Run one action (for example, getInputLine) as part of a session -- of user interaction. -- -- For example, multiple calls to queryInput using the same -- InputState will share the same input history. In constrast, -- multiple calls to runInputT will use distinct histories unless -- they share the same history file. -- -- This function should not be called on a closed or cancelled -- InputState. queryInput :: InputState -> InputT IO a -> IO a