Visual viw, viw{bracket}, Ctrl+f, Ctcl+b

This commit is contained in:
斟酌 鵬兄 2016-03-31 02:25:39 +08:00
parent 030fb3226b
commit 553cab9776
7 changed files with 139 additions and 61 deletions

View File

@ -41,7 +41,10 @@
var feeder = cur.feeder; var feeder = cur.feeder;
var Triggered = false; var Triggered = false;
if( sp == undefined && this.__startX != cur.aPos )
if( sp == undefined )
{
if( this.__startX != cur.aPos )
{ {
Triggered = true; Triggered = true;
@ -52,8 +55,8 @@
sp = this.__startX; sp = this.__startX;
} }
else if( sp == undefined ) return; else return;
}
var c = feeder.content; var c = feeder.content;

View File

@ -27,7 +27,6 @@
/** @type {Components.Vim.Cursor} */ /** @type {Components.Vim.Cursor} */
this.__cursor = Cursor; this.__cursor = Cursor;
this.__startaP = Cursor.aPos; this.__startaP = Cursor.aPos;
this.__startP = { x: Cursor.X, y: Cursor.Y, p: Cursor.P };
this.__start = Cursor.PStart; this.__start = Cursor.PStart;
this.__selStart = Cursor.PStart; this.__selStart = Cursor.PStart;
}; };
@ -71,10 +70,9 @@
// to keep the cursor position as the top on UNDO / REDO // to keep the cursor position as the top on UNDO / REDO
if( Action.constructor == DELETE && this.__startaP < cur.aPos ) if( Action.constructor == DELETE && this.__startaP < cur.aPos )
{ {
this.__startaP = cur.aPos; var o = cur.aPos;
cur.X = this.__startP.x; cur.moveTo( this.__startaP, true );
cur.Y = this.__startP.y; this.__startaP = o;
cur.P = this.__startP.p;
} }
Action.handler( e, this.__startaP ); Action.handler( e, this.__startaP );
@ -97,12 +95,12 @@
if( cur.aPos == this.__startaP ) if( cur.aPos == this.__startaP )
{ {
cur.moveX( r.open - this.__startaP ); cur.moveTo( r.open, true );
this.__reset( cur ); this.__reset( cur );
} }
cur.unsuppressEvent(); cur.unsuppressEvent();
cur.moveX( r.close - cur.aPos ); cur.moveTo( r.close, true );
} }
var prevPos = this.__start; var prevPos = this.__start;

View File

