Сценарии Bash, используя клавиши со стрелками [дублировать]

Следующее описание взято из этой страницы :

Метод getElementsByClassName () возвращает коллекцию всех элементов в документе с указанным именем класса, так как объект NodeList.

Объект NodeList представляет собой набор узлов. К узлам можно обращаться по номерам индексов. Индекс начинается с 0.

Совет. Вы можете использовать свойство length объекта NodeList для определения количества элементов с указанным именем класса, затем вы можете прокручивать все элементы и извлекать нужную информацию .

blockquote>

Итак, поскольку параметр getElementsByClassName принимает имя класса.

Если это ваше тело HTML:





то var menuItems = document.getElementsByClassName('menuItem') вернет коллекцию (а не массив) из трех верхних

s, поскольку они соответствуют заданному имени класса.

Затем вы можете перебирать эти узлы (

s в этот случай) с помощью:

for (var menuItemIndex = 0 ; menuItems.length ; menuItemIndex ++) {
   var currentMenuItem = menuItems[menuItemIndex];
   // do stuff with currentMenuItem as a node.
}

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

5
задан Jonathan Bondhus 21 May 2012 в 04:25
поделиться

5 ответов

Вы можете использовать read -n 1 для чтения одного символа, а затем использовать оператор case для выбора действия, которое необходимо предпринять на основе ключа.

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

Например, на терминале, который я использую, стрелка вправо выдает ^[[C. Вы можете видеть, какую последовательность выходов выберете, нажав Ctrl-V вправо. То же самое можно сказать и о других клавишах управления курсором, таких как Page Up и End.

Вместо этого я рекомендовал бы использовать односимвольные клавиши, такие как < и >. Обработка их в вашем скрипте будет намного проще.

read -n 1 key

case "$key" in
    '<') go_left;;
    '>') go_right;;
esac
5
ответ дан Dennis Williamson 21 August 2018 в 23:31
поделиться
  • 1
    «& Quot; go_left & quot; и "go_right" функции? – Jonathan Bondhus 21 May 2012 в 15:23
  • 2
    @JonathanBondhus: они являются заполнителями для имен функций или других команд или заявлений, которые вы предоставили. – Dennis Williamson 21 May 2012 в 15:24
  • 3
    Еще одна вещь, я обновил свой сценарий, снова увидел [здесь] ( github.com/jbondhus/last-seen/blob/master/last-seen.sh ), и теперь он назначен, назначен назад пользователя и. назначен для продвижения вперед. Я сделал это так, чтобы пользователю не пришлось удерживать клавишу переключения. До сих пор я использую [this] (pastebin.com/MiPA5jJD) как функцию, которая анализирует входной ключ, и я хочу изменить его так, чтобы вместо него для back и. для перемотки вперед используются клавиши со стрелками. Я попытался использовать код ключа, ^ [[D и ^ [[C] как левый и правый клавиши, например '^ [[D') и '^ [[C'), но он все еще не работает. – Jonathan Bondhus 21 May 2012 в 16:52
  • 4
    Да, не пытайтесь использовать клавиши со стрелками. Для этого вам нужно использовать проклятый модуль в скрипте Python или что-то подобное вместо того, чтобы пытаться использовать скрипт Bash. Некоторые комментарии к вашему скрипту: вы можете улучшить читаемость и уменьшить размер кода, используя ((var += value)) или ((var++)) вместо var=$((var+value)). Например: ((total_time -= mo * 2629746)). Выполнение var=$((0)) не требуется, просто используйте var=0. Целочисленные сравнения: while (( line_number <= total )). Используйте $() вместо backticks для подстановки команды. Вам не нужен awk: wc -l < filename – Dennis Williamson 21 May 2012 в 17:04
  • 5
    Вы отправились в очень хороший старт. В моем предыдущем комментарии я сказал «проклятый модуль». Это была опечатка. Он должен был сказать «модуль проклятий». – Dennis Williamson 22 May 2012 в 14:45

Как упоминалось ранее, клавиши курсора генерируют три байта - и ключи, такие как home / end, даже генерируют четыре! Решение, которое я видел где-то, должно было позволить первому one-char read () следовать за тремя последующими односимволами с очень коротким таймаутом. Наиболее распространенные последовательности клавиш можно показать следующим образом:

#!/bin/bash
for term in vt100 linux screen xterm
  { echo "$term:"
    infocmp -L1 $term|egrep 'key_(left|right|up|down|home|end)'
  }

Кроме того, / etc / inputrc содержит некоторые из них с отображением readline. Итак, отвечая на исходный вопрос, вот отрезок из этого меню bash i 'просто взломать:

while read -sN1 key # 1 char (not delimiter), silent
do
  # catch multi-char special key sequences
  read -sN1 -t 0.0001 k1
  read -sN1 -t 0.0001 k2
  read -sN1 -t 0.0001 k3
  key+=${k1}${k2}${k3}

  case "$key" in
    i|j|$'\e[A'|$'\e0A'|$'\e[D'|$'\e0D')  # cursor up, left: previous item
      ((cur > 1)) && ((cur--));;

    k|l|$'\e[B'|$'\e0B'|$'\e[C'|$'\e0C')  # cursor down, right: next item
      ((cur < $#-1)) && ((cur++));;

    $'\e[1~'|$'\e0H'|$'\e[H')  # home: first item
      cur=0;;

    $'\e[4~'|$'\e0F'|$'\e[F')  # end: last item
      ((cur=$#-1));;

    ' ')  # space: mark/unmark item
      array_contains ${cur} "${sel[@]}" && \
      sel=($(array_remove $cur "${sel[@]}")) \
      || sel+=($cur);;

    q|'') # q, carriage return: quit
      echo "${sel[@]}" && return;;
  esac                  

  draw_menu $cur "${#sel[@]}" "${sel[@]}" "$@" >/dev/tty
  cursor_up $#
