Spec-Zone.ru › Haskell 7

System.Console.Haskeline

Safe Haskell None
Язык Haskell98

Содержание

  • Интерактивные сессии
    • Преобразователь монады InputT
    • Поведения
  • Функции взаимодействия с пользователем
    • Чтение пользовательского ввода
    • Вывод текста
  • Настройка
    • Настройки
    • Настройки пользователя
    • История
  • Обработка Ctrl-C
  • Дополнительные подмодули

Описание

Богатый пользовательский интерфейс для ввода строки в командных программах. Haskeline поддерживает Unicode и работает как на системах, совместимых с POSIX, так и на Windows.

Пользователи могут настроить интерфейс с помощью файла ~/.haskeline; см. http://trac.haskell.org/haskeline/wiki/UserPrefs для получения дополнительной информации.

Пример использования этой библиотеки для простого цикла чтения-вычисления-печати (REPL):

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

Интерактивные сессии

Преобразователь монады InputT

data InputT m a Источник

Преобразователь монады, который содержит все состояние и настройки, относящиеся к приложению для чтения строк.

Примеры реализации

MonadTrans InputT
Monad m => Monad (InputT m)
Monad m => Functor (InputT m)
Monad m => Applicative (InputT m)
MonadIO m => MonadIO (InputT m)
MonadException m => MonadException (InputT m)

runInputT :: MonadException m => Настройки m -> InputT m a -> m a Источник

Запуск приложения для чтения строк. Эта функция подходит для большинства приложений.

Эта функция эквивалентна runInputTBehavior defaultBehavior. Она использует взаимодействие в стиле терминала, если stdin подключено к терминалу и включен режим отображения. В противном случае (например, если stdin является конвейером), используется взаимодействие в стиле файла.

Если используется взаимодействие в стиле терминала, Prefs будет читаться из файла настроек пользователя ~/.haskeline (если он существует). Если используется взаимодействие в стиле файла, Prefs не имеют значения и не будут читаться.

haveTerminalUI :: Monad m => InputT m Булево Источник

Возвращает True если текущая сессия использует взаимодействие в стиле терминала. (См. Behavior)

mapInputT :: (forall b. m b -> m b) -> InputT m a -> InputT m a Источник

Карта взаимодействия пользователя путём модификации вычислений базовой монады.

Поведения

data Поведение Источник

Haskeline имеет два способа взаимодействия с пользователем:

  • «Взаимодействие в стиле терминала» предоставляет богатый пользовательский интерфейс, подключаясь к терминалу пользователя (который может отличаться от stdin или stdout).
  • «Взаимодействие в стиле файла» рассматривает входные данные как простой поток символов, например, при чтении из файла или конвейера. Функции ввода (например, getInputLine) выводят приглашение в stdout.

«Поведение» — это метод для определения типа взаимодействия во время выполнения.

Для большинства приложений (например, REPL), defaultBehavior должно иметь правильный эффект.

runInputTBehavior :: MonadException m => Поведение -> Настройки m -> InputT m a -> m a Источник

Запуск приложения для чтения строк в соответствии с заданным поведением.

Если используется взаимодействие в стиле терминала, Prefs будет читаться из файла настроек пользователя ~/.haskeline (если он существует). Если используется взаимодействие в стиле файла, Prefs не имеют значения и не будут читаться.

defaultBehavior :: Поведение Источник

Чтение ввода из stdin. Использование взаимодействия в стиле терминала, если stdin подключено к терминалу и включен режим отображения. В противном случае (например, если stdin является конвейером), используется взаимодействие в стиле файла.

Это поведение должно подойти для большинства приложений.

useFileHandle :: Обработчик -> Поведение Источник

Использование взаимодействия в стиле файла, чтение ввода из заданного Handle.

useFile :: Путь к файлу -> Поведение Источник

Использование взаимодействия в стиле файла, чтение ввода из заданного файла.

preferTerm :: Поведение Источник

Использование взаимодействия в стиле терминала, когда это возможно, даже если stdin и/или stdout не являются терминалами.

Если невозможно открыть терминал пользователя, используется взаимодействие в стиле файла, чтение ввода из stdin.

Функции взаимодействия с пользователем

Чтение пользовательского ввода

Следующие функции считывают одну строку или символ ввода от пользователя.

При использовании взаимодействия в стиле терминала, эти функции возвращают Nothing если пользователь нажал Ctrl-D при пустом тексте ввода.

При использовании взаимодействия в стиле файла, эти функции возвращают Nothing если был встречен EOF прежде, чем были прочитаны какие-либо символы.

getInputLine Источник

Аргументы

:: MonadException m
=> Строка

Приглашение для ввода

-> InputT m (Может быть Строка)

Читает одну строку ввода. Конечный символ новой строки (если есть) удаляется. При использовании взаимодействия в стиле терминала, эта функция предоставляет богатый пользовательский интерфейс для редактирования строк.

Если autoAddHistory == True и строка ввода не пустая (т. е. не состоит только из пробелов), она будет автоматически добавлена в историю.

getInputLineWithInitial Источник

Аргументы

:: MonadException m
=> String

Подсказка для ввода

-> (String, String)

Начальное значение слева и справа от курсора

-> InputT m (Maybe String)

Читает одну строку ввода и заполняет поле вставки начальным текстом. При использовании взаимодействия в стиле терминала эта функция предоставляет богатый интерфейс редактирования строк с дополнительной возможностью задания значения по умолчанию.

Эта функция ведет себя точно так же, как getInputLine, за исключением того, что она предварительно заполняет область ввода. Текст, находящийся в области ввода, задается как 2-кортеж со двумя String значениями. Строка слева от кортежа (полученная вызовом fst) будет отображаться слева от курсора, а строка справа (полученная вызовом snd) — справа от курсора.

