commit f227c7e16b2b43feb875d8e93adf3d428607b17b
| author | 斟酌 鵬兄 <tgckpg@gmail.com> |
| date | 2016-03-17T21:55:04Z |
| subject | G / 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;