done
11
ответ дан eMPee584 21 August 2018 в 23:31
поделиться
  • 1
    +1, хотя это действительно не решает проблему. Я бы пошел с окончательным предложением @ DennisWilliamson. – tripleee 3 May 2013 в 07:01

Вы можете читать клавиши со стрелками, а также другие клавиши без каких-либо необычных команд; вам просто нужно два вызова read вместо одного:

escape_char=$(printf "\u1b")
read -rsn1 mode # get 1 character
if [[ $mode == $escape_char ]]; then
    read -rsn2 mode # read 2 more chars
fi
case $mode in
    'q') echo QUITTING ; exit ;;
    '[A') echo UP ;;
    '[B') echo DN ;;
    '[D') echo LEFT ;;
    '[C') echo RIGHT ;;
    *) >&2 echo 'ERR bad input'; return ;;
esac
3
ответ дан JellicleCat 21 August 2018 в 23:31
поделиться

Не уверен, что это ответ на вопрос напрямую, но я думаю, что это связано - я блуждал, откуда берутся эти коды, и я наконец нашел:

Сначало немного сложно читать; для левой стрелки найдите «LEFT 4» в столбце «Key», а для последовательности, которую видит bash, найдите пятый столбец «keymap» - «normal»), где он написан как «[D 1b 5b 44 "- это три байта (27, 91, 68), представляющие этот ключ.

Поиск потока Как читать клавиши со стрелками по действительно старому bash? - Форумы UNIX и Linux вдохновили меня написать короткий однострочный вкладыш, который сбрасывает коды клавиш нажатых клавиш. В основном, вы нажимаете клавишу, затем Enter (для запуска окончания read), а затем используйте hexdump для вывода того, что read сохранил (и, наконец, нажмите Ctrl-C, чтобы выйти из цикла):

$ while true; do read -p?; echo -n $REPLY | hexdump -C; done
?^[[D     
00000000  1b 5b 44                                          |.[D| # left arrow
00000003
?^[[C
00000000  1b 5b 43                                          |.[C| # right arrow
00000003
?^[[1;2D
00000000  1b 5b 31 3b 32 44                                 |.[1;2D| # Shift+left arrow
00000006
?^[[1;2C
00000000  1b 5b 31 3b 32 43                                 |.[1;2C| # Shift+right arrow
00000006
?^C

Итак, в то время как клавиши со стрелками требуют 3 байта - клавиши Shift + стрелки требуют 6! Однако, казалось бы, все эти последовательности начинаются с 0x1b (27), поэтому можно проверить это значение для read -n1, прежде чем читать больше байтов; также 5b остается вторым байтом в многобайтовой последовательности для столбцов «normal» и «shift / NUM-Lock» в таблице выше.


Изменить: намного проще и правильнее сканирование терминальных кодов нажатых клавиш в Linux осуществляется через showkey :

$ showkey 
Couldn't get a file descriptor referring to the console

$ showkey -h
showkey version 1.15

usage: showkey [options...]

valid options are:

    -h --help   display this help text
    -a --ascii  display the decimal/octal/hex values of the keys
    -s --scancodes  display only the raw scan-codes
    -k --keycodes   display only the interpreted keycodes (default)

$ sudo showkey -a

Press any keys - Ctrl-D will terminate this program

^[[A     27 0033 0x1b
         91 0133 0x5b
         65 0101 0x41
^[[B     27 0033 0x1b
         91 0133 0x5b
         66 0102 0x42
^[[A     27 0033 0x1b
         91 0133 0x5b
         65 0101 0x41
^[[D     27 0033 0x1b
         91 0133 0x5b
         68 0104 0x44
^[[C     27 0033 0x1b
         91 0133 0x5b
         67 0103 0x43
^C       3 0003 0x03
^M       13 0015 0x0d
^D       4 0004 0x04
6
ответ дан sdaau 21 August 2018 в 23:31
поделиться
# This will bind the arrow keys

while true
do
    read -r -sn1 t
    case $t in
        A) echo up ;;
        B) echo down ;;
        C) echo right ;;
        D) echo left ;;
    esac
done
6
ответ дан user3229933 21 August 2018 в 23:31
поделиться
Другие вопросы по тегам:

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