【问题标题】:What tcl command returns last evaluated command?什么 tcl 命令返回最后评估的命令?
【发布时间】:2013-11-05 07:35:36
【问题描述】:

什么 tcl 命令返回最后评估的命令?我认为它应该有类似 bash 历史的东西。

我试过了,但是打印的是空字符串。

set aaa bbb
puts [history info]

我有创建 Tcl 解释器并使用它评估命令的 c++ 程序。在特定时刻,我需要知道最后评估的命令是什么。是否可以使用 Tcl 或 C 接口?

set a bbb
set b ccc
puts eee
set hh [history redo 1]

现在报错了

event "1" hasn't occured yet
    while executing
"HistIndex $event"
    (procedure "tcl::HistRedo" line 6)
    invoked from within
"tcl::HistRedo [lindex $args 1]"
    (procedure "history" line 109)
    invoked from within
"history redo 1"
    invoked from within
"set hh [history redo 1]"
    (file "./a.itcl" line 17)

【问题讨论】:

    标签: c tcl history


    【解决方案1】:

    使用history 命令可以在 tclsh 中查看和操作以前输入的命令。这让您可以查看之前的命令列表和重做事件。

    在交互式 tclsh 中,还有一个 !!!N 快​​捷方式到 history redo N 以重做最后输入的命令或重做命令 N(其中 N 是事件编号)。

    它不绑定向上箭头或 ctrl-p 或任何正常的东西。为此,您可能需要一些像 rlwrap 或 socat READLINE 这样的包装器来提供 readline 样式的行编辑。如果你有一个 X Windows 会话,那么tkcon 更有用并提供合理的命令行编辑。在 Windows 上,tclsh 可以使用 cmd.exe 提示符下的内置行编辑 - 包括使用 uparrow 来访问以前的命令。

    在我的测试会话中:

    % info pa
    8.5.13
    % history z
    bad option "z": must be add, change, clear, event, info, keep, nextid, or redo
    % history info
         1  info pa
         2  history z
         3  history info
    % history redo 1
    8.5.13
    % exit
    

    跟进

    来自原始海报的其他 cmets 表明代码未在标准 tclsh 解释器中运行。历史功能在 generic/tclHistory.c 和 library/history.tcl 库脚本中实现。如C文件头注释中所述:

    这个模块和Tcl库文件history.tcl一起实现 Tcl 命令历史。可以调用 Tcl_RecordAndEval(Obj) 进行记录 命令(“事件”)在执行之前。中定义的命令 history.tcl 可用于执行历史替换。

    因此我们可以推断出自定义解释器在评估我们想要输入历史的命令时必须使用Tcl_RecordAndEval API 调用。大概目前的自定义实现只是使用 Tcl_Eval 或相关函数之一。

    【讨论】:

    • 感谢您的回答,但我没有使用 tclsh。我有解释 tcl 命令的解释器。在某些时候,我需要知道最后评估的命令是什么。你能解释一下为什么在问题代码中,它没有打印任何东西吗?
    • @Ashot 也许试试puts [history redo 1]?您应该仍然可以使用类似于 set a [history redo 1] 的方式将其存储在变量中
    • @Ashot 在运行history redo 1之前你需要有一些东西;否则没有什么可以重做=P
    • @Jerry 当然我已经在历史命令之前运行了一个命令。请查看更新后的问题
    • tl;dr: 在自定义交互循环中使用 Tcl_RecordAndEval 而不是 Tcl_Eval 以与 Tcl 的 history 机制集成。
    猜你喜欢
    • 2021-06-07
    • 2013-05-21
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多