| file font nLines cr sp goNextPage goPrevPage findNext prevLine | file := FileStream fileNamed: 'in.txt'. font := TextStyle defaultFont. cr := Character cr. sp := Character space. nLines := Display height // (font height + font descent). goNextPage := [nLines timesRepeat: [file nextLine]]. prevLine := [file binary. [file position = 0 or: [file back = 13]] whileFalse. file ascii]. goPrevPage := [nLines timesRepeat: [prevLine value]]. findNext := [:pattern | pattern notEmpty ifTrue: [file upToAll: pattern]. prevLine value]. [ | string | string := String streamContents: [:ss | | position | position := file position. nLines timesRepeat: [ file nextLine ifNotNilDo: [:line | ss nextPutAll: line]. file peek ifNotNil: [ss cr]]. file position: position]. Display fillWhite. string asDisplayText display. [Sensor keyboardPressed] whileFalse. Sensor keyboard caseOf: { [$q] -> [file close. ^World restoreDisplay]. [$g] -> [file reset]. [$G] -> [file setToEnd]. [sp] -> [goNextPage value]. [$f] -> [goNextPage value]. [$b] -> [goPrevPage value]. [cr] -> [file nextLine]. [$e] -> [file nextLine]. [$y] -> [prevLine value]. [$/] -> [findNext value: (FillInTheBlank request: 'pattern:')] } otherwise: [] ] repeat