Skip to content

JA05_ヒストリ

HAYAMA_Kaoru edited this page Oct 11, 2023 · 1 revision

ヒストリ機能はデフォルトでは内蔵していません。オプションとして外だしをしています。

import "github.com/nyaosorg/go-readline-ny/simplehistory"

// ;
history := simplehistory.New()

editor := &readline.Editor{
	History:        history,
	HistoryCycling: true,
}

simplehistory.New() は、必要最小限のヒストリーを提供しますので、通常はこれをそのまま登録しておけばよいでしょう。ただし、オンメモリで保持するだけですので、ディスクにセーブしたりしたりしたい場合は、自前で次の IHistory interface の要件を満たしすインスタンスを用意する必要があります。

type IHistory interface {
	Len() int // ヒストリ文字列の総数を返す
	At(int) string // 引数で与えられた場所のヒストリ文字列を返す
}

ここでヒストリに追加を行うメソッドがないことに注意ください。これは一般のコマンドラインシェルなどでは、入力したテキストをそのままヒストリに登録されることがなく、!* などのマクロを展開した後の加工済みのテキストが登録されることを想定しているからです。つまり、go-readline-ny は勝手にヒストリへの追加は行いません。

そのため、ユーザは次のように readline の一連のループの中で明示的にヒストリの登録を行う必要があります。

for {
	text, err := editor.ReadLine(context.Background())
	if err != nil {
		fmt.Printf("ERR=%s\n", err.Error())
		return
	}
// ;
	history.Add(text)
}

.HistoryCycling フィールドは最古のヒストリ項目までたどり着いて、さらに古いものを参照した時の動作を指定します。true ならば最新へ移動、false なら何もしません。