diff --git a/ui/text/buffer.go b/ui/text/buffer.go index 96b172d0..6bf26963 100644 --- a/ui/text/buffer.go +++ b/ui/text/buffer.go @@ -21,14 +21,25 @@ type editBuffer struct { // The gap start and end in bytes. gapstart, gapend int text []byte + + // changed tracks whether the buffer content + // has changed since the last call to Changed. + changed bool } const minSpace = 5 +func (e *editBuffer) Changed() bool { + c := e.changed + e.changed = false + return c +} + func (e *editBuffer) deleteRuneForward() { e.moveGap(0) _, s := utf8.DecodeRune(e.text[e.gapend:]) e.gapend += s + e.changed = e.changed || s > 0 e.dump() } @@ -37,6 +48,7 @@ func (e *editBuffer) deleteRune() { _, s := utf8.DecodeLastRune(e.text[:e.gapstart]) e.gapstart -= s e.caret -= s + e.changed = e.changed || s > 0 e.dump() } @@ -119,6 +131,7 @@ func (e *editBuffer) prepend(s string) { e.moveGap(len(s)) copy(e.text[e.caret:], s) e.gapstart += len(s) + e.changed = e.changed || len(s) > 0 e.dump() } diff --git a/ui/text/editor.go b/ui/text/editor.go index fd6b3bd4..9964ef67 100644 --- a/ui/text/editor.go +++ b/ui/text/editor.go @@ -59,14 +59,16 @@ type EditorEvent interface { isEditorEvent() } -type Submit struct{} +type ChangeEvent struct{} +type SubmitEvent struct{} const ( blinksPerSecond = 1 maxBlinkDuration = 10 * time.Second ) -func (s Submit) isEditorEvent() {} +func (s ChangeEvent) isEditorEvent() {} +func (s SubmitEvent) isEditorEvent() {} func (e *Editor) Next() (EditorEvent, bool) { if cfg := *e.Config; cfg != e.oldCfg { @@ -126,7 +128,7 @@ func (e *Editor) Next() (EditorEvent, bool) { } if e.Submit && (ke.Name == key.NameReturn || ke.Name == key.NameEnter) { if !ke.Modifiers.Contain(key.ModShift) { - return Submit{}, true + return SubmitEvent{}, true } } if e.command(ke) { @@ -138,6 +140,9 @@ func (e *Editor) Next() (EditorEvent, bool) { scrollTo = true e.append(ke.Text) } + if e.rr.Changed() { + return ChangeEvent{}, true + } } if sdist == 0 && scrollTo { e.scrollToCaret()