【问题标题】:Embedded Tcl: Does Tcl autocomplete commands?嵌入式 Tcl:Tcl 是否自动完成命令?
【发布时间】:2019-04-17 13:12:04
【问题描述】:

我们有一个内置我们的 C/C++ 应用程序的 Tcl,我在我们的代码中找到了如果找不到命令则调用 Tcl_EvalObjv 的地方。我不得不承认代码已经很老了,而且我们的开发人员并不知道这个模块中发生了什么。

看起来像这样:

// ... there is some checking if command is registered etc., it fails and the code goes here:
std::vector<Tcl_Obj*> tclArgs = { NULL };
for (int i = 1; i < objc; ++i)
    tclArgs.push_back(objv[i]);
tclArgs.shrink_to_fit();
// ...
tclArgs[0] = ::Tcl_NewStringObj(ORIGINAL_UNKNOWN, ORIGINAL_UNKNOWN_SIZE);
Tcl_IncrRefCount(tclArgs[0]);
::Tcl_ExposeCommand(pInterp, ORIGINAL_UNKNOWN, ORIGINAL_UNKNOWN);
result = ::Tcl_EvalObjv(pInterp, objc, &tclArgs[0], TCL_EVAL_GLOBAL); //<--
::Tcl_HideCommand(pInterp, ORIGINAL_UNKNOWN, ORIGINAL_UNKNOWN);
// ORIGINAL_UNKNOWN is char* it is just "unknown"

我们的应用程序中有命令处理程序,而在 CmdUnknown() 函数中执行 Tcl_EvalObjv 时,Tcl 有时会调用不同的命令。以下示例:

现有命令列表:“banana”、“applepie”、“carpet”、“card”

命令:“apple”,Tcl 调用“applepie”(错误,“apple”不是“applepie”)
命令:“blah”,Tcl 给出错误(正确)。
命令:“汽车”,Tcl 给出错误(正确,可能是因为 2 个类似的命令)。

Tcl 在搜索命令失败时是否有某种机制?问题是我找不到任何与我们的代码相关的东西来完成命令,所以也许 Tcl 可以吗?

【问题讨论】:

  • 我不知道这是在哪里记录的,但用户只需要提供命令的最小前缀,以便明确:a 足以区分“applepie”与其他命令。同样,bcarpcard 是明确的命令前缀。
  • 现在我想知道是否有办法将其关闭。所以我想我必须在“apple#”之类的命令之后添加特殊字符,然后如果返回错误,请找到该字符并将其删除。但也许tcl或flag中存在这样的功能来设置?

标签: c++ command embedded tcl


【解决方案1】:

正如 glenn 所暗示的,interactive (REPL) mode 中的 Tcl 允许使用一些最小但明确的名称前缀来调度命令。我不知道您的嵌入式 Tcl 是如何配置、初始化并最终以交互模式运行的。但是,您可能想尝试通过以下任一方式“关闭”(切换)交互模式:

unset ::tcl_interactive

set ::tcl_interactive 0

所有这些都是由默认的unknown 处理程序实现的。注意cmds 列表的查找方式以及tcl_interactive 为真或假时如何区别对待:

puts [info body unknown]

【讨论】:

  • 试一试:在调用Tcl_EvalObjv 之前将Tcl_SetVar(interp, "tcl_interactive", "0", TCL_GLOBAL_ONLY); 放在任何位置。
  • 谢谢,明天检查;)
猜你喜欢
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多