System.Console.Haskeline
| Safe Haskell | None |
|---|---|
| Язык | Haskell98 |
Содержание
Описание
Богатый пользовательский интерфейс для ввода строки в командных программах. 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
Преобразователь монады, который содержит все состояние и настройки, относящиеся к приложению для чтения строк.
Примеры реализации
| 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 Источник
Карта взаимодействия пользователя путём модификации вычислений базовой монады.
Поведения
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 прежде, чем были прочитаны какие-либо символы.
Аргументы
| :: MonadException m | |
| => Строка | Приглашение для ввода |
| -> InputT m (Может быть Строка) |
Читает одну строку ввода. Конечный символ новой строки (если есть) удаляется. При использовании взаимодействия в стиле терминала, эта функция предоставляет богатый пользовательский интерфейс для редактирования строк.
Если autoAddHistory == True и строка ввода не пустая (т. е. не состоит только из пробелов), она будет автоматически добавлена в историю.
Аргументы
| :: 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.
Аргументы
| :: MonadException m | |
| => String | Подсказка для ввода |
| -> InputT m (Maybe Char) |
Читает один символ ввода. Игнорирует непечатаемые символы.
При взаимодействии в стиле терминала символ будет считан без ожидания новой строки.
При взаимодействии в стиле файла будет считана новая строка, если она доступна сразу после символа ввода.
Аргументы
| :: MonadException m | |
| => Maybe Char | Символ маскирования; например, |
| -> String | |
| -> InputT m (Maybe String) |
Читает одну строку ввода без отображения ввода во время набора. При взаимодействии в стиле терминала символ маскирования (если задан) будет заменять каждый вводимый символ.
При взаимодействии в стиле файла эта функция отключает отображение ввода во время чтения строки ввода.
Вывод текста
Следующие функции обеспечивают кроссплатформенный вывод текста, который может содержать символы Юникода.
outputStr :: MonadIO m => String -> InputT m () Источник
Записывает строку Юникода в стандартный вывод пользователя.
outputStrLn :: MonadIO m => String -> InputT m () Источник
Записывает строку в стандартный вывод пользователя, за которой следует новая строка.
Настройка
Настройки
Настройки, специфичные для приложения, пользовательского интерфейса.
Конструкторы
| Settings | |
Поля
| |
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
Настройки пользователя
Prefs позволяют пользователю настроить интерфейс редактирования строк в стиле терминала. Они по умолчанию считываются из ~/.haskeline; чтобы переопределить это поведение, используйте readPrefs и runInputTWithPrefs
Каждая строка файла .haskeline определяет одно поле типа Prefs; имена полей нечувствительны к регистру, и необрабатываемые строки игнорируются. Например:
editMode: Vi completionType: MenuCompletion maxhistorysize: Just 40
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.
Конструкторы
| Interrupt |
handleInterrupt :: MonadException m => m a -> m a -> m a Source
Перехватить и обработать исключение типа Interrupt.
handleInterrupt f = handle $ \Interrupt -> f
Дополнительные подмодули
© 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