penguin/AstroJS

Javascript framework for my blog

botanjs/src/Components/Vim/State/Registers.js

raw ยท 2079 bytes

(function(){
/*  From Vim, :help registers
	There are ten types of registers:
	1. The unnamed register ""
	2. 10 numbered registers "0 to "9
	3. The small delete register "-
	4. 26 named registers "a to "z or "A to "Z
	5. three read-only registers ":, "., "%
	6. alternate buffer register "#
	7. the expression register "=
	8. The selection and drop registers "*, "+ and "~ 
	9. The black hole register "_
	10. Last search pattern register "/
	i.e. 0123456789-abcdefghijklmnopqrstuvwxyz:.%$=*+~_/
*/
	var ns = __namespace( "Components.Vim.State" );

	/** @type {System.Debug} */
	var debug = __import( "System.Debug" );

	/** @constructor */
	var Register = function( str, n )
	{
		this.__str = str + "";
		this.newLine = Boolean( n );
	};

	Register.prototype.newLine = false;

	Register.prototype.toString = function() { return this.__str; };
	Register.prototype.indexOf = function( a, b ) { return this.__str.indexOf( a, b ); };

	__readOnly( Register.prototype, "length", function() { return this.__str.length; } );


	var Registers = function()
	{
		this.__registers = {};
	};

	Registers.prototype.__unnamed = function( reg )
	{
		this.__registers[ "\"" ] = reg;
	};

	Registers.prototype.yank = function( str, newLine )
	{
		var reg = new Register( str, newLine );
		this.__unnamed( reg );
		this.__registers[ this.__selRegister || 0 ] = reg;
		this.__selRegister = false;
	};

	Registers.prototype.change = function( str, newLine )
	{
		var reg = new Register( str, newLine );
		this.__unnamed( reg );
		var r = this.__registers;
		for( var i = 9; 1 < i; i -- )
		{
			if( r[ i - 1 ] != undefined )
			{
				r[ i ] = r[ i - 1 ];
			}
		}

		r[ 1 ] = reg;
		this.__selRegister = false;
	};

	Registers.prototype.get = function( r )
	{
		// 0 is one of the registers
		if( !r && r !== 0  ) r = this.__selRegister || "\"";

		this.__selRegister = false;
		return this.__registers[ r ];
	};

	Registers.prototype.select = function( r )
	{
		debug.Info( "Selecting Register: " + r );
		this.__selRegister = r;
	};

	ns[ NS_EXPORT ]( EX_CLASS, "Registers", Registers );

})();