History progress, but current behavior is broken

See history.nim for future behavior of history
Also started testing.md, since after history it's time to start testing
This commit is contained in:
Productive2 2021-02-18 00:23:31 +01:00
parent b6cc31d19e
commit ad508cd9f3
5 changed files with 110 additions and 4 deletions

View File

@ -42,4 +42,8 @@ proc populateDefaults*(editor: LineEditor) =
if editor.content.getContent() == "":
editor.finish()
editor.events.call(jeQuit)
editor.bindKey("shiftup"):
editor.historyMove(-1)
editor.bindKey("shiftdown"):
editor.historyMove(1)

View File

@ -11,12 +11,12 @@ import renderer
type
JaleEvent* = enum
jeKeypress, jeQuit, jeFinish
jeKeypress, jeQuit, jeFinish, jeHistoryChange
LineEditor* = ref object
content*: Multiline
historyIndex*: int
history: seq[Multiline]
historyIndex*: int # TODO to be private
history*: seq[Multiline] # TODO to be private
keystrokes*: Event[int]
events*: Event[JaleEvent]
prompt*: string
@ -49,10 +49,34 @@ proc newLineEditor*: LineEditor =
# priv/pub methods
proc historyMove*(editor: LineEditor, delta: int) =
# broken behaviour: history should not be modified, it should clone
# the modified one that is eventually submitted and add it to the end
# TODO
if editor.historyIndex + delta < 0:
editor.content = editor.history[0]
editor.historyIndex = 0
elif editor.historyIndex + delta >= editor.history.high():
editor.content = editor.history[editor.history.high()]
editor.historyIndex = editor.history.high()
else:
editor.content = editor.history[editor.historyIndex + delta]
editor.historyIndex += delta
editor.events.call(jeHistoryChange)
proc reset(editor: LineEditor) =
editor.unfinish()
editor.rendered = 0
proc flush*(editor: LineEditor) =
# kinda like reset, it moves the current element one down in history
# and adds a new one
editor.reset()
editor.content = newMultiline()
editor.history.add(editor.content)
editor.historyIndex = editor.history.high()
proc render(editor: LineEditor, line: int = -1, hscroll: bool = true) =
var y = line
if y == -1:
@ -98,10 +122,19 @@ proc moveCursorToEnd(editor: LineEditor) =
cursorDown(editor.content.high() - editor.content.Y)
write stdout, "\n"
# TODO don't use globals, but allow for event removal
var histchange = false
proc changeHistory =
histchange = true
proc read*(editor: LineEditor): string =
# starts at the top, full render moves it into the right y
editor.fullRender()
# TODO: must remove event at end
# otherwise there'll be more instances of the same
editor.events.add(jeHistoryChange, changeHistory)
while not editor.finished:
# refresh current line every time
@ -116,12 +149,14 @@ proc read*(editor: LineEditor): string =
editor.keystrokes.call(key)
editor.events.call(jeKeypress)
# redraw everything if y changed
if preY != editor.content.Y:
if histchange or preY != editor.content.Y:
# move to the top
if preY > 0:
cursorUp(preY)
# move to the right y
editor.fullRender()
if histchange:
histchange = false
# move cursor to end
editor.moveCursorToEnd()

32
history.nim Normal file
View File

@ -0,0 +1,32 @@
# history.nim
import multiline
type HistoryElement* = ref object
original*: Multiline
current*: Multiline
type History* = ref object
elements: seq[HistoryElement]
index: int
lowestTouchedIndex: int
proc newHistoryElement*(og: Multiline): HistoryElement =
new(result)
result.original = og
new(result.current) # TODO deepcopy
proc delta*(h: History, amt: int): Multiline =
discard # move up/down in history and return reference to current
# also update lowest touched index
proc clean*(h: History) =
discard # restore originals to current
# from lowest touched index to the top
proc save*(h: History, path: string) =
discard # convert it to string, save
proc loadHistory*(path: string): History =
discard # create new history from file

View File

@ -14,5 +14,8 @@ e.prompt = "> "
e.populateDefaults()
while keep:
let input = e.read()
echo "history index: " & $e.historyIndex
e.flush()
echo "history len: " & $e.history.len()
echo "output:<" & input.replace("\n", "\\n") & ">"

32
testing.md Normal file
View File

@ -0,0 +1,32 @@
This short document describes the testing strategy and status for jale.
Jale should be tested on different active versions of different
terminal emulators. Also on different OSes. This document describes which
platforms are being/planned on being tested and a testing procedure.
Note: this is a wip document, await updates once the bug hunt starts
# Platforms
Unless otherwise specified, everything falls back to Arch linux, x86_64, nim 1.4.2.
| Terminal | Last tested |
| :-------- | :------------ |
| gnome terminal | never |
| xfce terminal | passed on 16.2.2021 |
| xterm | never |
| urxvt | never |
| cmd.exe | never |
| powershell | never |
| windows terminal | never |
| gnome terminal + ssh | never |
| gnome terminal + tmux | never |
# Testing procedure
- [ ] Jale compiles?
- [ ] Entering single line input, backspace, delete
- [ ] entering new lines, deleting lines with backspace
- [ ] home/end/page up/page down
- [ ] Submitting output