From 7229447ee155e1bc98376c56bcdaed0a3e58ab99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=9F=E9=85=8C=20=E9=B5=AC=E5=85=84?= Date: Sat, 16 Apr 2016 00:51:21 +0800 Subject: [PATCH] UNDO / REDO for line shift --- .../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;