Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Haskell Есть ли IDE для Haskell? http://www.cyberforum.ru/haskell/thread2191459.html
Собственно есть ли среда разработки для языка Haskell?
Объединение полубайт Haskell
Неподскажите как объединить два полубайта в один?
Haskell Написал формулу вычисления первой космической скорости, в нужных константах с цифрами запутался
Как мне сделать вывод в км/сек? -- h - высота орбиты для спутника -- R - радиуc Земли в км + h -- m - масса Земли -- g - гравитациооная постоянная fSpace :: (Floating a) => a -> a fSpace h = ...
Haskell Падает Haskell при генерации списка Выполнял лабораторную (работа с генератором списков): Найти все двузначные числа, представимые в виде суммы корней двух натуральных чисел. | x <- , y <- , let z = sqrt(x) + sqrt(y), z > 9, z... http://www.cyberforum.ru/haskell/thread2188133.html
Haskell Элегантное решение http://www.cyberforum.ru/haskell/thread2183040.html
Предлагаю своеобразную игру, назовём её "Элегантное решение". Правила просты. Игрок 1 выкладывает условие, и решение. Игрок два должен предложить решение, которое на его взгляд...
Haskell Построение списков
XRuZzz, а не подскажите как реализовать список списков, в котором первый элемент меняется от 1 до 2, а второй от 1 до 3. ,..] Добавлено через 5 минут Спасибо разобрался, через генератор списков:)
Поиск текстовых подстрок по заданному регулярному выражению по файлу или группе файлов Haskell
Добрый вечер. Задали задание. Разработка программы поиска текстовых подстрок по заданному регулярному выражению по файлу или группе файлов. В haskell новичок. Прошу помочь.
Haskell Что такое терм? Что такое терм? Для чего он нужен? Реализовать терм в котором элементы последовательности зависят от индексов. http://www.cyberforum.ru/haskell/thread2182088.html
Haskell Удаление символов из строки http://www.cyberforum.ru/haskell/thread2177902.html
Функция delete :: Char -> String -> String, которая принимает на вход строку и символ и возвращает строку, в которой удалены все вхождения символа. Пример: delete ’l’ "Hello world!" должно...
Haskell Построение списков, упорядоченных по возрастанию Определите функцию, принимающую на вход целое число n и возвращающую список, содержащий n элементов, упорядоченных по возрастанию. Список факториалов. Определите функцию, принимающую на вход целое... http://www.cyberforum.ru/haskell/thread2177901.html
XRuZzz
Антикодер
1816 / 789 / 46
Регистрация: 15.09.2012
Сообщений: 2,900
0

Обработка не символьных клавиш

18.02.2018, 06:45. Просмотров 846. Ответов 4
Метки (Все метки)

Всем привет!
Разбираюсь как лучше реализовать простую вещь в консоли: нажимаем клавишу F1 - появляется справка.
Вот что удалось найти на просторах интернета:

Полезный ответ где объясняется, что происходит при нажатии клавиши в графическом режиме и в консоли:
How do keyboard input and text output work?
Низкоуровневый код для обработки не символьных клавиш:
stackoverflow: Haskell read raw keyboard input
(Я использовал последний ответ на вопрос)
Пытаюсь использовать этот код:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{-# LANGUAGE
    FlexibleContexts,
    OverloadedStrings,
    TemplateHaskell,
    QuasiQuotes,
    UnicodeSyntax #-}
module Control.Low where
 
import System.IO as SYS(BufferMode(..), hReady, hSetBuffering, hSetEcho, stdin)
getKey = reverse <$> getKey' ""
  where getKey' chars = do
          char <- getChar
          more <- hReady stdin
          (if more then getKey' else return) (char:chars)
 
loop :: IO ()
loop = do
    ss <- getKey
    case ss of
       "q" -> do
             putStrLn "Выход"
             return ()
       "\^[OP" -> do
             putStrLn "F1 - Справка"
             loop
       "\^[OQ" -> do
             putStrLn "F2 "
             loop
       "\^[OR" -> do
             putStrLn "F3"
             loop
       "\ESC[A" -> do
            putStrLn "Up"
            loop
       _ -> do
            putStrLn ss
            loop
Кусок из файла Main.hs
Haskell
1
2
3
    hSetBuffering stdin NoBuffering
    hSetEcho stdin False
    loop
И всё работает:
Bash
1
2
3
4
5
6
Up
1
2
F1 - Справка
F2 
F3
Добавляем один псевдоним:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{-# LANGUAGE
    FlexibleContexts,
    OverloadedStrings,
    TemplateHaskell,
    QuasiQuotes,
    UnicodeSyntax #-}
module Control.Low where
 
import System.IO as SYS(BufferMode(..), hReady, hSetBuffering, hSetEcho, stdin)
getKey = reverse <$> getKey' ""
  where getKey' chars = do
          char <- getChar
          more <- hReady stdin
          (if more then getKey' else return) (char:chars)
 
keyF1∷ String
keyF1 = "\^[OP"
keyF2 = "\^[OQ"
keyF3 = "\^[OR"
keyF4 = "\^[OS"
keyUp = "\^[A"
 
loop :: IO ()
loop = do
    ss <- getKey
    case ss of
       "q" -> do
             putStrLn "Выход"
             return ()
       keyF1 -> do
             putStrLn "F1 - Справка"
             loop
       "\^[OQ" -> do
             putStrLn "F2 "
             loop
       "\^[OR" -> do
             putStrLn "F3"
             loop
       "\ESC[A" -> do
            putStrLn "Up"
            loop
       _ -> do
            putStrLn ss
            loop
И всё сломалось - чтобы мы не нажимали, попадаем во второй case:
Bash
1
F1 - Справка
Работает только первый case 'q'.
Отсюда 4 вопроса:
1. В чём проблема с этим кодом?
2. Как лучше сделать обработку не символьных клавиш в консоли на низком уровне? Может быть встречали хорошие примеры?
3. Как добиться такого же эффекта в Haskline? (Попробую набросать код чуть позже)
4. Может посоветуете другие библиотеки для этих целей?
После того как разберусь с этим, планирую сделать так, чтобы функциональные клавиши F2-F4 позволяли переключать режимы программы:
- Добавление (Обновление) в БД
- Получение из БД
- Удаление в БД
То есть хочется сделать эффективный механизм, который бы позволял менять режимы консольной программы.

Вернуться к обсуждению:
Обработка не символьных клавиш
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2018, 06:45
Готовые ответы и решения:

Обработка нажатия клавиш
Здравствуйте! :senor: Я хочу написать простейшую консольную программу, в которой, для хорошего...

Обработка символьных данных
Написать программу обработки строки.Ввод строк организовать в программе. Строка должна состоять из...

Обработка символьных данных
Ввести с клавиатуры предложение. Сделать преобразование нижнего регистра в верхний.

Обработка символьных данный
Добрый день у меня проблема с задачей не могу сообразить как ее делать . Задача: В строке ,...

4. Обработка символьных данных.
4. Обработка символьных данных. Составить программу для решения задачи. Составить программу для...

4
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.