@ -257,6 +257,8 @@
} }
var ccur = this.__ccur; var ccur = this.__ccur;
var vima = this.__vimArea;
var cfeeder = ccur.feeder;
var cursorHandled = true; var cursorHandled = true;
switch( kCode ) switch( kCode )
@ -267,6 +269,29 @@
case K: this.__cMoveY( -1 ); break; // Up case K: this.__cMoveY( -1 ); break; // Up
case J: this.__cMoveY( 1 ); break; // Down case J: this.__cMoveY( 1 ); break; // Down
case CTRL + F: // Page Down
if( cfeeder.firstBuffer.next.placeholder )
{
beep();
break;
}
var oPan = cfeeder.panY;
cfeeder.pan( undefined, vima.rows - 1 );
ccur.moveY( -ccur.Y );
break;
case CTRL + B: // Page Up
if( cfeeder.panY == 0 )
{
beep();
break;
}
cfeeder.pan( undefined, -vima.rows + 1 );
ccur.moveY( -ccur.Y );
if( !cfeeder.EOF ) ccur.moveY( cfeeder.moreAt );
break;
case SHIFT + H: // First line buffer case SHIFT + H: // First line buffer
break; break;
case SHIFT + L: // Last line buffer case SHIFT + L: // Last line buffer
@ -313,29 +338,33 @@
var analyzer = this.__vimArea.contentAnalyzer; var analyzer = this.__vimArea.contentAnalyzer;
this.__cMovement = true; this.__cMovement = true;
// Word boundary // Word boundary
this.__comp( e, function( e2 ) { this.__comp( e, function( e2 ) {
var WordMatch = analyzer.wordAt( ccur.aPos ); var WordMatch = analyzer.wordAt( ccur.aPos );
debug.Info( "Word: "
+ ccur.feeder.content.substring( WordMatch.open, WordMatch.close + 1 )
);
e2.__range = WordMatch; e2.__range = WordMatch;
}, W ); }, W );
this.__comp( e, function(){
debug.Info( "Bracket boundary [" ); var bracket = function( e2 ) {
}, S_BRACKET_L ); var BracketMatch = analyzer.bracketIn( "(", ccur.aPos );
this.__comp( e, function(){ e2.__range = BracketMatch;
debug.Info( "Bracket boundary ]" ); };
}, S_BRACKET_R ); var curlyBracket = function( e2 ) {
this.__comp( e, function(){ var BracketMatch = analyzer.bracketIn( "{", ccur.aPos );
debug.Info( "Bracket boundary {" ); e2.__range = BracketMatch;
}, SHIFT + S_BRACKET_L ); };
this.__comp( e, function(){ var squareBracket = function( e2 ) {
debug.Info( "Bracket boundary }" ); var BracketMatch = analyzer.bracketIn( "[", ccur.aPos );
analyzer.bracketAt( ccur.aPos ); e2.__range = BracketMatch;
}, SHIFT + S_BRACKET_R ); };
// Bracket boundaries
this.__comp( e, bracket , SHIFT + _0 );
this.__comp( e, bracket, SHIFT + _9 );
this.__comp( e, squareBracket, S_BRACKET_L );
this.__comp( e, squareBracket, S_BRACKET_R );
this.__comp( e, curlyBracket, SHIFT + S_BRACKET_L );
this.__comp( e, curlyBracket, SHIFT + S_BRACKET_R );
break; break;
case G: // Go to top case G: // Go to top

View File

@ -89,7 +89,7 @@
Cursor.prototype.Vim; Cursor.prototype.Vim;
// Move to an absolute position // Move to an absolute position
Cursor.prototype.moveTo = function( aPos ) Cursor.prototype.moveTo = function( aPos, phantomSpace )
{ {
var content = this.feeder.content; var content = this.feeder.content;
var lastLineNum = this.getLine().lineNum; var lastLineNum = this.getLine().lineNum;
@ -115,7 +115,7 @@
if( 0 < this.getLine().lineNum && lineStart <= aPos ) jumpX --; if( 0 < this.getLine().lineNum && lineStart <= aPos ) jumpX --;
this.moveX( - Number.MAX_VALUE ); this.moveX( - Number.MAX_VALUE );
this.moveX( jumpX ); this.moveX( jumpX, false, phantomSpace );
}; };

View File

@ -149,7 +149,9 @@
var a = this.content.indexOf( "\n", f + 1 ); var a = this.content.indexOf( "\n", f + 1 );
if( a == -1 ) if( a == -1 )
{ {
Y = i; Y = i - 1;
// -2 to compensate the last "\n" content placeholder
f -= 2;
break; break;
} }
f = a; f = a;

View File

