VA_REC impl

This commit is contained in:
斟酌 鵬兄 2017-01-28 12:18:19 +08:00
parent d6a27ca87e
commit a847510f49
6 changed files with 195 additions and 7 deletions

View File

@ -87,6 +87,9 @@
case "help":
out[ CMD_TYPE ] = "HELP";
break;
case "varec":
out[ CMD_TYPE ] = "VA_REC";
break;
}
if( range !== "" )

View File

@ -0,0 +1,109 @@
(function(){
var ns = __namespace( "Components.Vim.Actions" );
/** @type {System.Debug} */
var debug = __import( "System.Debug" );
/** @type {System.utils.EventKey} */
var EventKey = __import( "System.utils.EventKey" );
/** @type {Components.Vim.ActionEvent} */
var ActionEvent = __import( "Components.Vim.ActionEvent" );
var Mesg = __import( "Components.Vim.Message" );
// Recording Sessions
var Sessions = [];
/** @type {Components.Vim.IAction} */
var VA_REC = function( Cursor )
{
/** @type {Components.Vim.Cursor} */
this.__cursor = Cursor;
this.__msg = Mesg( "VA_REC_START" );
Cursor.suppressEvent();
};
VA_REC.prototype.dispose = function()
{
this.__cursor.unsuppressEvent();
};
VA_REC.prototype.handler = function( e, endReplay )
{
if( endReplay )
{
var msg = Mesg( "VA_REC_END" );
var lastLine = Mesg( "WAIT_FOR_INPUT" );
var l = this.__cursor.feeder.firstBuffer.cols;
for( var i = msg.length; i < l; i ++ ) msg += " ";
this.__msg = msg + "\n" + lastLine;
return;
}
e.preventDefault();
var inst = this.__cursor.Vim;
var sender = inst.stage;
var sIndex = inst.index;
var session;
if( Sessions[ sIndex ] )
{
session = Sessions[ sIndex ];
}
else
{
session = Sessions[ sIndex ] = {};
}
if( session.started )
{
session.__dispose();
this.__msg = "Exported Session Data";
setTimeout( function() {
window.prompt( "Session data ( Ctrl + C )", JSON.stringify( session.data ) );
}, 1 );
return;
}
else
{
session.started = true;
}
var sessData = session.data = [];
var lastTime = Date.now();
session.__event = new EventKey(
"KeyDown", function( e2 )
{
var evt = new ActionEvent( sender, e2 );
if( [ "Control", "Alt", "Shift" ].indexOf( e2.key ) != -1 ) return;
var now = Date.now();
sessData.push( now - lastTime, evt.keyCode );
lastTime = now;
}
);
var feeder = this.__cursor.feeder;
// Handles quit event on VimArea
session.__dispose = function() {
debug.Info( "VA_REC: Disposing active session" );
delete Sessions[ sIndex ];
sender.removeEventListener( session.__event );
inst.removeEventListener( "Dispose", session.__dispose );
};
inst.addEventListener( "Dispose", session.__dispose );
sender.addEventListener( session.__event );
};
VA_REC.prototype.getMessage = function()
{
return this.__msg;
};
ns[ NS_EXPORT ]( EX_CLASS, "VA_REC", VA_REC );
})();

View File

