2013-03-14 77 views
0

在tcl中执行刷新以捕获用户输入时,有没有办法忽略退格?TCL嵌入忽略退格

我正在执行一个函数,用于捕获用户输入的变量,以便稍后在另一个命令中使用。所以我执行以下功能。

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

所以我们可以说使用该命令,只要我不使用退格一切工作我期望的方式但是如果我使用退格一个“\ 0x7F部分”添加为一个字符。有没有办法让退格不被视为角色?

+3

看来你的终端是不是一个成熟模式,请参阅http://wiki.tcl.tk/11866 – 2013-03-14 14:39:03

回答

0

这似乎取决于您的终端;当我尝试与这些按键序列代码:

  • 退格一个bÇ返回
  • 一个bÇ退格d返回

然后我得到在两种情况下,usrnm可变长度3串(通过string length测量)。当终端处于正常烹饪模式(通常的默认模式)时,这就是我所期望的。由于\x7f可能不是在一个用户名中的有效字符,无论如何,我猜,你可以筛选出来:

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

的唯一办法是绝对确保字符不存在让终端进入原始模式(也可能不会回显),并自己完成所有的字符输入处理。相对于问题的规模来说,这是相当大的工作量;后置过滤器似乎对我来说更加明智(我仍然想知道你的终端有什么问题)。


[编辑]:把你的终端回熟模式,这样做:

exec stty -raw <@stdin 
+0

好,将解决这个问题,但在同一时间,我想退格功能像它应该的工作,并删除不需要的字符。 – 2013-03-14 14:47:11

+0

@Derek那么,它适用于我。你在哪个平台上? – 2013-03-14 15:06:56

+0

对不起,对于迟到的响应,但执行stty -raw <@stdin不起作用。我在Cisco IOS上使用TCL解释器。 – 2013-03-20 13:48:38

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 
}