refactoring, and fix bug in 'y^' motion. (When cursor is after first-non-space-character, copy from first-non-space-character to cursor. Otherwise, copy spaces at beginning until first-non-space-character.)
This commit is contained in:
@@ -241,40 +241,21 @@ struct
|
|||||||
|
|
||||||
fun parseYankTerminal (str, count, app, chrCmd, time) =
|
fun parseYankTerminal (str, count, app, chrCmd, time) =
|
||||||
case chrCmd of
|
case chrCmd of
|
||||||
#"y" =>
|
(* motions like yh / yj / yk / yl are not really needed.
|
||||||
let
|
* Vim supports them, but I never use them.
|
||||||
open DrawMsg
|
* I also don't need yx (yank a character and then remove it)
|
||||||
open MailboxType
|
* because I never do that. *)
|
||||||
|
#"y" => NormalYank.yankLine (app, count)
|
||||||
val {buffer, cursorIdx, ...} = app
|
| #"0" => NormalYank.yankToStartOfLine app
|
||||||
|
| #"w" => NormalYank.yankWhenMovingForward (app, Cursor.nextWord, count)
|
||||||
val buffer = LineGap.goToIdx (cursorIdx, buffer)
|
| #"W" => NormalYank.yankWhenMovingForward (app, Cursor.nextWORD, count)
|
||||||
val low = Cursor.vi0 (buffer, cursorIdx)
|
| #"b" => NormalYank.yankWhenMovingBack (app, Cursor.prevWord, count)
|
||||||
|
| #"B" => NormalYank.yankWhenMovingBack (app, Cursor.prevWORD, count)
|
||||||
val buffer = LineGap.goToIdx (low, buffer)
|
| #"e" =>
|
||||||
val high = Cursor.viDlrForDelete (buffer, low, 1)
|
NormalYank.yankWhenMovingForward (app, Cursor.endOfWordForDelete, count)
|
||||||
|
| #"E" =>
|
||||||
val buffer = LineGap.goToIdx (high, buffer)
|
NormalYank.yankWhenMovingForward (app, Cursor.endOfWORDForDelete, count)
|
||||||
val length = high - low
|
| #"$" => NormalYank.yankWhenMovingForward (app, Cursor.viDlr, 1)
|
||||||
val str = LineGap.substring (low, length, buffer)
|
|
||||||
|
|
||||||
val msg = YANK str
|
|
||||||
val mode = NORMAL_MODE ""
|
|
||||||
in
|
|
||||||
NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg])
|
|
||||||
end
|
|
||||||
| #"0" =>
|
|
||||||
let val f = fn (buffer, cursorIdx, _) => Cursor.vi0 (buffer, cursorIdx)
|
|
||||||
in yankWhenMovingBack (app, f, 1)
|
|
||||||
end
|
|
||||||
| #"w" => yankWhenMovingForward (app, Cursor.nextWord, count)
|
|
||||||
| #"W" => yankWhenMovingForward (app, Cursor.nextWORD, count)
|
|
||||||
| #"b" => yankWhenMovingBack (app, Cursor.prevWord, count)
|
|
||||||
| #"B" => yankWhenMovingBack (app, Cursor.prevWORD, count)
|
|
||||||
| #"e" => yankWhenMovingForward (app, Cursor.endOfWordForDelete, count)
|
|
||||||
| #"E" => yankWhenMovingForward (app, Cursor.endOfWORDForDelete, count)
|
|
||||||
|
|
||||||
| #"$" => yankWhenMovingForward (app, Cursor.viDlr, 1)
|
|
||||||
| #"^" =>
|
| #"^" =>
|
||||||
let
|
let
|
||||||
open DrawMsg
|
open DrawMsg
|
||||||
@@ -283,19 +264,36 @@ struct
|
|||||||
val {buffer, cursorIdx, ...} = app
|
val {buffer, cursorIdx, ...} = app
|
||||||
|
|
||||||
val buffer = LineGap.goToIdx (cursorIdx, buffer)
|
val buffer = LineGap.goToIdx (cursorIdx, buffer)
|
||||||
val low = Cursor.vi0 (buffer, cursorIdx)
|
val otherIdx = Cursor.vi0 (buffer, cursorIdx)
|
||||||
|
|
||||||
val buffer = LineGap.goToIdx (low, buffer)
|
val buffer = LineGap.goToIdx (otherIdx, buffer)
|
||||||
val high = Cursor.firstNonSpaceChr (buffer, low)
|
val otherIdx = Cursor.firstNonSpaceChr (buffer, otherIdx)
|
||||||
|
|
||||||
val buffer = LineGap.goToIdx (high, buffer)
|
|
||||||
val length = high - low
|
|
||||||
val str = LineGap.substring (low, length, buffer)
|
|
||||||
|
|
||||||
val msg = YANK str
|
|
||||||
val mode = NORMAL_MODE ""
|
|
||||||
in
|
in
|
||||||
NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg])
|
if cursorIdx > otherIdx then
|
||||||
|
(* yanking backwards from cursorIdx *)
|
||||||
|
let
|
||||||
|
val () = print "272\n"
|
||||||
|
val length = cursorIdx - otherIdx + 1
|
||||||
|
val buffer = LineGap.goToIdx (otherIdx, buffer)
|
||||||
|
|
||||||
|
val str = LineGap.substring (otherIdx, length, buffer)
|
||||||
|
val msg = YANK str
|
||||||
|
val mode = NORMAL_MODE ""
|
||||||
|
in
|
||||||
|
NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg])
|
||||||
|
end
|
||||||
|
else if cursorIdx < otherIdx then
|
||||||
|
(* yanking forward from cursorIdx *)
|
||||||
|
let
|
||||||
|
val length = otherIdx - cursorIdx
|
||||||
|
val str = LineGap.substring (cursorIdx, length, buffer)
|
||||||
|
val msg = YANK str
|
||||||
|
val mode = NORMAL_MODE ""
|
||||||
|
in
|
||||||
|
NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg])
|
||||||
|
end
|
||||||
|
else
|
||||||
|
NormalFinish.clearMode app
|
||||||
end
|
end
|
||||||
| #"G" =>
|
| #"G" =>
|
||||||
let
|
let
|
||||||
|
|||||||
87
fcore/normal-mode/normal-yank.sml
Normal file
87
fcore/normal-mode/normal-yank.sml
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
structure NormalYank =
|
||||||
|
struct
|
||||||
|
open AppType
|
||||||
|
open DrawMsg
|
||||||
|
open MailboxType
|
||||||
|
|
||||||
|
fun yankLine (app: app_type, count) =
|
||||||
|
let
|
||||||
|
open DrawMsg
|
||||||
|
open MailboxType
|
||||||
|
|
||||||
|
val {buffer, cursorIdx, ...} = app
|
||||||
|
|
||||||
|
val buffer = LineGap.goToIdx (cursorIdx, buffer)
|
||||||
|
val low = Cursor.vi0 (buffer, cursorIdx)
|
||||||
|
|
||||||
|
val buffer = LineGap.goToIdx (low, buffer)
|
||||||
|
val high = Cursor.viDlrForDelete (buffer, low, count)
|
||||||
|
|
||||||
|
val buffer = LineGap.goToIdx (high, buffer)
|
||||||
|
val length = high - low
|
||||||
|
val str = LineGap.substring (low, length, buffer)
|
||||||
|
|
||||||
|
val msg = YANK str
|
||||||
|
val mode = NORMAL_MODE ""
|
||||||
|
in
|
||||||
|
NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg])
|
||||||
|
end
|
||||||
|
|
||||||
|
fun yankToStartOfLine (app: app_type) =
|
||||||
|
let
|
||||||
|
open DrawMsg
|
||||||
|
open MailboxType
|
||||||
|
|
||||||
|
val {buffer, cursorIdx, ...} = app
|
||||||
|
|
||||||
|
val buffer = LineGap.goToIdx (cursorIdx, buffer)
|
||||||
|
val low = Cursor.vi0 (buffer, cursorIdx)
|
||||||
|
|
||||||
|
val length = cursorIdx - low
|
||||||
|
val str = LineGap.substring (low, length, buffer)
|
||||||
|
|
||||||
|
val msg = YANK str
|
||||||
|
val mode = NORMAL_MODE ""
|
||||||
|
in
|
||||||
|
NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg])
|
||||||
|
end
|
||||||
|
|
||||||
|
fun yankWhenMovingBack (app: app_type, fMove, count) =
|
||||||
|
let
|
||||||
|
open DrawMsg
|
||||||
|
open MailboxType
|
||||||
|
|
||||||
|
val {buffer, cursorIdx, ...} = app
|
||||||
|
|
||||||
|
val buffer = LineGap.goToIdx (cursorIdx, buffer)
|
||||||
|
val low = fMove (buffer, cursorIdx, count)
|
||||||
|
|
||||||
|
val length = cursorIdx - low
|
||||||
|
val str = LineGap.substring (low, length, buffer)
|
||||||
|
|
||||||
|
val msg = YANK str
|
||||||
|
val mode = NORMAL_MODE ""
|
||||||
|
in
|
||||||
|
NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg])
|
||||||
|
end
|
||||||
|
|
||||||
|
fun yankWhenMovingForward (app: app_type, fMove, count) =
|
||||||
|
let
|
||||||
|
open DrawMsg
|
||||||
|
open MailboxType
|
||||||
|
|
||||||
|
val {buffer, cursorIdx, ...} = app
|
||||||
|
|
||||||
|
val buffer = LineGap.goToIdx (cursorIdx, buffer)
|
||||||
|
val high = fMove (buffer, cursorIdx, count)
|
||||||
|
|
||||||
|
val buffer = LineGap.goToIdx (high, buffer)
|
||||||
|
val length = high - cursorIdx
|
||||||
|
val str = LineGap.substring (cursorIdx, length, buffer)
|
||||||
|
|
||||||
|
val msg = YANK str
|
||||||
|
val mode = NORMAL_MODE ""
|
||||||
|
in
|
||||||
|
NormalModeWith.modeAndBuffer (app, buffer, mode, [DRAW msg])
|
||||||
|
end
|
||||||
|
end
|
||||||
1
shf.mlb
1
shf.mlb
@@ -45,6 +45,7 @@ fcore/normal-mode/normal-search-finish.sml
|
|||||||
fcore/move.sml
|
fcore/move.sml
|
||||||
|
|
||||||
fcore/normal-mode/normal-move.sml
|
fcore/normal-mode/normal-move.sml
|
||||||
|
fcore/normal-mode/normal-yank.sml
|
||||||
fcore/normal-mode/normal-delete.sml
|
fcore/normal-mode/normal-delete.sml
|
||||||
fcore/normal-mode/normal-mode.sml
|
fcore/normal-mode/normal-mode.sml
|
||||||
fcore/normal-mode/normal-search-mode.sml
|
fcore/normal-mode/normal-search-mode.sml
|
||||||
|
|||||||
Reference in New Issue
Block a user