在tcl中执行刷新以捕获用户输入时,有没有办法忽略退格?TCL嵌入忽略退格
我正在执行一个函数,用于捕获用户输入的变量,以便稍后在另一个命令中使用。所以我执行以下功能。
puts -nonewline "What is the username? "
flush stdout
set usrnm [gets stdin]
所以我们可以说使用该命令,只要我不使用退格一切工作我期望的方式但是如果我使用退格一个“\ 0x7F部分”添加为一个字符。有没有办法让退格不被视为角色?
在tcl中执行刷新以捕获用户输入时,有没有办法忽略退格?TCL嵌入忽略退格
我正在执行一个函数,用于捕获用户输入的变量,以便稍后在另一个命令中使用。所以我执行以下功能。
puts -nonewline "What is the username? "
flush stdout
set usrnm [gets stdin]
所以我们可以说使用该命令,只要我不使用退格一切工作我期望的方式但是如果我使用退格一个“\ 0x7F部分”添加为一个字符。有没有办法让退格不被视为角色?
这似乎取决于您的终端;当我尝试与这些按键序列代码:
然后我得到在两种情况下,usrnm
可变长度3串(通过string length
测量)。当终端处于正常烹饪模式(通常的默认模式)时,这就是我所期望的。由于\x7f
可能不是在一个用户名中的有效字符,无论如何,我猜,你可以筛选出来:
set usrnm [string map {\x7f ""} $usrnm]
的唯一办法是绝对确保字符不存在让终端进入原始模式(也可能不会回显),并自己完成所有的字符输入处理。相对于问题的规模来说,这是相当大的工作量;后置过滤器似乎对我来说更加明智(我仍然想知道你的终端有什么问题)。
[编辑]:把你的终端回熟模式,这样做:
exec stty -raw <@stdin
好,将解决这个问题,但在同一时间,我想退格功能像它应该的工作,并删除不需要的字符。 – 2013-03-14 14:47:11
@Derek那么,它适用于我。你在哪个平台上? – 2013-03-14 15:06:56
对不起,对于迟到的响应,但执行stty -raw <@stdin不起作用。我在Cisco IOS上使用TCL解释器。 – 2013-03-20 13:48:38
我只是碰到了这个最近,我写了一个程序来处理字符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
}
看来你的终端是不是一个成熟模式,请参阅http://wiki.tcl.tk/11866 – 2013-03-14 14:39:03