UNDO / REDO for line shift

This commit is contained in:
斟酌 鵬兄 2016-04-16 00:51:21 +08:00
parent 78cb3d3610
commit 7229447ee1
1 changed files with 42 additions and 3 deletions

View File

@ -5,6 +5,8 @@
var debug = __import( "System.Debug" ); var debug = __import( "System.Debug" );
var beep = __import( "Components.Vim.Beep" ); var beep = __import( "Components.Vim.Beep" );
/** @type {Components.Vim.State.Stator} */
var Stator = __import( "Components.Vim.State.Stator" );
/** @type {Components.Vim.State.Stack} */ /** @type {Components.Vim.State.Stack} */
var Stack = __import( "Components.Vim.State.Stack" ); var Stack = __import( "Components.Vim.State.Stack" );
@ -174,10 +176,13 @@
debug.Info( "Start: " + start, "End: " + end ); debug.Info( "Start: " + start, "End: " + end );
var rBlock = ""; var rBlock = "";
var nLen = 0;
var started = false; var started = false;
var indentTimes = 1; var indentTimes = 1;
var recStart = 0;
feeder.content = ""; feeder.content = "";
nline = 0; nline = 0;
@ -190,19 +195,28 @@
{ {
started = true; started = true;
feeder.content = c.substring( 0, i - 1 ); feeder.content = c.substring( 0, i - 1 );
recStart = feeder.content.length;
} }
if( end < j ) break; if( end < j ) break;
var line = c.substring( 1 < i ? i : i - 1, c.indexOf( "\n", i ) ); var line = c.substring( 1 < i ? i : i - 1, c.indexOf( "\n", i ) );
if( 1 < i ) feeder.content += "\n"; if( 1 < i )
{
feeder.content += "\n";
rBlock += "\n";
nLen ++;
}
rBlock += line;
if( line !== "" ) if( line !== "" )
{ {
var indentedLine;
if( 0 < dir ) if( 0 < dir )
{ {
feeder.content += indentChar + line; indentedLine = indentChar + line;
} }
else else
{ {
@ -219,15 +233,40 @@
else if( startC != "\t" ) break; else if( startC != "\t" ) break;
} }
feeder.content += line.substring( si + sj - 1 ); indentedLine = line.substring( si + sj - 1 );
} }
feeder.content += indentedLine;
nLen += indentedLine.length;
nline ++; nline ++;
} }
} }
var nPos = feeder.content.length;
feeder.content += "\n" + c.substring( i ) + "\n"; feeder.content += "\n" + c.substring( i ) + "\n";
feeder.pan(); feeder.pan();
cur.moveTo( nPos );
var stator = new Stator( cur, recStart );
var stack = new Stack();
recStart ++;
for( ; ~"\t ".indexOf( feeder.content[ recStart ] ); recStart ++ );
var f = stator.save( nLen, rBlock );
stack.store( function() {
f();
// Offset correction after REDO / UNDO
cur.moveTo( recStart );
cur.lineStart();
} );
cur.moveTo( recStart );
cur.rec.record( stack );
this.__msg = Mesg( "LINES_SHIFTED", nline, dir < 0 ? "<" : ">", 1 ); this.__msg = Mesg( "LINES_SHIFTED", nline, dir < 0 ? "<" : ">", 1 );
return Triggered; return Triggered;