@ -117,6 +117,24 @@
}; };
/* End Private Class }}}*/ /* End Private Class }}}*/
var SetParent = function( BracketPairs, pair )
{
if( !pair ) throw new Error( "Parent not found" );
var tMatch = new TokenMatch();
tMatch.__level = pair[ TOK_LEVEL ];
tMatch.__open = pair[ TOK_OPEN ];
tMatch.__close = pair[ TOK_CLOSED ];
if( -1 < pair[ TOK_PARENT ] )
{
var rPair = BracketPairs.find( pair[ TOK_PARENT ] );
tMatch.__parent = SetParent( BracketPairs, rPair );
}
return tMatch;
};
var Analyzer = function( feeder ) var Analyzer = function( feeder )
{ {
/* @type {Components.Vim.LineFeeder} */ /* @type {Components.Vim.LineFeeder} */
@ -136,17 +154,17 @@
{ {
case "{": tokState = TOK_OPEN; case "{": tokState = TOK_OPEN;
case "}": case "}":
BracketPairs = this.GetPairs( TOK_JOIN( "{", "}" ) ); BracketPairs = this.__getPairs( TOK_JOIN( "{", "}" ) );
break; break;
case "[": tokState = TOK_OPEN; case "[": tokState = TOK_OPEN;
case "]": case "]":
BracketPairs = this.GetPairs( TOK_JOIN( "[", "]" ) ); BracketPairs = this.__getPairs( TOK_JOIN( "[", "]" ) );
break; break;
case "(": tokState = TOK_OPEN; case "(": tokState = TOK_OPEN;
case ")": case ")":
BracketPairs = this.GetPairs( TOK_JOIN( "(", ")" ) ); BracketPairs = this.__getPairs( TOK_JOIN( "(", ")" ) );
break; break;
case "/": case "/":
@ -186,39 +204,65 @@
{ {
case "/*": tokState = TOK_OPEN; case "/*": tokState = TOK_OPEN;
case "*/": case "*/":
BracketPairs = this.GetPairs( TOK_JOIN( "/*", "*/" ) ); BracketPairs = this.__getPairs( TOK_JOIN( "/*", "*/" ) );
break; break;
default: default:
return new TokenMatch(); return new TokenMatch();
} }
var SetParent = function( pair )
{
if( !pair ) throw new Error( "Parent not found" );
var tMatch = new TokenMatch();
tMatch.__level = pair[ TOK_LEVEL ];
tMatch.__open = pair[ TOK_OPEN ];
tMatch.__close = pair[ TOK_CLOSED ];
if( -1 < pair[ TOK_PARENT ] )
{
var rPair = BracketPairs.find( pair[ TOK_PARENT ] );
tMatch.__parent = SetParent( rPair );
}
return tMatch;
};
var rPair = BracketPairs.find( p, tokState ); var rPair = BracketPairs.find( p, tokState );
var tMatch = SetParent( rPair ) var tMatch = SetParent( BracketPairs, rPair )
tMatch.__selected = p; tMatch.__selected = p;
return tMatch; return tMatch;
}; };
Analyzer.prototype.GetPairs = function( def, reload ) Analyzer.prototype.bracketIn = function( b, p )
{
var bro = "{[(";
var brc = "}])";
var i = bro.indexOf( b );
if( i < 0 ) i = brc.indexOf( b );
if( i < 0 ) throw new Error( "Unsupported bracket: " + b );
var tokPairs = this.__getPairs( TOK_JOIN( bro[i], brc[i] ) );
var pairs = tokPairs.__pairs;
var l = pairs.length;
var highest = null;
// Find the range of highest level
for( var i = 0; i < l; i ++ )
{
var pair = pairs[ i ];
if( pair[ TOK_OPEN ] <= p && p <= pair[ TOK_CLOSED ] )
{
if( ( highest && highest[ TOK_LEVEL ] < pair[ TOK_LEVEL ] ) || !highest )
{
highest = pair;
}
}
}
var tMatch = SetParent( tokPairs, highest );
var oMatch = tMatch;
do {
oMatch.__open ++;
oMatch.__close --;
} while( oMatch = oMatch.parent )
if( highest ) return tMatch;
return new TokenMatch();
};
Analyzer.prototype.__getPairs = function( def, reload )
{ {
if( !reload && this.__tokpairs[ def ] ) if( !reload && this.__tokpairs[ def ] )
{ {

View File

@ -4,6 +4,8 @@ Components.Vim.Syntax.Analyzer = function(){};
/** @type Function */ /** @type Function */
Components.Vim.Syntax.Analyzer.bracketAt; Components.Vim.Syntax.Analyzer.bracketAt;
/** @type Function */ /** @type Function */
Components.Vim.Syntax.Analyzer.bracketIn;
/** @type Function */
Components.Vim.Syntax.Analyzer.wordAt; Components.Vim.Syntax.Analyzer.wordAt;
/** @type Function */ /** @type Function */
Components.Vim.Syntax.Analyzer.quoteAt; Components.Vim.Syntax.Analyzer.quoteAt;