fixed G / gg issue on some cases

This commit is contained in:
斟酌 鵬兄 2016-03-18 08:34:36 +08:00
parent f227c7e16b
commit b17ca21420
1 changed files with 42 additions and 20 deletions

View File

@ -55,6 +55,25 @@
return offset; return offset;
}; };
// Rush cursor to wanted position "d" then get the actual position
var GetRushPos = function( c, d )
{
var line = c.getLine();
var l = c.Y + d;
var i = c.Y;
// First line ( visual ) does not count
if( line != c.feeder.firstBuffer ) i --;
for( ; i < l; line = line.nextLine )
{
if( line.placeholder ) break;
if( line.br ) i ++;
}
return i;
};
var Cursor = function( feeder ) var Cursor = function( feeder )
{ {
/** @type {Components.Vim.LineFeeder} */ /** @type {Components.Vim.LineFeeder} */
@ -151,24 +170,26 @@
Cursor.prototype.moveY = function( d, penentrate ) Cursor.prototype.moveY = function( d, penentrate )
{ {
var i;
var Y = this.Y + d; var Y = this.Y + d;
var feeder = this.feeder;
var line; var line;
if( Y < 0 ) if( Y < 0 )
{ {
this.feeder.pan( undefined, d ); feeder.pan( undefined, d );
this.Y = 0; this.Y = 0;
this.moveX(); this.moveX();
this.updatePosition(); this.updatePosition();
this.feeder.softReset(); feeder.softReset();
return; return;
} }
else if( this.feeder.moreAt < Y ) // More at bottom, start panning
else if( !feeder.EOF && feeder.moreAt < Y )
{ {
var feeder = this.feeder; var feeder = this.feeder;
var i = 0;
if( penentrate ) if( penentrate )
{ {
@ -180,6 +201,8 @@
{ {
feeder.pan( undefined, 1 ); feeder.pan( undefined, 1 );
} }
i = GetRushPos( this, d );
} }
else else
{ {
@ -204,7 +227,6 @@
// The line number cursor need to be in // The line number cursor need to be in
Y = lastLine + lineShift; Y = lastLine + lineShift;
}
// Calculate the visual line position "i" // Calculate the visual line position "i"
for( i = 0, line = feeder.firstBuffer; for( i = 0, line = feeder.firstBuffer;
@ -215,25 +237,25 @@
if( line.lineNum == Y || line.next.placeholder ) break; if( line.lineNum == Y || line.next.placeholder ) break;
} }
}
this.Y = i; this.Y = i;
// Keep original position after panning // Keep original position after panning
this.moveX(); this.moveX();
this.updatePosition(); this.updatePosition();
// Because it is panned, soft reset is needed
feeder.softReset(); feeder.softReset();
return; return;
} }
else if ( 0 < d ) else if ( 0 < d )
{ {
// If panning is forward var line = this.getLine();
// and next line does not exists // If already at bottom
line = this.getLine().nextLine; if( line.nextLine.placeholder ) return;
if( !line || line.placeholder )
{ Y = GetRushPos( this, d );
// do nothing
return;
}
} }
this.Y = Y; this.Y = Y;