2

最後に評価されたコマンドを返す 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)
4

1 に答える 1

3

historyコマンドを使用して、以前に入力したコマンドの確認と操作を tclsh で実行できます。これにより、以前のコマンド リストを確認し、イベントをやり直すことができます。

インタラクティブな tclsh には、最後に入力されたコマンドまたはコマンド N (N はイベント番号) をやり直すための!!または!Nショートカットもあります。history redo N

ただし、上矢印やctrl-p、または通常のものにはバインドされていません。そのためには、おそらく rlwrap のようなラッパーが必要socat READLINEになるか、readline スタイルの行編集が必要になります。X Windows セッションを使用している場合は、tkconの方が使いやすく、適切なコマンド ライン編集が提供されます。Windows では、tclsh は cmd.exe プロンプトからビルド行編集を使用するようになります。これには、上向き矢印を使用して前のコマンドに移動することも含まれます。

私のテストセッションでは:

% 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 または関連する関数の 1 つを使用しているだけです。

于 2013-11-05T07:56:52.990 に答える