Backwards motions and deletions
This commit is contained in:
parent
a3b815b449
commit
717ec2048b
1 changed files with 43 additions and 5 deletions
|
|
@ -53,10 +53,46 @@ textEditor = name \
|
||||||
pos = skipWhile (ch \ charKind ch == kind) lines row col;
|
pos = skipWhile (ch \ charKind ch == kind) lines row col;
|
||||||
skipWhile (ch \ ch == " ") lines pos.row pos.col;
|
skipWhile (ch \ ch == " ") lines pos.row pos.col;
|
||||||
|
|
||||||
|
skipBack = pred line row col lines \
|
||||||
|
col < 0
|
||||||
|
| True \ (row > 0
|
||||||
|
| True \ (
|
||||||
|
prevLine = nth (row - 1) lines ~ unwrapOr "";
|
||||||
|
skipBack pred prevLine (row - 1) (len prevLine - 1) lines)
|
||||||
|
| False \ { row = 0, col = 0 - 1 })
|
||||||
|
| False \ (pred (nth col line ~ unwrapOr "")
|
||||||
|
| True \ skipBack pred line row (col - 1) lines
|
||||||
|
| False \ { row = row, col = col });
|
||||||
|
|
||||||
|
prevWordStart = lines row col \
|
||||||
|
# step back 1
|
||||||
|
c = col - 1;
|
||||||
|
r = row;
|
||||||
|
r2 = c < 0
|
||||||
|
| True \ r - 1
|
||||||
|
| False \ r;
|
||||||
|
c2 = c < 0
|
||||||
|
| True \ (max 0 (len (nth (r - 1) lines ~ unwrapOr "") - 1))
|
||||||
|
| False \ c;
|
||||||
|
# no prev line
|
||||||
|
r2 < 0
|
||||||
|
| True \ { row = 0, col = 0 }
|
||||||
|
| False \ (
|
||||||
|
line = nth r2 lines ~ unwrapOr "";
|
||||||
|
# skip spaces backward
|
||||||
|
pos = skipBack (ch \ ch == " ") line r2 c2 lines;
|
||||||
|
# skip same kind backward
|
||||||
|
kind = charKind (nth pos.col (nth pos.row lines ~ unwrapOr "") ~ unwrapOr " ");
|
||||||
|
pos2 = skipBack (ch \ charKind ch == kind) (nth pos.row lines ~ unwrapOr "") pos.row (pos.col - 1) lines;
|
||||||
|
# go 1 ahead
|
||||||
|
{ row = pos2.row, col = pos2.col + 1 }
|
||||||
|
);
|
||||||
|
|
||||||
resolveMotion = motion state \
|
resolveMotion = motion state \
|
||||||
from = { row = state.cursorRow, col = state.cursorCol };
|
from = { row = state.cursorRow, col = state.cursorCol };
|
||||||
to = motion
|
to = motion
|
||||||
| Word \ nextWordStart state.lines from.row from.col
|
| Word \ nextWordStart state.lines from.row from.col
|
||||||
|
| BackWord \ prevWordStart state.lines from.row from.col
|
||||||
| WholeLine \ from;
|
| WholeLine \ from;
|
||||||
{ from = from, to = to };
|
{ from = from, to = to };
|
||||||
|
|
||||||
|
|
@ -66,11 +102,10 @@ textEditor = name \
|
||||||
|
|
||||||
deleteRange = state from to \
|
deleteRange = state from to \
|
||||||
line = nth from.row state.lines ~ unwrapOr "";
|
line = nth from.row state.lines ~ unwrapOr "";
|
||||||
toCol = to.row > from.row
|
startCol = min from.col to.col;
|
||||||
| True \ len line
|
endCol = max from.col to.col;
|
||||||
| False \ to.col;
|
newLine = (slice line 0 startCol) & (slice line endCol (len line));
|
||||||
newLine = (slice line 0 from.col) & (slice line toCol (len line));
|
state.{ lines = updateAt from.row (_ \ newLine) state.lines, cursorCol = startCol };
|
||||||
state.{ lines = updateAt from.row (_ \ newLine) state.lines, cursorCol = from.col };
|
|
||||||
|
|
||||||
applyOperator = operator motion state \
|
applyOperator = operator motion state \
|
||||||
target = resolveMotion motion state;
|
target = resolveMotion motion state;
|
||||||
|
|
@ -277,6 +312,9 @@ textEditor = name \
|
||||||
| Key { key = "d" } \ (state.pending
|
| Key { key = "d" } \ (state.pending
|
||||||
| Some Delete \ applyOperator Delete WholeLine state
|
| Some Delete \ applyOperator Delete WholeLine state
|
||||||
| _ \ { state = state.{ pending = Some Delete }, emit = [] })
|
| _ \ { state = state.{ pending = Some Delete }, emit = [] })
|
||||||
|
| Key { key = "b" } \ (state.pending
|
||||||
|
| None \ withScroll { state = moveCursor (resolveMotion BackWord state) state, emit = [] }
|
||||||
|
| Some Delete \ withScroll (applyOperator Delete BackWord state))
|
||||||
| Key { key = "w" } \ (state.pending
|
| Key { key = "w" } \ (state.pending
|
||||||
| None \ withScroll { state = moveCursor (resolveMotion Word state) state, emit = [] }
|
| None \ withScroll { state = moveCursor (resolveMotion Word state) state, emit = [] }
|
||||||
| Some Delete \ withScroll (applyOperator Delete Word state))
|
| Some Delete \ withScroll (applyOperator Delete Word state))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue