Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
XRuZzz
Антикодер
1683 / 786 / 46
Регистрация: 15.09.2012
Сообщений: 2,898
1

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

18.02.2018, 06:45. Просмотров 840. Ответов 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
Catstail
Модератор
24833 / 12628 / 2305
Регистрация: 12.02.2012
Сообщений: 20,556
18.02.2018, 09:03 2
А в какой ОС Вы работаете?
0
XRuZzz
Антикодер
1683 / 786 / 46
Регистрация: 15.09.2012
Сообщений: 2,898
19.02.2018, 09:43  [ТС] 3
Gentoo Linux
1
Catstail
Модератор
24833 / 12628 / 2305
Регистрация: 12.02.2012
Сообщений: 20,556
19.02.2018, 15:59 4
То-то, у меня в win код вообще не работает...
0
Curry
2991 / 2072 / 257
Регистрация: 01.06.2013
Сообщений: 4,526
Записей в блоге: 9
20.02.2018, 17:50 5
Лучший ответ Сообщение было отмечено XRuZzz как решение

Решение

Цитата Сообщение от XRuZzz Посмотреть сообщение
чтобы мы не нажимали, попадаем во второй case
Потому что в сравнении с образцом который просто имя всё подходит. keyF1 в 30-ой строке экранирует глобально определённый keyF1 и принимает значение ss.
Добавьте расширение
Haskell
1
{-# LANGUAGE PatternSynonyms #-}
И определяйте простейший вариант именованного образца
Haskell
1
2
pattern KeyF1 :: String
pattern KeyF1 = "\^[OP"
Заметьте, что имена образцов начинаются с заглавных букв.

Не по теме:

Само по себе получение кодов несимвольных клавиш через искейп последовательности, это для баша и суровых пингвинов :-! . Хотя читал, но не вспомню где, как эти искейп последовательности к консоли винды прикручивались. Я к тому что в языке где есть не только строки можно бы и двоичные коды клавиш добывать.

1
20.02.2018, 17:50
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2018, 17:50

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

Обработка символьных строк
Или лыжи не едут, или я... молодец. Помогите решить задачку. Даны две строки, содержащие русские...

Обработка символьных строк
Сформировать и вывести на экран текстовый файл содержащий только последовательности символов,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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