为procs激活auto tcl命令完成

时间:2018-01-12 10:14:20

标签: command-line tcl proc

我需要在我的tcl应用程序中为用户定义的tcl proc添加tcl命令完成。

例如:

tcl_shell> proc myproc {} {puts test}

tcl_shell> my  

当按 tab 时,它应该完成myproc。

1 个答案:

答案 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

文档: infonamespace

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