forked from Botanical/BotanJS
FIND command
This commit is contained in:
parent
3ed7d2be84
commit
062e9d8bb9
127
botanjs/src/Components/Vim/Actions/FIND.js
Normal file
127
botanjs/src/Components/Vim/Actions/FIND.js
Normal file
@ -0,0 +1,127 @@
|
||||
(function(){
|
||||
var ns = __namespace( "Components.Vim.Actions" );
|
||||
|
||||
/** @type {System.Debug} */
|
||||
var debug = __import( "System.Debug" );
|
||||
|
||||
var Mesg = __import( "Components.Vim.Message" );
|
||||
|
||||
// Private static
|
||||
var PATTERN = "";
|
||||
|
||||
var ParsePattern = function( pattern )
|
||||
{
|
||||
var parsed = "";
|
||||
var l = pattern.length;
|
||||
|
||||
for( var i = 1; i < l; i ++ )
|
||||
{
|
||||
switch( pattern[ i ] )
|
||||
{
|
||||
case "^I":
|
||||
parsed += "\t";
|
||||
break;
|
||||
case "\\":
|
||||
var tok = pattern[ ++ i ];
|
||||
debug.Error( "Unknown escaped token: " + tok );
|
||||
++ i;
|
||||
default:
|
||||
parsed += pattern[ i ];
|
||||
}
|
||||
}
|
||||
|
||||
var RegEx = null;
|
||||
|
||||
try
|
||||
{
|
||||
var RegEx = new RegExp( parsed, "gm" );
|
||||
}
|
||||
catch( ex )
|
||||
{
|
||||
debug.Error( ex );
|
||||
}
|
||||
|
||||
return RegEx;
|
||||
};
|
||||
|
||||
/** @type {Components.Vim.Cursor.IAction} */
|
||||
var FIND = function( Cursor )
|
||||
{
|
||||
/** @type {Components.Vim.Cursor} */
|
||||
this.__cursor = Cursor;
|
||||
this.__msg = "";
|
||||
Cursor.suppressEvent();
|
||||
};
|
||||
|
||||
FIND.prototype.dispose = function()
|
||||
{
|
||||
this.__cursor.unsuppressEvent();
|
||||
};
|
||||
|
||||
FIND.prototype.handler = function( e, p )
|
||||
{
|
||||
e.preventDefault();
|
||||
|
||||
if( p ) PATTERN = p;
|
||||
|
||||
var search = ParsePattern( PATTERN );
|
||||
|
||||
var content = this.__cursor.feeder.content;
|
||||
|
||||
var cur = this.__cursor;
|
||||
var p = cur.aPos;
|
||||
|
||||
var r;
|
||||
var Hit;
|
||||
var FirstHit;
|
||||
var PrevStack = [];
|
||||
|
||||
while( ( r = search.exec( content ) ) !== null )
|
||||
{
|
||||
if( !FirstHit ) FirstHit = r.index;
|
||||
if( p < r.index )
|
||||
{
|
||||
Hit = r.index;
|
||||
break;
|
||||
}
|
||||
|
||||
PrevStack.push( r.index );
|
||||
}
|
||||
|
||||
if( e.kMap( "N" ) )
|
||||
{
|
||||
Hit = PrevStack[ PrevStack.length - 2 ];
|
||||
if( Hit == undefined )
|
||||
{
|
||||
this.__msg = Mesg( "SEARCH_HIT_TOP" );
|
||||
|
||||
while( ( r = search.exec( content ) ) !== null ) Hit = r.index;
|
||||
}
|
||||
}
|
||||
else if( FirstHit != undefined && Hit == undefined )
|
||||
{
|
||||
// Search Hit Bottom
|
||||
Hit = FirstHit;
|
||||
this.__msg = Mesg( "SEARCH_HIT_BOTTOM" );
|
||||
}
|
||||
else
|
||||
{
|
||||
this.__msg = PATTERN.join( "" )
|
||||
}
|
||||
|
||||
if( Hit == undefined )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
cur.moveTo( Hit );
|
||||
}
|
||||
};
|
||||
|
||||
FIND.prototype.getMessage = function()
|
||||
{
|
||||
return this.__msg;
|
||||
};
|
||||
|
||||
ns[ NS_EXPORT ]( EX_CLASS, "FIND", FIND );
|
||||
})();
|
@ -1,8 +1,6 @@
|
||||
(function(){
|
||||
var ns = __namespace( "Components.Vim.Actions" );
|
||||
|
||||
/** @type {Components.Vim.State.Stack} */
|
||||
var Stack = __import( "Components.Vim.State.Stack" );
|
||||
/** @type {System.Debug} */
|
||||
var debug = __import( "System.Debug" );
|
||||
|
||||
|
@ -441,6 +441,11 @@
|
||||
}, _8 );
|
||||
break;
|
||||
|
||||
case SHIFT + N: // Next Search
|
||||
case N: // Next Search
|
||||
ccur.openRunAction( "FIND", e );
|
||||
break;
|
||||
|
||||
case SLASH: // "/" Search movement
|
||||
this.__cMovement = true;
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
/** @type {System.utils.Perf} */
|
||||
var Perf = __import( "System.utils.Perf" );
|
||||
|
||||
/**j@type {Components.Vim.State.History} */
|
||||
/** @type {Components.Vim.State.History} */
|
||||
var History = __import( "Components.Vim.State.History" );
|
||||
var Mesg = __import( "Components.Vim.Message" );
|
||||
var beep = __import( "Components.Vim.Beep" );
|
||||
@ -134,7 +134,7 @@
|
||||
}
|
||||
else if( e.kMap( "Enter" ) )
|
||||
{
|
||||
this.__process();
|
||||
this.__process( e );
|
||||
return true;
|
||||
}
|
||||
else if( e.kMap( "Left" ) )
|
||||
@ -206,9 +206,22 @@
|
||||
feeder.dispatcher.dispatchEvent( new BotanEvent( "VisualUpdate" ) );
|
||||
};
|
||||
|
||||
Command.prototype.__process = function()
|
||||
Command.prototype.__process = function( e )
|
||||
{
|
||||
this.__hist.push( this.__command );
|
||||
|
||||
var action = "";
|
||||
switch( this.__mode )
|
||||
{
|
||||
case "/":
|
||||
action = "FIND";
|
||||
break;
|
||||
}
|
||||
|
||||
var cur = this.__cursor;
|
||||
cur.suppressEvent();
|
||||
this.__cursor.openRunAction( action, e, this.__command.slice() );
|
||||
cur.unsuppressEvent();
|
||||
};
|
||||
|
||||
ns[ NS_EXPORT ]( EX_CLASS, "Command", Command );
|
||||
|
@ -21,6 +21,9 @@
|
||||
, "LINES_FEWER": "%1 fewer line(s)"
|
||||
, "LINES_MORE": "%1 more line(s)"
|
||||
, "LINES_YANKED": "%1 line(s) yanked"
|
||||
|
||||
, "SEARCH_HIT_BOTTOM": "search hit BOTTOM, continuing at TOP"
|
||||
, "SEARCH_HIT_TOP": "search hit TOP, continuing at BOTTOM"
|
||||
};
|
||||
|
||||
var errors = {
|
||||
|
Loading…
Reference in New Issue
Block a user