commit 7229447ee155e1bc98376c56bcdaed0a3e58ab99
| author | 斟酌 鵬兄 <tgckpg@gmail.com> |
| date | 2016-04-15T16:51:21Z |
| subject | UNDO / REDO for line shift |
commit 7229447ee155e1bc98376c56bcdaed0a3e58ab99
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date: 2016-04-15T16:51:21Z
UNDO / REDO for line shift
---
botanjs/src/Components/Vim/Actions/SHIFT_LINES.js | 45 +++++++++++++++++++++--
1 file changed, 42 insertions(+), 3 deletions(-)
diff --git a/botanjs/src/Components/Vim/Actions/SHIFT_LINES.js b/botanjs/src/Components/Vim/Actions/SHIFT_LINES.js
index a539c17..650c68e 100644
--- a/botanjs/src/Components/Vim/Actions/SHIFT_LINES.js
+++ b/botanjs/src/Components/Vim/Actions/SHIFT_LINES.js
@@ -5,6 +5,8 @@
var debug = __import( "System.Debug" );
var beep = __import( "Components.Vim.Beep" );
+ /** @type {Components.Vim.State.Stator} */
+ var Stator = __import( "Components.Vim.State.Stator" );
/** @type {Components.Vim.State.Stack} */
var Stack = __import( "Components.Vim.State.Stack" );
@@ -174,10 +176,13 @@
debug.Info( "Start: " + start, "End: " + end );
var rBlock = "";
+ var nLen = 0;
var started = false;
var indentTimes = 1;
+ var recStart = 0;
+
feeder.content = "";
nline = 0;
@@ -190,19 +195,28 @@
{
started = true;
feeder.content = c.substring( 0, i - 1 );
+ recStart = feeder.content.length;
}
if( end < j ) break;
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 !== "" )
{
+ var indentedLine;
if( 0 < dir )
{
- feeder.content += indentChar + line;
+ indentedLine = indentChar + line;
}
else
{
@@ -219,15 +233,40 @@
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 ++;
}
}
+ var nPos = feeder.content.length;
feeder.content += "\n" + c.substring( i ) + "\n";
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 );
return Triggered;