forked from Botanical/BotanJS
Rewrite moveX function
This commit is contained in:
parent
af2da6e023
commit
a927c90134
@ -44,9 +44,13 @@
|
|||||||
var feeder = cur.feeder;
|
var feeder = cur.feeder;
|
||||||
|
|
||||||
var newLine = cput.newLine;
|
var newLine = cput.newLine;
|
||||||
|
|
||||||
|
// Compensation
|
||||||
|
var c = e.kMap( "P" ) ? 0 : -1;
|
||||||
|
|
||||||
if( newLine )
|
if( newLine )
|
||||||
{
|
{
|
||||||
cur.moveY( 1 );
|
cur.moveY( -c );
|
||||||
cur.lineStart();
|
cur.lineStart();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,7 +73,7 @@
|
|||||||
stack.store( function()
|
stack.store( function()
|
||||||
{
|
{
|
||||||
f();
|
f();
|
||||||
cur.moveY( -1 );
|
cur.moveY( c );
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -36,10 +36,20 @@
|
|||||||
VISUAL.prototype.dispose = function()
|
VISUAL.prototype.dispose = function()
|
||||||
{
|
{
|
||||||
this.__msg = this.__leaveMesg;
|
this.__msg = this.__leaveMesg;
|
||||||
this.__cursor.blink = true;
|
var c = this.__cursor;
|
||||||
this.__cursor.pSpace = false;
|
|
||||||
this.__cursor.PStart = this.__selStart;
|
c.blink = true;
|
||||||
this.__cursor.PEnd = this.__selStart + 1;
|
c.pSpace = false;
|
||||||
|
c.PStart = this.__selStart;
|
||||||
|
c.PEnd = this.__selStart + 1;
|
||||||
|
|
||||||
|
// This fix the highlighting position of missing phantomSpace
|
||||||
|
// for maximum filled line
|
||||||
|
if( c.feeder.wrap )
|
||||||
|
{
|
||||||
|
c.moveX( -1 );
|
||||||
|
c.moveX( 1 );
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
VISUAL.prototype.handler = function( e, done )
|
VISUAL.prototype.handler = function( e, done )
|
||||||
|
@ -396,6 +396,7 @@
|
|||||||
}, _8 );
|
}, _8 );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SLASH: // "/" Seach movement
|
||||||
case SLASH: // "/" Seach movement
|
case SLASH: // "/" Seach movement
|
||||||
this.__cMovement = true;
|
this.__cMovement = true;
|
||||||
break;
|
break;
|
||||||
@ -443,7 +444,15 @@
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( ccur.action.allowMovement )
|
if( ccur.action.allowMovement )
|
||||||
|
{
|
||||||
|
var SubCommand = !this.__compositeReg;
|
||||||
this.__cursorCommand( e, kCode );
|
this.__cursorCommand( e, kCode );
|
||||||
|
if( SubCommand && this.__compositeReg )
|
||||||
|
{
|
||||||
|
e.preventDefault();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( ccur.action.handler( e ) )
|
if( ccur.action.handler( e ) )
|
||||||
{
|
{
|
||||||
|
@ -83,6 +83,9 @@
|
|||||||
this.pSpace = false;
|
this.pSpace = false;
|
||||||
|
|
||||||
this.__suppEvt = 0;
|
this.__suppEvt = 0;
|
||||||
|
|
||||||
|
// Offset compensation for max filled wrapped line
|
||||||
|
this.__off = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set by VimArea
|
// Set by VimArea
|
||||||
@ -118,6 +121,8 @@
|
|||||||
var jumpY = expLineNum - lastLineNum;
|
var jumpY = expLineNum - lastLineNum;
|
||||||
var jumpX = aPos < lineStart ? lineStart - aPos : aPos - lineStart;
|
var jumpX = aPos < lineStart ? lineStart - aPos : aPos - lineStart;
|
||||||
|
|
||||||
|
jumpX += Math.ceil( jumpX / pline.cols ) - 1;
|
||||||
|
|
||||||
if( jumpY ) this.moveY( jumpY );
|
if( jumpY ) this.moveY( jumpY );
|
||||||
if( 0 < this.getLine().lineNum && lineStart <= aPos ) jumpX --;
|
if( 0 < this.getLine().lineNum && lineStart <= aPos ) jumpX --;
|
||||||
|
|
||||||
@ -130,13 +135,19 @@
|
|||||||
Cursor.prototype.moveX = function( d, penetrate, phantomSpace )
|
Cursor.prototype.moveX = function( d, penetrate, phantomSpace )
|
||||||
{
|
{
|
||||||
var x = this.pX;
|
var x = this.pX;
|
||||||
|
if( 0 < this.__off )
|
||||||
|
{
|
||||||
|
d += this.__off;
|
||||||
|
this.__off = 0;
|
||||||
|
}
|
||||||
|
|
||||||
var updatePx = Boolean( d );
|
var updatePx = Boolean( d );
|
||||||
if( updatePx ) x = this.X + d;
|
if( updatePx ) x = this.X + d;
|
||||||
|
|
||||||
if( !d ) d = 1;
|
if( !d ) d = 1;
|
||||||
|
|
||||||
var buffs = this.feeder.lineBuffers;
|
var feeder = this.feeder;
|
||||||
|
var buffs = feeder.lineBuffers;
|
||||||
|
|
||||||
if( penetrate )
|
if( penetrate )
|
||||||
{
|
{
|
||||||
@ -153,23 +164,61 @@
|
|||||||
var content = line.visualLines.join( "\n" );
|
var content = line.visualLines.join( "\n" );
|
||||||
var cLen = content.length;
|
var cLen = content.length;
|
||||||
|
|
||||||
|
var lineEnd = 0;
|
||||||
|
var hasPhantomSpace = true;
|
||||||
|
|
||||||
|
// Empty lines has length of 1
|
||||||
|
// If length larger than a, need to compensate the lineEnd
|
||||||
|
// for phantomSpace
|
||||||
|
if( 1 < cLen )
|
||||||
|
{
|
||||||
|
// Begin check if whether this line contains phantomSpace
|
||||||
|
var lineNum = line.lineNum - 1;
|
||||||
|
var str = feeder.content;
|
||||||
|
for( var i = str.indexOf( "\n" ), j = 0; 0 <= i; i = str.indexOf( "\n", i ), j ++ )
|
||||||
|
{
|
||||||
|
if( lineNum == j ) break;
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( j == 0 && i == -1 ) i = 0;
|
||||||
|
|
||||||
|
var end = str.indexOf( "\n", i + 1 );
|
||||||
|
end = end == -1 ? str.length : end;
|
||||||
|
|
||||||
|
// Actual LineLength
|
||||||
|
var hasPhantomSpace = 0 < ( end - i - 1 ) % line.cols;
|
||||||
|
|
||||||
|
if( hasPhantomSpace )
|
||||||
|
{
|
||||||
|
lineEnd = phantomSpace ? cLen - 1 : cLen - 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lineEnd = phantomSpace ? cLen : cLen - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var c = content[ x ];
|
var c = content[ x ];
|
||||||
|
|
||||||
// Motion includes empty lines before cursor end
|
// Whether x is at line boundary
|
||||||
if( ( phantomSpace && cLen - 1 <= x ) || ( cLen == 1 && c == undefined ) )
|
var boundary = c == undefined || ( cLen == x + 1 && c == " " );
|
||||||
|
|
||||||
|
if( boundary )
|
||||||
{
|
{
|
||||||
x = 0 < d ? cLen - 1 : 0;
|
x = 0 < d ? lineEnd : 0;
|
||||||
}
|
|
||||||
// ( 2 < cLen ) motion excludes empty lines at cursor end
|
|
||||||
else if( ( 2 <= cLen && x == cLen - 1 && c == " " ) || c == undefined )
|
|
||||||
{
|
|
||||||
x = 0 < d ? cLen - 2 : 0;
|
|
||||||
}
|
}
|
||||||
else if( c == "\n" )
|
else if( c == "\n" )
|
||||||
{
|
{
|
||||||
x += d;
|
x += d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Wordwrap phantomSpace movement compensation on max filled lines
|
||||||
|
if( feeder.wrap && boundary && !hasPhantomSpace && phantomSpace )
|
||||||
|
{
|
||||||
|
this.__off = 1;
|
||||||
|
}
|
||||||
|
|
||||||
this.X = x;
|
this.X = x;
|
||||||
|
|
||||||
if( updatePx )
|
if( updatePx )
|
||||||
@ -177,6 +226,7 @@
|
|||||||
this.pX = x;
|
this.pX = x;
|
||||||
this.updatePosition();
|
this.updatePosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Cursor.prototype.lineStart = function()
|
Cursor.prototype.lineStart = function()
|
||||||
@ -193,10 +243,11 @@
|
|||||||
|
|
||||||
Cursor.prototype.updatePosition = function()
|
Cursor.prototype.updatePosition = function()
|
||||||
{
|
{
|
||||||
var P = this.X + LineOffset( this.feeder.lineBuffers, this.Y );
|
var feeder = this.feeder;
|
||||||
|
var P = this.X + LineOffset( feeder.lineBuffers, this.Y ) + this.__off;
|
||||||
|
|
||||||
this.PStart = P;
|
this.PStart = P;
|
||||||
this.PEnd = P + 1;
|
this.PEnd = P + 1;
|
||||||
this.__p = P;
|
|
||||||
|
|
||||||
this.__visualUpdate();
|
this.__visualUpdate();
|
||||||
};
|
};
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
var debug = __import( "System.Debug" );
|
var debug = __import( "System.Debug" );
|
||||||
|
|
||||||
|
var occurence = __import( "System.utils.Perf.CountSubstr" );
|
||||||
|
|
||||||
var LineBuffer = function( cols, nextLineBuffer )
|
var LineBuffer = function( cols, nextLineBuffer )
|
||||||
{
|
{
|
||||||
this.prev = null;
|
this.prev = null;
|
||||||
@ -60,6 +62,12 @@
|
|||||||
|
|
||||||
line += c;
|
line += c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( !br && i == this.cols && content[i] == "\n" )
|
||||||
|
{
|
||||||
|
i ++;
|
||||||
|
br = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -97,7 +105,8 @@
|
|||||||
|
|
||||||
LineBuffer.prototype.toString = function()
|
LineBuffer.prototype.toString = function()
|
||||||
{
|
{
|
||||||
if( this.content.length < this.cols )
|
var c = this.cols - occurence( this.content, "\t" ) * ( this.tabWidth - 1 );
|
||||||
|
if( this.content.length < c )
|
||||||
{
|
{
|
||||||
return this.content + " ";
|
return this.content + " ";
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user