about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--source_edit.lua29
1 files changed, 20 insertions, 9 deletions
diff --git a/source_edit.lua b/source_edit.lua
index 506aa41..310853a 100644
--- a/source_edit.lua
+++ b/source_edit.lua
@@ -111,10 +111,11 @@ function edit.check_locs(State)
   -- if State is inconsistent (i.e. file changed by some other program),
   --   throw away all cursor state entirely
   if edit.invalid1(State, State.screen_top1)
-      or edit.invalid1(State, State.cursor1)
+      or edit.invalid_cursor1(State)
       or not edit.cursor_on_text(State)
       or not Text.le1(State.screen_top1, State.cursor1) then
     State.screen_top1 = {line=1, pos=1}
+    State.cursor1 = {line=1, pos=1}
     edit.put_cursor_on_next_text_line(State)
   end
 end
@@ -126,6 +127,16 @@ function edit.invalid1(State, loc1)
   return loc1.pos > #State.lines[loc1.line].data
 end
 
+-- cursor loc in particular differs from other locs in one way:
+-- pos might occur just after end of line
+function edit.invalid_cursor1(State)
+  local cursor1 = State.cursor1
+  if cursor1.line > #State.lines then return true end
+  local l = State.lines[cursor1.line]
+  if l.mode ~= 'text' then return false end  -- pos is irrelevant to validity for a drawing line
+  return cursor1.pos > #State.lines[cursor1.line].data + 1
+end
+
 function edit.cursor_on_text(State)
   return State.cursor1.line <= #State.lines
       and State.lines[State.cursor1.line].mode == 'text'
@@ -133,14 +144,14 @@ end
 
 function edit.put_cursor_on_next_text_line(State)
   while true do
-  if State.cursor1.line >= #State.lines then
-    break
-  end
-  if State.lines[State.cursor1.line].mode == 'text' then
-    break
-  end
-  State.cursor1.line = State.cursor1.line+1
-  State.cursor1.pos = 1
+    if State.cursor1.line >= #State.lines then
+      break
+    end
+    if State.lines[State.cursor1.line].mode == 'text' then
+      break
+    end
+    State.cursor1.line = State.cursor1.line+1
+    State.cursor1.pos = 1
   end
 end