我需要在我的tcl应用程序中为用户定义的tcl proc添加tcl命令完成。
例如:
tcl_shell> proc myproc {} {puts test}
tcl_shell> my
当按 tab 时,它应该完成myproc。
答案 0 :(得分:0)
基本想法是问info commands
。如果在变量str
中的制表符之前键入字符,则可以使用
info commands $str*
如果它返回多个匹配项,则没有足够的字符串前缀来明确标识命令(您可能希望保留候选项列表并让用户通过连续的选项卡遍历它)。如果没有得到任何匹配,str
中的文本不是任何已知命令的前缀。如果你得到一个匹配,那就是要完成的命令名称。
如果你想完成命名空间,namespace children
就是命令。
示例:
proc findCommand str {
set matches [info commands $str*]
set ns [namespace qualifiers $str]
set str [namespace tail $str]
set nses [namespace children $ns $str*]
foreach ns $nses {
lappend matches {*}[info commands $ns\::*]
}
return $matches
}
% findCommand cl
clock close clear
% findCommand tcl::cl
::tcl::clock::GetJulianDayFromEraYearWeekDay ::tcl::clock::Oldscan ::tcl::clock::ParseFormatArgs ::tcl::clock::GetDateFields ::tcl::clock::microseconds ::tcl::clock::getenv ::tcl::clock::clicks ::tcl::clock::GetJulianDayFromEraYearMonthDay ::tcl::clock::milliseconds ::tcl::clock::ConvertLocalToUTC ::tcl::clock::seconds
ETA :tcl::prefix
Donal Fellows在评论中提及tcl::prefix。它大致相同,但使用起来有点复杂。必须将允许完成的完整列表作为参数传递给它,这一方面意味着您必须收集它;另一方面,它意味着您可以根据需要限制允许的完成集,或允许不存在的命令名(由unknown
处理)。如果字符串与其中任何一个都不匹配,它还可以向用户提示完成列表。示例 - 用户输入“foo”,命令列表是以“b”或“c”开头的全局命令:
::tcl::prefix match -message command $cmds $str
bad command "foo": must be bgerror, binary, break, case, catch, cd, chan, clear, clock, close, concat, continue, or coroutine