add equivalent of vi's 'ge' and 'gE' commands
This commit is contained in:
@@ -234,6 +234,15 @@ struct
|
|||||||
CHAR_EVENT chr => moveToChrNext (app, count, fMove, chr)
|
CHAR_EVENT chr => moveToChrNext (app, count, fMove, chr)
|
||||||
| RESIZE_EVENT (width, height) => resizeText (app, width, height)
|
| RESIZE_EVENT (width, height) => resizeText (app, width, height)
|
||||||
|
|
||||||
|
fun handleGo (count, app, newCmd) =
|
||||||
|
case newCmd of
|
||||||
|
CHAR_EVENT chr =>
|
||||||
|
(case chr of
|
||||||
|
#"e" => moveBackward (app, count, Cursor.endOfPrevWord)
|
||||||
|
| #"E" => moveBackward (app, count, Cursor.endOfPrevWORD)
|
||||||
|
| _ => clearMode app)
|
||||||
|
| RESIZE_EVENT (width, height) => resizeText (app, width, height)
|
||||||
|
|
||||||
(* useful reference as list of non-terminal commands *)
|
(* useful reference as list of non-terminal commands *)
|
||||||
(* todo: actually parse, checking if there are further strings or input *)
|
(* todo: actually parse, checking if there are further strings or input *)
|
||||||
fun parseAfterCount (strPos, str, count, app, newCmd) =
|
fun parseAfterCount (strPos, str, count, app, newCmd) =
|
||||||
@@ -267,7 +276,7 @@ struct
|
|||||||
handleNextChr (count, app, Cursor.toPrevChr, newCmd)
|
handleNextChr (count, app, Cursor.toPrevChr, newCmd)
|
||||||
| #"g" =>
|
| #"g" =>
|
||||||
(* go *)
|
(* go *)
|
||||||
clearMode app
|
handleGo (count, app, newCmd)
|
||||||
| #"c" =>
|
| #"c" =>
|
||||||
(* change *)
|
(* change *)
|
||||||
clearMode app
|
clearMode app
|
||||||
|
|||||||
@@ -1046,6 +1046,63 @@ struct
|
|||||||
(strPos - 1, str, absIdx - 1, strTl, lineTl)
|
(strPos - 1, str, absIdx - 1, strTl, lineTl)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
fun helpEndOfPrevWord (strPos, str, absIdx, strTl, lineTl) =
|
||||||
|
if strPos < 0 then
|
||||||
|
case (strTl, lineTl) of
|
||||||
|
(shd :: stl, lhd :: ltl) =>
|
||||||
|
helpEndOfPrevWord
|
||||||
|
(String.size shd - 1, shd, absIdx, stl, ltl)
|
||||||
|
| (_, _) =>
|
||||||
|
0
|
||||||
|
else
|
||||||
|
let
|
||||||
|
val chr = String.sub (str, strPos)
|
||||||
|
in
|
||||||
|
if Char.isAlphaNum chr orelse chr = #"_" then
|
||||||
|
if isPrevChrNonBlank (strPos, str, strTl) then
|
||||||
|
absIdx - 1
|
||||||
|
else
|
||||||
|
helpEndOfPrevWord
|
||||||
|
(strPos - 1, str, absIdx - 1, strTl, lineTl)
|
||||||
|
else
|
||||||
|
if Char.isSpace chr then
|
||||||
|
if isPrevChrSpace (strPos, str, strTl) then
|
||||||
|
helpEndOfPrevWord
|
||||||
|
(strPos - 1, str, absIdx - 1, strTl, lineTl)
|
||||||
|
else
|
||||||
|
absIdx - 1
|
||||||
|
else
|
||||||
|
(* is NON_BLANK *)
|
||||||
|
if isPrevChrAlphaNum (strPos, str, strTl) then
|
||||||
|
absIdx - 1
|
||||||
|
else
|
||||||
|
helpEndOfPrevWord
|
||||||
|
(strPos - 1, str, absIdx - 1, strTl, lineTl)
|
||||||
|
end
|
||||||
|
|
||||||
|
fun helpEndOfPrevWORD (strPos, str, absIdx, strTl, lineTl) =
|
||||||
|
if strPos < 0 then
|
||||||
|
case (strTl, lineTl) of
|
||||||
|
(shd :: stl, lhd :: ltl) =>
|
||||||
|
helpEndOfPrevWORD
|
||||||
|
(String.size shd - 1, shd, absIdx, stl, ltl)
|
||||||
|
| (_, _) =>
|
||||||
|
0
|
||||||
|
else
|
||||||
|
let
|
||||||
|
val chr = String.sub (str, strPos)
|
||||||
|
in
|
||||||
|
if Char.isSpace chr then
|
||||||
|
if isPrevChrSpace (strPos, str, strTl) then
|
||||||
|
helpEndOfPrevWORD
|
||||||
|
(strPos - 1, str, absIdx - 1, strTl, lineTl)
|
||||||
|
else
|
||||||
|
absIdx - 1
|
||||||
|
else
|
||||||
|
helpEndOfPrevWORD
|
||||||
|
(strPos - 1, str, absIdx - 1, strTl, lineTl)
|
||||||
|
end
|
||||||
|
|
||||||
fun startPrevWord (shd, strIdx, absIdx, stl, ltl, fPrev) =
|
fun startPrevWord (shd, strIdx, absIdx, stl, ltl, fPrev) =
|
||||||
(* we want to start iterating from previous character
|
(* we want to start iterating from previous character
|
||||||
* and ignore the character the cursor is at
|
* and ignore the character the cursor is at
|
||||||
@@ -1103,6 +1160,45 @@ struct
|
|||||||
fun prevWORD (lineGap, cursorIdx) =
|
fun prevWORD (lineGap, cursorIdx) =
|
||||||
toPrevWord (lineGap, cursorIdx, helpPrevWORD)
|
toPrevWord (lineGap, cursorIdx, helpPrevWORD)
|
||||||
|
|
||||||
|
fun toEndOfPrevWord (lineGap: LineGap.t, cursorIdx, fPrev) =
|
||||||
|
let
|
||||||
|
val
|
||||||
|
{rightStrings, rightLines, leftStrings, leftLines, idx = bufferIdx, ...} =
|
||||||
|
lineGap
|
||||||
|
in
|
||||||
|
case (rightStrings, rightLines) of
|
||||||
|
(shd :: stl, lhd :: ltl) =>
|
||||||
|
let
|
||||||
|
(* convert absolute cursorIdx to idx relative to hd string *)
|
||||||
|
val strIdx = cursorIdx - bufferIdx
|
||||||
|
in
|
||||||
|
if strIdx < String.size shd then
|
||||||
|
(* strIdx is in this string *)
|
||||||
|
fPrev (strIdx, shd, cursorIdx, leftStrings, leftLines)
|
||||||
|
else
|
||||||
|
(* strIdx is in tl *)
|
||||||
|
(case (stl, ltl) of
|
||||||
|
(stlhd :: stltl, ltlhd :: ltltl) =>
|
||||||
|
let
|
||||||
|
val strIdx = strIdx - String.size shd
|
||||||
|
val leftStrings = shd :: leftStrings
|
||||||
|
val leftLines = lhd :: leftLines
|
||||||
|
in
|
||||||
|
fPrev (strIdx, shd, cursorIdx, leftStrings, leftLines)
|
||||||
|
end
|
||||||
|
| (_, _) => cursorIdx)
|
||||||
|
end
|
||||||
|
| (_, _) => cursorIdx
|
||||||
|
end
|
||||||
|
|
||||||
|
(* equivalent of vi's 'ge' command *)
|
||||||
|
fun endOfPrevWord (lineGap, cursorIdx) =
|
||||||
|
toEndOfPrevWord (lineGap, cursorIdx, helpEndOfPrevWord)
|
||||||
|
|
||||||
|
(* equivalent of vi's 'gE' command *)
|
||||||
|
fun endOfPrevWORD (lineGap, cursorIdx) =
|
||||||
|
toEndOfPrevWord (lineGap, cursorIdx, helpEndOfPrevWORD)
|
||||||
|
|
||||||
fun helpEndOfWord (strPos, str, absIdx, stl, ltl) =
|
fun helpEndOfWord (strPos, str, absIdx, stl, ltl) =
|
||||||
if strPos = String.size str then
|
if strPos = String.size str then
|
||||||
case (stl, ltl) of
|
case (stl, ltl) of
|
||||||
|
|||||||
Reference in New Issue
Block a user