Вот несколько примеров вызова этой функции:

getInputLineWithInitial "prompt> " ("left", "") -- The cursor starts at the end of the line.
getInputLineWithInitial "prompt> " ("left ", "right") -- The cursor starts before the second word.

getInputChar Источник

Аргументы

:: MonadException m
=> String

Подсказка для ввода

-> InputT m (Maybe Char)

Читает один символ ввода. Игнорирует непечатаемые символы.

При взаимодействии в стиле терминала символ будет считан без ожидания новой строки.

При взаимодействии в стиле файла будет считана новая строка, если она доступна сразу после символа ввода.

getPassword Источник

Аргументы

:: MonadException m
=> Maybe Char

Символ маскирования; например, Just '*'

-> String
-> InputT m (Maybe String)

Читает одну строку ввода без отображения ввода во время набора. При взаимодействии в стиле терминала символ маскирования (если задан) будет заменять каждый вводимый символ.

При взаимодействии в стиле файла эта функция отключает отображение ввода во время чтения строки ввода.

Вывод текста

Следующие функции обеспечивают кроссплатформенный вывод текста, который может содержать символы Юникода.

outputStr :: MonadIO m => String -> InputT m () Источник

Записывает строку Юникода в стандартный вывод пользователя.

outputStrLn :: MonadIO m => String -> InputT m () Источник

Записывает строку в стандартный вывод пользователя, за которой следует новая строка.

Настройка

Настройки

data Settings m Источник

Настройки, специфичные для приложения, пользовательского интерфейса.

Конструкторы

Settings

Поля

complete :: CompletionFunc m

Настройка завершения ввода табом.

historyFile :: Maybe FilePath

Место для чтения/записи истории в начале и в конце каждого сеанса ввода.

autoAddHistory :: Bool

Если True, каждая непустая строка, возвращенная getInputLine, будет автоматически добавлена в историю.

defaultSettings :: MonadIO m => Settings m Источник

Полезная настройка по умолчанию. В частности:

defaultSettings = Settings {
          complete = completeFilename,
          historyFile = Nothing,
          autoAddHistory = True
          }

setComplete :: CompletionFunc m -> Settings m -> Settings m Источник

Так как complete является единственным полем Settings зависящим от m, выражение defaultSettings {completionFunc = f} приводит к ошибке типа из-за чрезмерной общности. Эта функция обходит эту проблему и может стать ненужной, если будет добавлено другое поле, зависящее от m

Настройки пользователя

data Prefs Источник

Prefs позволяют пользователю настроить интерфейс редактирования строк в стиле терминала. Они по умолчанию считываются из ~/.haskeline; чтобы переопределить это поведение, используйте readPrefs и runInputTWithPrefs

Каждая строка файла .haskeline определяет одно поле типа Prefs; имена полей нечувствительны к регистру, и необрабатываемые строки игнорируются. Например:

editMode: Vi
completionType: MenuCompletion
maxhistorysize: Just 40

Экземпляры

Show Prefs

readPrefs :: FilePath -> IO Prefs Источник

Считывает Prefs из указанного файла. При ошибке чтения файла возвращается defaultPrefs

defaultPrefs :: Prefs Источник

Настройки по умолчанию, которые могут быть перезаписаны в файле .haskeline

runInputTWithPrefs :: MonadException m => Prefs -> Settings m -> InputT m a -> m a Источник

Выполняет приложение для чтения строк. Использует defaultBehavior для определения поведения взаимодействия.

runInputTBehaviorWithPrefs :: MonadException m => Behavior -> Prefs -> Settings m -> InputT m a -> m a Источник

Выполняет приложение для чтения строк.

История

Трансформер монады InputT обеспечивает прямой, низкоуровневый доступ к состоянию истории строк пользователя.

Однако для большинства приложений должно быть достаточно использовать просто флаги autoAddHistory и historyFile

getHistory :: MonadIO m => InputT m History Source

Получить текущую историю ввода строки.

putHistory :: MonadIO m => History -> InputT m () Source

Установить историю ввода строки.

modifyHistory :: MonadIO m => (History -> History) -> InputT m () Source

Изменить текущую историю ввода строки.

Обработка Ctrl-C

withInterrupt :: MonadException m => InputT m a -> InputT m a Source

Если во время выполнения заданного действия нажата клавиша Ctrl-C, выбрасывается исключение типа Interrupt. Например:

tryAction :: InputT IO ()
tryAction = handle (\Interrupt -> outputStrLn "Cancelled.")
               $ wrapInterrupt $ someLongAction

Действие может обработать прерывание само по себе; новое исключение Interrupt будет выбрасываться каждый раз при нажатии Ctrl-C.

tryAction :: InputT IO ()
tryAction = wrapInterrupt loop
    where loop = handle (\Interrupt -> outputStrLn "Cancelled; try again." >> loop)
                   someLongAction

Это поведение отличается от встроенной обработки Ctrl-C в GHC, которая может немедленно завершить программу после второго нажатия пользователем Ctrl-C.

data Interrupt Source

Конструкторы

Interrupt

Примеры

Eq Interrupt
Show Interrupt
Exception Interrupt

handleInterrupt :: MonadException m => m a -> m a -> m a Source

Перехватить и обработать исключение типа Interrupt.

handleInterrupt f = handle $ \Interrupt -> f

Дополнительные подмодули

module System.Console.Haskeline.Completion

module System.Console.Haskeline.MonadException

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/haskeline-0.7.2.1/System-Console-Haskeline.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API