diff --git a/fcore/normal-mode/normal-move.sml b/fcore/normal-mode/normal-move.sml index 6d5cf92..f422d06 100644 --- a/fcore/normal-mode/normal-move.sml +++ b/fcore/normal-mode/normal-move.sml @@ -106,34 +106,20 @@ struct ) end - fun moveCursorUp (app: app_type, count) = + fun finishMoveCursorUpDown + (app: app_type, newCursorLineNumber, buffer, column) = let val { windowWidth , windowHeight - , cursorIdx - , buffer + , visualScrollColumn = prevScrollColumn , startLine = prevLineNumber , searchList , searchString , bufferModifyTime - , visualScrollColumn = prevScrollColumn , ... } = app - (* calculate new idx to move to *) - val buffer = LineGap.goToIdx (cursorIdx, buffer) - val startOfLine = Cursor.vi0 (buffer, cursorIdx) - val column = cursorIdx - startOfLine - - val cursorLineNumber = - if Cursor.isNextChrEndOfLine (buffer, cursorIdx) then - LineGap.idxToLineNumber (cursorIdx + 1, buffer) - else - LineGap.idxToLineNumber (cursorIdx, buffer) - val newCursorLineNumber = Int.max (cursorLineNumber - count, 0) - val column = if newCursorLineNumber = 0 then column - 1 else column - val buffer = LineGap.goToLine (newCursorLineNumber, buffer) val lineIdx = LineGap.lineNumberToIdx (newCursorLineNumber, buffer) val buffer = LineGap.goToIdx (lineIdx, buffer) @@ -188,6 +174,26 @@ struct ) end + fun moveCursorUp (app: app_type, count) = + let + val {cursorIdx, buffer, ...} = app + + (* calculate new idx to move to *) + val buffer = LineGap.goToIdx (cursorIdx, buffer) + val startOfLine = Cursor.vi0 (buffer, cursorIdx) + val column = cursorIdx - startOfLine + + val cursorLineNumber = + if Cursor.isNextChrEndOfLine (buffer, cursorIdx) then + LineGap.idxToLineNumber (cursorIdx + 1, buffer) + else + LineGap.idxToLineNumber (cursorIdx, buffer) + val newCursorLineNumber = Int.max (cursorLineNumber - count, 0) + val column = if newCursorLineNumber = 0 then column - 1 else column + in + finishMoveCursorUpDown (app, newCursorLineNumber, buffer, column) + end + fun moveCursorDown (app: app_type, count) = let val @@ -220,62 +226,10 @@ struct Int.max (0, #lineLength buffer - 2) else newCursorLineNumber - - val buffer = LineGap.goToLine (newCursorLineNumber, buffer) - val lineIdx = LineGap.lineNumberToIdx (newCursorLineNumber, buffer) - val buffer = LineGap.goToIdx (lineIdx, buffer) - val lineIdx = - if Cursor.isNextChrEndOfLine (buffer, lineIdx) then lineIdx - else lineIdx + 1 - - val buffer = LineGap.goToIdx (lineIdx, buffer) - val endOfLineIdx = Cursor.viDlr (buffer, lineIdx, 1) - - val cursorIdx = Int.min (endOfLineIdx, lineIdx + column) - - val buffer = LineGap.goToIdx (cursorIdx, buffer) - - (* create draw message *) - val visualScrollColumn = - TextScroll.getScrollColumn - (buffer, cursorIdx, windowWidth, prevScrollColumn) - - val startLine = - TextScroll.getStartLine - (prevLineNumber, newCursorLineNumber, windowHeight) - - val buffer = LineGap.goToLine (startLine, buffer) - - val drawMsg = NormalModeTextBuilder.build - ( startLine - , cursorIdx - , buffer - , windowWidth - , windowHeight - , searchList - , searchString - , visualScrollColumn - ) - val drawMsg = Vector.concat drawMsg - val drawMsg = DrawMsg.DRAW_TEXT drawMsg - val drawMsg = [MailboxType.DRAW drawMsg] - - val mode = NORMAL_MODE "" in - NormalModeWith.bufferAndCursorIdx - ( app - , buffer - , cursorIdx - , mode - , startLine - , searchList - , drawMsg - , bufferModifyTime - , visualScrollColumn - ) + finishMoveCursorUpDown (app, newCursorLineNumber, buffer, column) end - fun moveToLine (app: app_type, reqLine) = let val reqLine = reqLine - 1