penguin/AstroJS

Javascript framework for my blog

commit f227c7e16b2b43feb875d8e93adf3d428607b17b

author斟酌 鵬兄 <tgckpg@gmail.com>
date2016-03-17T21:55:04Z
subjectG / gg commands
commit f227c7e16b2b43feb875d8e93adf3d428607b17b
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2016-03-17T21:55:04Z

    G / gg commands
---
 botanjs/src/Components/Vim/Cursor.js             | 48 ++++++++++++++++--------
 botanjs/src/Components/Vim/LineFeeder.js         |  4 +-
 botanjs/src/externs/Components.Vim.LineFeeder.js |  2 +
 3 files changed, 37 insertions(+), 17 deletions(-)

diff --git a/botanjs/src/Components/Vim/Cursor.js b/botanjs/src/Components/Vim/Cursor.js
index fc3d4e1..09765b1 100644
--- a/botanjs/src/Components/Vim/Cursor.js
+++ b/botanjs/src/Components/Vim/Cursor.js
@@ -168,29 +168,45 @@
 		else if( this.feeder.moreAt < Y )
 		{
 			var feeder = this.feeder;
-			var lastLine = feeder.lastBuffer.lineNum;
-			var lineShift = Y - feeder.moreAt;
-
 			var i = 0;
-			while( !feeder.EOF )
-			{
-				feeder.pan( undefined, lineShift + i );
 
-				// if it turns out to be the same line
-				// before after panning
-				// we keep scrolling it ( panning )
-				// until the entire line cosumes the screen
-				if( feeder.lastBuffer.lineNum == lastLine )
+			if( penentrate )
+			{
+				feeder.pan( undefined, Y - moreAt );
+			}
+			else if( feeder.linesTotal < Y )
+			{
+				while( !feeder.EOF )
 				{
-					i ++;
+					feeder.pan( undefined, 1 );
 				}
-				else break;
 			}
+			else
+			{
+				var lastLine = feeder.lastBuffer.lineNum;
+				var lineShift = Y - feeder.moreAt;
 
-			// The line number cursor need to be in
-			Y = lastLine + lineShift;
+				i = lineShift;
+				while( !feeder.EOF )
+				{
+					feeder.pan( undefined, i );
+
+					// if it turns out to be the same line
+					// before after panning
+					// we keep scrolling it ( panning )
+					// until the entire line cosumes the screen
+					if( feeder.lastBuffer.lineNum == lastLine )
+					{
+						i ++;
+					}
+					else break;
+				}
+
+				// The line number cursor need to be in
+				Y = lastLine + lineShift;
+			}
 
-			// Calculate the visual line position
+			// Calculate the visual line position "i"
 			for( i = 0, line = feeder.firstBuffer;
 				line != feeder.lastBuffer;
 				line = line.next )
diff --git a/botanjs/src/Components/Vim/LineFeeder.js b/botanjs/src/Components/Vim/LineFeeder.js
index 3d0ca71..7bedae0 100644
--- a/botanjs/src/Components/Vim/LineFeeder.js
+++ b/botanjs/src/Components/Vim/LineFeeder.js
@@ -9,6 +9,8 @@
 	/** @type {Components.Vim.Cursor} */
 	var Cursor = ns[ NS_INVOKE ]( "Cursor" );
 
+	var occurence = __import( "System.utils.Perf.CountSubstr" );
+
 	var Feeder = function( rows, cols )
 	{
 		var lineBuffers = [];
@@ -170,7 +172,7 @@
 	};
 
 	__readOnly( Feeder.prototype, "linesTotal", function() {
-		return this.content.match( "\n" );
+		return occurence( this.content, "\n" );
 	} );
 
 	__readOnly( Feeder.prototype, "firstBuffer", function() {
diff --git a/botanjs/src/externs/Components.Vim.LineFeeder.js b/botanjs/src/externs/Components.Vim.LineFeeder.js
index 1730d42..eb500db 100644
--- a/botanjs/src/externs/Components.Vim.LineFeeder.js
+++ b/botanjs/src/externs/Components.Vim.LineFeeder.js
@@ -37,6 +37,8 @@ Components.Vim.LineFeeder.panY;
 /** @type Number */
 Components.Vim.LineFeeder.moreAt;
 /** @type Number */
+Components.Vim.LineFeeder.linesTotal;
+/** @type Number */
 Components.Vim.LineFeeder.linesOccupied;
 /** @type String */
 Components.Vim.LineFeeder.docPos;