Рассмотрим следующий код:Как проверить, ожидает ли stdin в TCL?
chan configure stdin -blocking false
while { true } {
chan gets stdin
if { chan blocked stdin } { break }
}
Здесь, в последней строке цикла chan blocked stdin
возвращает истину либо в случаях: когда нет более вход доступен в stdin
, и когда есть некоторый вход доступен в stdin
, но это не заканчивается символом новой строки. Мне нужно различать эти два случая.
Как я могу это сделать?
chan pending input stdin
также возвращается 0
в обоих случаях.
Вот контекст, в котором используется вышеуказанный код.
proc prompt { } { puts -nonewline stdout "MyShell > "; flush stdout }
proc evaluate { } \
{
chan configure stdin -blocking false
while { true } {
# for "stdin -blocking false" "read stdin" acts like "gets stdin"
set part [chan read stdin 100]
append command $part
if { $part eq "" } { break }
}
chan configure stdin -blocking true
# Here I want test if there are pending characters at stdin,
# and while so, I want to wait for newline character.
# It should be like this:
# while { *the required test goes here* } {
# append command [chan gets stdin]\n
# }
while { ! [info complete $command] } {
append command [chan gets stdin]\n
}
catch { uplevel #0 $command } got
if { $got ne "" } {
puts stderr $got
flush stderr
}
prompt
}
chan event stdin readable evaluate
prompt
while { true } { update; after 100 }
Что вы действительно пытаетесь сделать? Прочитать символ по символу при нажатии клавиши? На какой платформе это нужно? – slebetman
Я пытаюсь написать оболочку, похожую на 'tslsh'. Вышеупомянутый код обрабатывает ввод, введенный в оболочку. Если вход заканчивается символом новой строки, то оболочка должна попытаться его оценить, а в противном случае, т. Е. Если на входе есть ожидающие символы, тогда оболочке придется ждать символа новой строки. – Vahagn
@slebetman См. Обновление. – Vahagn