2013-03-14 2 views
0

Есть ли способ игнорировать обратные пространства при выполнении флеша в tcl для захвата ввода пользователя?TCL Flush Ignore Backspace

Я выполняю функцию, где я фиксирую пользовательский ввод в переменной, которая будет использоваться в другой команде позднее. Поэтому я выполняю следующую функцию.

puts -nonewline "What is the username? " 
flush stdout 
set usrnm [gets stdin] 

Так скажем, используя эту команду до тех пор, пока я не использую забой все работает так, как я ожидаю, что это, однако, если я делаю использовать забой «\ x7F» добавляется в качестве символа. Есть ли способ, чтобы backspace не рассматривался как символ?

+3

Кажется, что ваш терминал не в приготовленном режиме, пожалуйста, см http://wiki.tcl.tk/11866 –

ответ

0

Это похоже на ваш терминал; когда я пытаюсь этот код с этими ключевыми последовательностями:

  • BackspaceбсВернуться
  • бсBackspacedReturn

Тогда я получаю строку длины 3 (измеренный с помощью string length) в usrnm переменной в обоих случаях. Это то, что я ожидал бы, когда терминал будет правильно в готовом режиме (обычный по умолчанию). Поскольку \x7f, вероятно, не является допустимым символом в имени пользователя в любом случае, я думаю, что вы могли бы отфильтровать его:

set usrnm [string map {\x7f ""} $usrnm] 

Единственный способ быть абсолютно уверен, что символ не существует поставить терминал в режим raw (и, вероятно, не-эхо) и выполнить всю обработку ввода символов самостоятельно. Это огромная работа по сравнению с размером проблемы; пост-фильтр кажется мне более разумным (и мне все еще интересно, что с вашим терминалом).


[EDIT]: Чтобы перевести терминал обратно в приготовленном режим, сделайте следующее:

exec stty -raw <@stdin 
+0

Хорошо, что бы решить эту проблему, но в то же время я хотел бы функцию забоя к работайте так, как надо, и удалите нежелательный символ. –

+0

@Derek Ну, это работает для меня. На какой платформе вы работаете? –

+0

Извините за поздний ответ, но exec stty -raw <@stdin не работает. Я использую интерпретатор TCL в Cisco IOS. –

0

Я просто побежал в эту последнее время, и я написал процедуру для обработки обугленных 127 символов (возврат каретки). Если какая-либо другая очистка ввода должна произойти, вы можете сделать это здесь, например, удаление специальных символов. У меня такое чувство, что оно может быть более элегантным, но оно действительно работает.

proc cleanInput {str} { 
    set return "" 
    for {set i 0} {$i < [string length $str]} {incr i} { 
     set char [string index $str $i] 
     set asc [scan $char %c] 
     if {$asc == 127} { #backspace 
      if {[string length $return] > 0} { 
       set return [string range $return 0 [expr "[string length $return] - 2"]] 
      } 
     } else { 
      append return $char 
     } 
    } 
    return $return 
}