Получите код клавиши ключа с изготовленной на заказ клавиатуры

Кажется, как будто расположение не может обработать [0x1b]- символ перед [.

Первая строка осмеливается:

 echo -e "\x1b[1m bold"
     echo -e "\x1b[30m black"
     echo -e "\x1b[31m red"
     echo -e "\x1b[32m green"
     echo -e "\x1b[33m yellow"
     echo -e "\x1b[34m blue"
     echo -e "\x1b[35m mag"
     echo -e "\x1b[36m cyan"
     echo -e "\x1b[37m white"   

Для общего типа я только знаю

echo -e "\x1b[0m io-std"
echo -e "\x1b[1m bold"
echo -e "\x1b[2m normal"

и из комментариев, manatwork спасибо и GypsyCosmonaut:

echo -e "\x1b[3m italic"
echo -e "\x1b[4m underlined"
echo -e "\x1b[5m blinking"
echo -e "\x1b[7m inverted"

и не знайте различие между io-std и нормальный.

Я не видел курсив или маленький в оболочке.

Можно ввести их (благодаря manatwork также) Ctrl + v ESC в Bash, где он будет отображен как ^[. Это означает, что целая последовательность ANSI будет похожа ^[[1m bold или ^[[1mbold (для предотвращения пробела прежде 'полужирный').

У многих редакторов есть проблемы с (символом) 0x1b. Альтернативы: скопировать/вставить это от где-нибудь, или использование

echo -e "\x1b[1m bold"

в ударе или Hex-редакторе.

12
01.07.2014, 02:44
1 ответ

Я предполагаю, что Вы пытаетесь сделать это в оболочке или подобный (еще, Вы просто пользовались бы этими X библиотеками непосредственно). Если так, можно найти xinput --test «device-name» намного легче проанализировать.

К сожалению, это действительно не пишущая сценарий оболочки товарищеская встреча. Но можно заставить его работать с stdbuf. Это работает, пока Вы не уничтожаете его, но Ваш сценарий оболочки мог передать его по каналу к read.

Так, можно сделать что-то вроде этого:

stty -echo
stdbuf -oL xinput test 'AT Translated Set 2 keyboard' \
    | perl -nE 'BEGIN {$| = 1} m/^key press\s+(\d+)/ and say $1' \
    | for key in q w e r t y; do
         echo -n "Please press $key: "
         read -r keycode
         echo "key $key = $keycode"
    done
stty echo

Необходимо будет использовать корректное название клавиатуры вместо "В Переведенном Наборе 2 клавиатуры". Можно найти его с xinput list:

anthony@Zia:~$ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=8    [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]

К сожалению, необходимо использовать определенное устройство — Вы не можете использовать базовую клавиатуру.

(Кроме того, необходимо будет найти способ уничтожить xinput в вышеупомянутом или просто содержание сами для удара Ctrl-C при вводе всех ключей. И Вы, вероятно, захотите перечислить больше ключей, чем стандартное расположение букв на клавиатуре.)

6
27.01.2020, 19:56
  • 1
    благодарит derobert! это соответствует отлично моей потребности! Я использовал id из клавиатуры вместо ее имени, потому что у меня были конфликты с 2 теми же именами. Так xinput test 18 где 18 идентификатор моей клавиатуры. –  xavier.seignard 01.07.2013, 13:58
  • 2
    , если я мог бы сделать то же с командой, которая не длительна (т.е. останавливается после первой нажатой клавиши и возвращает код клавиши), это был бы своего рода :) –  xavier.seignard 03.07.2013, 13:34
  • 3
    @xavier.seignard, которое я попробовал и не мог найти утилиту, которая делает это. Но было бы довольно легко взять xinput источник и заставить его проложить себе путь... проверка test.c, похож на соответствующую функцию, print_events. Возможно, Xorg взял бы патч для добавления флага для остановки после n события? –  derobert 03.07.2013, 18:07
  • 4
    @xavier.seignard я просто, натыкался на путь к виду, делают это... xinput --query-state дает текущее состояние и сразу выходит. Вы могли занятый цикл это. –  derobert 09.07.2013, 03:59

Теги

Похожие вопросы