Приложение 3 - Консоль
Руководство пользователя REBOL / Core Основное содержание Отправьте нам отзыв
Содержание:
1. Командная строка
2. Индикатор результата
3. Вызов истории
4. Индикатор занятости
5. Расширенные операции с консолью
5.1 Последовательности ввода с клавиатуры
5.2 Последовательности вывода терминала
1. Командная строка
Приглашение командной строки по умолчанию - ">>". Вы можете изменить приглашение с помощью такого кода, как:
system/console/prompt: "Input: "
Тогда приглашение станет:
Input:
Подсказка может быть блоком, который оценивается каждый раз. Эта строка печатает текущее время:
system/console/prompt: [reform [now/time " >> "]]
Это приведет к появлению запроса:
10:30 >>
2. Индикатор результата
Индикатор результата по умолчанию - "==" и может быть изменен с помощью такой строки, как:
system/console/result: "Result: "
Эти настройки можно передать user.r, чтобы сделать их постоянными.
3. Напоминание истории
Каждая строка, введенная в REBOL в командной строке, сохраняется в блоке истории, и ее можно вызвать позже, используя клавиши со стрелками вверх и вниз. Например, однократное нажатие стрелки вверх вызывает предыдущую строку ввода.
Доступ к блоку истории, содержащему все строки ввода, осуществляется из объекта системной консоли:
probe system/console/history
Вы можете сохранить блок истории в виде файла:
save %history.r system/console/history
и его можно перезагрузить позже с помощью:
system/console/history: load %history.r
Эти строчки можно вводить user.r для сохранения и перезагрузки вашей истории между сессиями REBOL.
4. Индикатор занятости
Когда REBOL ожидает завершения сетевой операции, на экране появляется индикатор занятости, указывающий на то, что что-то происходит. Вы можете изменить индикатор с помощью такой строки:
system/console/busy: "123456789-"
Когда REBOL работает в тихом режиме, индикатор занятости отображаться не будет.
5. Расширенные операции с консолью
Консоль предоставляет возможность «виртуального терминала», которая позволяет выполнять такие операции, как перемещение курсора, адресация курсора, редактирование строки, очистка экрана, ввод управляющих клавиш и запрос положения курсора.
Последовательности управления с консоли соответствуют стандарту ANSI. Эти функции предоставляют вам возможность писать собственные терминальные программы, не зависящие от платформы, такие как текстовые редакторы, почтовые клиенты или эмуляторы telnet.
Функции консоли применимы как к вводу, так и к выводу. При вводе функциональные клавиши будут преобразованы в многосимвольные escape-последовательности. На выходе можно использовать многосимвольные escape-последовательности для управления отображением текста в окне консоли. И входная, и выходная последовательности начинаются с escape-символа ANSI, 27 десятичного числа (1B в шестнадцатеричном формате). Следующий символ в последовательности указывает управляющие клавиши на входе или операцию управления терминалом на выходе.
Управляющие символы ANSI чувствительны к регистру и обычно требуют символа верхнего регистра.
5.1 Последовательности ввода с клавиатуры
Последовательности ввода для функциональных клавиш перечислены в таблице ниже (в системах и оболочках, которые их поддерживают, таких как Linux, BSD и т.д.).
Чтобы получить эти последовательности в виде потока необработанных символов, отключите режим обработки строки входного порта:
set-modes system/ports/input [lines: false]
Теперь вы можете получить ввод из порта (с помощью COPY или READ-IO) или использовать такую функцию, как INPUT, для получения каждого символа:
while [
code: input
code <> 13 ; ENTER
][
probe code
]
Вот несколько общих кодов входных функций ANSI:
|
Функциональная клавиша
|
Escape Code
|
REBOL Block
|
|---|
|
F1
|
ESC O P
|
[27 79 80]
|
|
F2
|
ESC O Q
|
[27 79 81]
|
|
F3
|
ESC O R
|
[27 79 82]
|
|
F4
|
ESC O S
|
[27 79 83]
|
|
F5
|
ESC [ 1 5 ~
|
[27 91 49 53 126]
|
|
F6
|
ESC [ 1 7 ~
|
[27 91 49 55 126]
|
|
F7
|
ESC [ 1 8 ~
|
[27 91 49 56 126]
|
|
F8
|
ESC [ 1 9 ~
|
[27 91 49 57 126]
|
|
F9
|
ESC [ 2 0 ~
|
[27 91 50 48 126]
|
|
F10
|
ESC [ 2 1 ~
|
[27 91 50 49 126]
|
|
F11
|
ESC [ 2 2 ~
|
[27 91 50 50 126]
|
|
F12
|
ESC [ 2 3 ~
|
[27 91 50 51 126]
|
|
Home
|
ESC [ 1 ~
|
[27 91 49 126]
|
|
End
|
ESC [ 4 ~
|
[27 91 52 126]
|
|
Page-up
|
ESC [ 5 ~
|
[27 91 53 126]
|
|
Page-down
|
ESC [ 6 ~
|
[27 91 54 126]
|
|
Insert
|
ESC [ 2 ~
|
[27 91 50 126]
|
|
Up
|
ESC [ A
|
[27 91 65]
|
|
Down
|
ESC [ B
|
[27 91 66]
|
|
Left
|
ESC [ D
|
[27 91 68]
|
|
Right
|
ESC [ C
|
[27 91 67]
|
5.2 Последовательности выходных символов
Существует несколько вариантов последовательностей выходных символов управления терминалом. Некоторым кодам команд предшествует число (отправленное в формате ASCII), указывающее, что операция должна выполняться указанное количество раз. Например, команде перемещения курсора могут предшествовать два числа, разделенных точкой с запятой, чтобы указать позицию строки и столбца, к которым нужно перейти. Командные символы курсора (требуется верхний регистр) включены в следующую таблицу:
|
Последовательность вывода
|
Описание
|
|---|
|
(1B)
|
Используйте этот escape-код перед следующими кодами
|
|
D
|
Перемещает курсор на одну позицию влево
|
|
C
|
Перемещает курсор на одну позицию вправо
|
|
A
|
Перемещает курсор на одну позицию вверх
|
|
B
|
Перемещает курсор на одну позицию вниз
|
|
n D
|
Перемещает курсор на n пробелов влево
|
|
n C
|
Перемещает курсор на n пробелов вправо
|
|
n A
|
Перемещает курсор на n пробелов вверх
|
|
n B
|
Перемещает курсор на n пробелов вниз
|
|
r ; c H
|
Перемещает курсор в строку r, столбец c *
|
|
H
|
Перемещает курсор в верхний левый угол (домой) *
|
|
P
|
Удаляет один символ справа в текущем местоположении
|
|
n P
|
Удаляет n символов справа в текущем местоположении
|
|
@
|
Вставляет одно пустое пространство в текущее местоположение
|
|
n @
|
Вставляет n пробелов в текущее местоположение
|
|
J
|
Очищает экран и перемещает курсор в верхний левый угол (домой) *
|
|
K
|
Очищает от текущей позиции до конца текущей строки
|
|
6n
|
Помещает текущую позицию курсора во входной буфер
|
|
7n
|
Помещает размеры экрана во входной буфер
|
Верхний левый угол определяется как строка 1, столбец 1
В следующем примере курсор перемещается на десять правых пробелов:
print "^(1B)[10CHi!"
Hi
В этом примере курсор перемещается на семь левых пробелов и очищается оставшаяся часть строки:
cursor: func [parm [string!]][join "^(1B)[" parm]
print ["How are you" cursor "7D" cursor "K"]
How a
Чтобы узнать текущий размер окна консоли, вы можете использовать этот пример:
cons: open/binary [scheme: 'console]
print cursor "7n"
screen-dimensions: next next to-string copy cons
33;105R
close cons
В приведенном выше примере открывается консоль, отправляется управляющий символ во входной буфер и копируется возвращаемое значение. Он считывает значение (размеры экрана), которое возвращается после управляющего символа, и закрывает консоль. Возвращаемое значение - высота и ширина, разделенные точкой с запятой (;), за которой следует R. В приведенном выше примере экран имеет высоту 33 и ширину 105.
Автопрокрутка
Печать символа в правом нижнем углу некоторых терминалов приведет к появлению новой строки, которая будет прокручивать экран. Других не будет. Это несоответствие между типами консольных терминалов необходимо учитывать при написании скриптов REBOL, предназначенных для кроссплатформенности.
|