6811 - tile: left-cursor movement

Displayed cursor position is not yet correct, but insertions happen at
the right cursor position.
This commit is contained in:
Kartik Agaram 2020-09-19 22:33:44 -07:00
parent 4449f48781
commit f32e575e38
3 changed files with 68 additions and 5 deletions

View File

@ -46,11 +46,26 @@ $process:body: {
compare key, 0x445b1b # left-arrow
{
break-if-!=
# TODO:
# gap-left cursor-word
# or
# cursor-word = cursor-word->prev
# gap-to-end cursor-word
var cursor-word-ah/edi: (addr handle word) <- get self, cursor-word
var _cursor-word/eax: (addr word) <- lookup *cursor-word-ah
var cursor-word/ecx: (addr word) <- copy _cursor-word
# if not at start, gap-left
var at-start?/eax: boolean <- cursor-at-start? cursor-word
compare at-start?, 0 # false
{
break-if-=
cursor-left cursor-word
break $process:body
}
# otherwise, move gap to end of prev word
var prev-word-ah/esi: (addr handle word) <- get cursor-word, prev
var prev-word/eax: (addr word) <- lookup *prev-word-ah
{
compare prev-word, 0
break-if-=
copy-object prev-word-ah, cursor-word-ah
cursor-to-end prev-word
}
break $process:body
}
compare key, 0x435b1b # right-arrow

View File

@ -114,6 +114,18 @@ fn gap-to-end self: (addr gap-buffer) {
}
}
fn gap-at-start? _self: (addr gap-buffer) -> result/eax: boolean {
var self/esi: (addr gap-buffer) <- copy _self
var left/eax: (addr grapheme-stack) <- get self, left
result <- grapheme-stack-empty? left
}
fn gap-at-end? _self: (addr gap-buffer) -> result/eax: boolean {
var self/esi: (addr gap-buffer) <- copy _self
var right/eax: (addr grapheme-stack) <- get self, right
result <- grapheme-stack-empty? right
}
fn gap-right _self: (addr gap-buffer) -> result/eax: grapheme {
$gap-right:body: {
var self/esi: (addr gap-buffer) <- copy _self

View File

@ -98,6 +98,42 @@ fn add-grapheme-to-word _self: (addr word), c: grapheme {
add-grapheme-at-gap data, c
}
fn cursor-at-start? _self: (addr word) -> result/eax: boolean {
var self/esi: (addr word) <- copy _self
var data/eax: (addr gap-buffer) <- get self, data
result <- gap-at-start? data
}
fn cursor-at-end? _self: (addr word) -> result/eax: boolean {
var self/esi: (addr word) <- copy _self
var data/eax: (addr gap-buffer) <- get self, data
result <- gap-at-end? data
}
fn cursor-left _self: (addr word) {
var self/esi: (addr word) <- copy _self
var data/eax: (addr gap-buffer) <- get self, data
var dummy/eax: grapheme <- gap-left data
}
fn cursor-right _self: (addr word) {
var self/esi: (addr word) <- copy _self
var data/eax: (addr gap-buffer) <- get self, data
var dummy/eax: grapheme <- gap-right data
}
fn cursor-to-start _self: (addr word) {
var self/esi: (addr word) <- copy _self
var data/eax: (addr gap-buffer) <- get self, data
gap-to-start data
}
fn cursor-to-end _self: (addr word) {
var self/esi: (addr word) <- copy _self
var data/eax: (addr gap-buffer) <- get self, data
gap-to-end data
}
fn print-word screen: (addr screen), _self: (addr word) {
var self/esi: (addr word) <- copy _self
var data/eax: (addr gap-buffer) <- get self, data