2013-11-05 91 views
2

什麼tcl命令返回上次評估命令?我認爲它應該有bash歷史。什麼tcl命令返回上次評估的命令?

我試過這個,但它打印空字符串。

set aaa bbb 
puts [history info] 

我有C++程序創建Tcl解釋器並評估使用它的命令。在特定的時刻,我需要知道什麼是上次評估的命令。可以使用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) 

回答

3

回顧與以前輸入的命令的操作是使用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 

跟進從原來的海報狀態,代碼不是標準解釋的tclsh運行

補充意見。歷史功能在generic/tclHistory.c和library/history.tcl庫腳本中實現。正如在C文件頭註釋:

這個模塊和Tcl庫文件history.tcl一起實現了 Tcl命令歷史記錄。可以調用Tcl_RecordAndEval(Obj)在執行前記錄 命令(「事件」)。可以使用 history.tcl中定義的命令執行歷史替換。

,所以我們可以推斷,評估我們想要進入歷史命令時,自定義解釋器必須使用Tcl_RecordAndEval API調用。據推測,當前的自定義實現只是使用Tcl_Eval或其中一個相關函數。

+0

感謝您的回答,但我沒有使用tclsh。我有解釋器來評估tcl命令。在某個時刻,我需要知道什麼是上次評估的命令。你能解釋爲什麼在問題的代碼中,它不打印任何東西? – Ashot

+0

@Ashot也許試試'puts [history redo 1]'?您應該還是能夠它存儲在一個變量使用類似於'的東西設置了[歷史重做1]' – Jerry

+0

@Jerry我得到一個錯誤'事件「1」 @Ashot你需要有一些還沒有發生yet' – Ashot