Partial nav of "jkhl$^"

This commit is contained in:
斟酌 鵬兄 2016-03-13 20:26:26 +08:00
parent 751530b42d
commit 2548970f3a
5 changed files with 129 additions and 52 deletions

View File

@ -37,42 +37,39 @@
/** @type {Components.Vim.LineBuffer} */ /** @type {Components.Vim.LineBuffer} */
var offset = 0; var offset = 0;
LineLoop:
for( var i = 0, line = buffs[0]; for( var i = 0, line = buffs[0];
line && i < l; i ++ ) line && i < l; i ++ )
{ {
while( line ) while( line )
{ {
if( line.br ) if( line.next && line.next.placeholder )
break LineLoop;
if( line.next && line.next.br )
{ {
offset += line.prev.toString().length + 1; offset += line.toString().length + 1;
// Empty line has a special space
if( line.content == "" ) offset ++;
line = line.next; line = line.next;
break; break;
} }
else else
{ {
if( offset == 0 ) offset -= 1; offset += line.cols + 1;
if( line.next && !line.next.br )
offset += line.cols + 1;
} }
line = line.next; line = line.next;
} }
} }
debug.Info( offset );
return offset; return offset;
}; };
var Cursor = function( buffs ) var Cursor = function( feeder )
{ {
this.buffers = buffs; /** @type {Components.Vim.LineFeeder} */
this.cols = buffs[0].cols; this.feeder = feeder;
this.cols = feeder.lineBuffers[0].cols;
// The preferred X position // The preferred X position
this.pX = 0; this.pX = 0;
@ -98,7 +95,7 @@
if( !d ) d = 1; if( !d ) d = 1;
var buffs = this.buffers; var buffs = this.feeder.lineBuffers;
/** @type {Components.Vim.LineBuffer} */ /** @type {Components.Vim.LineBuffer} */
var line = GetLine( buffs, this.Y ); var line = GetLine( buffs, this.Y );
@ -133,18 +130,34 @@
Cursor.prototype.lineEnd = function() Cursor.prototype.lineEnd = function()
{ {
/** @type {Components.Vim.LineBuffer} */
this.moveX( Number.MAX_VALUE ); this.moveX( Number.MAX_VALUE );
}; };
Cursor.prototype.updatePosition = function() Cursor.prototype.updatePosition = function()
{ {
this.P = this.X + LineOffset( this.buffers, this.Y ); this.P = this.X + LineOffset( this.feeder.lineBuffers, this.Y );
}; };
Cursor.prototype.moveY = function( d ) Cursor.prototype.moveY = function( d )
{ {
this.Y += d; var Y = this.Y;
Y += d;
if( Y < 0 ) Y = 0;
if( this.feeder.moreAt < Y )
{
this.feeder.pan( undefined, Y - this.feeder.moreAt );
// Keep original position after panning
this.moveX();
this.updatePosition();
this.refresh();
return;
}
this.Y = Y;
this.moveX(); this.moveX();
this.updatePosition(); this.updatePosition();
}; };

View File

@ -24,7 +24,6 @@
{ {
nextLineBuffer.prev = this; nextLineBuffer.prev = this;
} }
}; };
LineBuffer.prototype.Push = function( content, wrap ) LineBuffer.prototype.Push = function( content, wrap )
@ -32,6 +31,7 @@
if( content == undefined || content === "" ) if( content == undefined || content === "" )
{ {
this.content = "~"; this.content = "~";
this.br = true;
this.placeholder = true; this.placeholder = true;
if( this.next ) this.next.Push( content, wrap ); if( this.next ) this.next.Push( content, wrap );
return; return;

View File

@ -29,10 +29,18 @@
lineBuffers[i] = new LineBuffer( cols, lineBuffers[ i + 1 ] ); lineBuffers[i] = new LineBuffer( cols, lineBuffers[ i + 1 ] );
} }
this.cursor = new Cursor( lineBuffers );
this.lineBuffers = lineBuffers; this.lineBuffers = lineBuffers;
this.panX = 0;
this.panY = 0;
this.setRender(); this.setRender();
this.cursor = new Cursor( this );
this.dispatcher = new EventDispatcher();
this.__clseLine = null;
this.__moreAt = -1;
}; };
Feeder.prototype.init = function( content, wrap ) Feeder.prototype.init = function( content, wrap )
@ -52,38 +60,35 @@
{ {
if( placeholder == undefined ) placeholder = true; if( placeholder == undefined ) placeholder = true;
if( placeholder ) var _self = this;
{
this.__render = function( line, steps )
{
var display = ( line == undefined ? "" : line ) + "";
for( var i = 0; var placeholdCond = placeholder
line && i < steps && ( line = line.next ); ? function( line ) { return true; }
i ++ ) : function( line ) { return !line.placeholder; }
;
this.__render = function( line, steps )
{
var display = ( line == undefined ? "" : line ) + "";
var atSpace = false
for( var i = 0;
line && i < steps && ( line = line.next ) && placeholdCond( line );
i ++ )
{
if( atSpace || ( line.br && steps < ( i + line.visualLines.length ) ) )
{ {
display += "\n" + line; if( !atSpace ) _self.__clseLine = line;
atSpace = true;
display += "\n@";
continue;
} }
return display; display += "\n" + line;
}; }
}
else
{
this.__render = function( line, steps )
{
var display = ( line == undefined ? "" : line ) + "";
for( var i = 0; return display;
line && i < steps && ( line = line.next ) && !line.placeholder; };
i ++ )
{
display += "\n" + line;
}
return display;
};
}
} }
Feeder.prototype.render = function( start, length ) Feeder.prototype.render = function( start, length )
@ -101,6 +106,43 @@
return this.__render( buffs[ start ], length - 1 ); return this.__render( buffs[ start ], length - 1 );
}; };
Feeder.prototype.pan = function( dX, dY )
{
if( dX == undefined ) dX = 0;
if( dY == undefined ) dY = 0;
var X = this.panX + dX;
var Y = this.panY + dY;
// this.dispatcher.dispatchEvent( new BotanEvent( "VisualUpdate" ) );
};
__readOnly( Feeder.prototype, "moreAt", function() {
if( 0 < this.__moreAt ) return this.__moreAt;
var line = this.lineBuffers[0];
if( line.placeholder ) return 0;
var i = 0;
do
{
if( this.__clseLine == line ) break;
if( line.br ) i ++;
}
while( line = line.next );
return ( this.__moreAt = i );
} );
__readOnly( Feeder.prototype, "lineStat", function() {
var X = this.cursor.X;
return ( this.cursor.Y + this.panY + 1 ) + "," + X + "-" + ( X );
} );
__readOnly( Feeder.prototype, "docPos", function() {
return "Top";
} );
__readOnly( Feeder.prototype, "linesOccupied", function() { __readOnly( Feeder.prototype, "linesOccupied", function() {
var line = this.lineBuffers[0]; var line = this.lineBuffers[0];
if( line.placeholder ) return 0; if( line.placeholder ) return 0;

View File

@ -52,6 +52,7 @@
{ {
// Cursor movements // Cursor movements
case 72: // h case 72: // h
case 8: // Backspace
cfeeder.cursor.moveX( -1 ); cfeeder.cursor.moveX( -1 );
break; break;
case 74: // j case 74: // j
@ -86,6 +87,14 @@
case 112: // F1, help case 112: // F1, help
} }
var sfeeder = sender.statusFeeder;
var statusBar = sender.statusBar;
sfeeder.init( statusBar.statusText );
sender.stage.element.value =
cfeeder.render( 0, sender.rows - sfeeder.linesOccupied )
+ "\n" + sfeeder.render();
sender.__blink = false; sender.__blink = false;
sender.select( cfeeder.cursor.position ); sender.select( cfeeder.cursor.position );
}; };
@ -112,7 +121,13 @@
this.PosX = 1; this.PosX = 1;
this.PosY = 1; this.PosY = 1;
this.__active = false;
var _self = this;
stage.addEventListener( "KeyDown", KeyHandler( this, VimControls ) ); stage.addEventListener( "KeyDown", KeyHandler( this, VimControls ) );
stage.addEventListener( "Focus", function() { _self.__active = true; } );
stage.addEventListener( "Blur", function() { _self.__active = false; } );
// Init // Init
this.content = element.value; this.content = element.value;
@ -125,6 +140,7 @@
VimArea.prototype.select = function( sel ) VimArea.prototype.select = function( sel )
{ {
if( !this.__active ) return;
var textarea = this.stage.element; var textarea = this.stage.element;
if( sel ) if( sel )
@ -154,12 +170,12 @@
// XXX: Placeholder // XXX: Placeholder
var statusBar = new StatusBar( c ); var statusBar = new StatusBar( c );
statusBar.stamp( -18, function(){ statusBar.stamp( -18, function(){
return "1,1-1"; return cfeeder.lineStat;
}); });
statusBar.stamp( -3, function(){ statusBar.stamp( -3, function(){
return "All"; return cfeeder.docPos;
}); } );
sfeeder.init( statusBar.statusText ); sfeeder.init( statusBar.statusText );
@ -167,8 +183,13 @@
cfeeder.render( 0, r - sfeeder.linesOccupied ) cfeeder.render( 0, r - sfeeder.linesOccupied )
+ "\n" + sfeeder.render(); + "\n" + sfeeder.render();
cfeeder.dispatcher.addEventListener( "VisualUpdate", function()
{
} );
this.contentFeeder = cfeeder; this.contentFeeder = cfeeder;
this.statusFeeder = sfeeder; this.statusFeeder = sfeeder;
this.statusBar = statusBar;
this.__cursor = cfeeder.cursor; this.__cursor = cfeeder.cursor;

View File

@ -16,6 +16,7 @@
"INSERT": "-- INSERT --" "INSERT": "-- INSERT --"
, "REPLACE": "-- REPLACE --" , "REPLACE": "-- REPLACE --"
, "MORE": "-- MORE --" , "MORE": "-- MORE --"
, "VISLINE": "-- VISUAL LINE --"
, "WRITE": "\"%1\" %2L, %3C written" , "WRITE": "\"%1\" %2L, %3C written"
, "CONTINUE": "Press ENTER or type command to continue" , "CONTINUE": "Press ENTER or type command to continue"
, "SEARCH_HIT_BOTTOM": "Seach hit BOTTOM, contining at TOP" , "SEARCH_HIT_BOTTOM": "Seach hit BOTTOM, contining at TOP"