From f227c7e16b2b43feb875d8e93adf3d428607b17b 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: Fri, 18 Mar 2016 05:55:04 +0800 Subject: [PATCH] G / gg commands --- botanjs/src/Components/Vim/Cursor.js | 50 ++++++++++++------- botanjs/src/Components/Vim/LineFeeder.js | 4 +- .../src/externs/Components.Vim.LineFeeder.js | 2 + 3 files changed, 38 insertions(+), 18 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; + + 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; } - // 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;