@ -90,6 +90,7 @@
case "Del": kCode = Mod + DELETE; break;
case "Enter": kCode = Mod + ENTER; break;
case "Tab": kCode = Mod + TAB; break;
case "Escape": kCode = Mod + ESC; break;
case "Up": kCode = Mod + UP; break;
case "Down": kCode = Mod + DOWN; break;
@ -148,7 +149,7 @@
{
switch( kCode )
{
case SPACE: return " ";
case SPACE: case SHIFT + SPACE: return " ";
case A: return "a"; case B: return "b"; case C: return "c"; case D: return "d";
case E: return "e"; case F: return "f"; case G: return "g"; case H: return "h";
case I: return "i"; case J: return "j"; case K: return "k"; case L: return "l";
@ -188,7 +189,8 @@
case SHIFT + S: return "S"; case SHIFT + T: return "T"; case SHIFT + U: return "U";
case SHIFT + V: return "V"; case SHIFT + W: return "W"; case SHIFT + X: return "X";
case SHIFT + Y: return "Y"; case SHIFT + Z: return "Z";
case ESC: return "Escape"; case BACKSPACE: return "Backspace"; case DELETE: return "Delete";
case SHIFT + BACKSPACE: case BACKSPACE: return "Backspace";
case ESC: return "Escape"; case DELETE: return "Delete";
case SHIFT: return "Shift"; case ALT: return "Alt"; case CTRL: return "Control";
case ENTER: return "Enter"; case TAB: return "Tab";
}
@ -484,7 +486,6 @@
}
var ccur = this.__ccur;
var vima = this.__vimArea;
var cfeeder = ccur.feeder;
var cursorHandled = true;
@ -807,6 +808,13 @@
this.__kCode = Map( e );
this.__escape = this.__kCode == ESC;
}
else if( typeof( e ) == "number" )
{
this.__key = RMap( e );
this.__modKeys = 0;
this.__kCode = e;
this.__escape = this.__kCode == ESC || this.__kCode == ( CTRL + C );
}
else
{
this.__e = e;

View File

@ -24,7 +24,7 @@
var VimControls = ns[ NS_INVOKE ]( "Controls" );
var ActionEvent = ns[ NS_INVOKE ]( "ActionEvent" );
var mesg = ns[ NS_INVOKE ]( "Message" );
var Mesg = ns[ NS_INVOKE ]( "Message" );
var Insts = [];
var InstIndex = 0;
@ -47,6 +47,8 @@
{
if( !stage ) throw new Error( "Invalid argument" );
EventDispatcher.call( this );
stage = IDOMElement( stage );
var element = stage.element;
@ -99,6 +101,8 @@
Insts[ this.__instIndex ] = this;
};
__extends( VimArea, EventDispatcher );
VimArea.prototype.__testScreen = function( handler )
{
var area = this.stage.element;
@ -205,7 +209,7 @@
// Set the stamps
var statusBar = new StatusBar( c );
statusBar.stamp( -18, function(){ return cfeeder.lineStat; } );
statusBar.stamp( -3, function(){ return mesg( cfeeder.docPos ); } );
statusBar.stamp( -3, function(){ return Mesg( cfeeder.docPos ); } );
statusBar.stamp( 0, function(){ return cfeeder.cursor.message; } );
sfeeder.init( statusBar.statusText );
@ -261,6 +265,60 @@
this.stage.addEventListeners( this.__stagedEvents );
};
VimArea.prototype.demo = function( seq )
{
if( this.__demoActive ) return;
var _self = this;
this.__demoActive = true;
var l = seq.length;
var s = 0;
var controls = new VimControls( this );
var cursor = this.__cursor;
var statusBar = this.statusBar;
var demoEnd = function()
{
statusBar.stamp( 1, false );
controls.handler( _self, new ActionEvent( _self, "Escape" ) );
setTimeout( function() {
cursor.openRunAction( "VA_REC", undefined, true );
_self.__demoActive = false;
_self.stage.addEventListeners( _self.__stagedEvents );
}, 100 );
};
var demoChain = function()
{
_self.stage.element.focus();
var key = seq[ s + 1 ];
controls.handler( _self, new ActionEvent( _self, key ) );
s += 2;
if( s < l )
{
// Wait time cannot be 0
setTimeout( demoChain, seq[ s ] || 20 );
}
else
{
setTimeout( demoEnd, 100 );
}
};
statusBar.stamp( 1, function(){ return Mesg( "VA_REC_REPLAY" ); } );
var evts = this.__stagedEvents;
for( var i in evts ) this.stage.removeEventListener( evts[ i ] );
this.__active = true;
setTimeout( demoChain, seq[ s ] );
};
VimArea.prototype.dispose = function()
{
var stage = this.stage;
@ -272,6 +330,7 @@
debug.Info( "Destroy instance: " + id );
feeder.dispatcher.removeEventListener( "VisualUpdate", this.__visualUpdate );
this.dispatchEvent( new BotanEvent( "Dispose" ) );
stage.removeAttribute( "data-vimarea" );

View File

@ -1,4 +1,4 @@
VIMRE_VERSION = "1.0.0b";
var VIMRE_VERSION = "1.0.0";
(function(){
var ns = __namespace( "Components.Vim" );
@ -31,6 +31,10 @@ VIMRE_VERSION = "1.0.0b";
, "SEARCH_HIT_BOTTOM": "search hit BOTTOM, continuing at TOP"
, "SEARCH_HIT_TOP": "search hit TOP, continuing at BOTTOM"
, "REPLACE": "%1 substitution(s) on %2 line(s)"
, "VA_REC_START": "Recording Session ..."
, "VA_REC_REPLAY": "Replaying Session ..."
, "VA_REC_END": "Session Ended"
};
var errors = {

View File

@ -1,4 +1,6 @@
/** @constructor */
/** @constructor
* @extends {EventDispatcher}
*/
Components.Vim.VimArea = function(){};
/** @type {Components.Vim.LineFeeder} */
@ -10,6 +12,9 @@ Components.Vim.VimArea.statusFeeder;
/** @type {Components.Vim.StatusBar} */
Components.Vim.VimArea.statusBar;
/** @type Function */
Components.Vim.VimArea.demo;
/** @type Number */
Components.Vim.VimArea.index;
/** @type Number */