forked from Botanical/BotanJS
Line shifting support
This commit is contained in:
parent
7229447ee1
commit
ce669c2cb6
@ -62,12 +62,14 @@
|
|||||||
|
|
||||||
var start = this.__slineNum;
|
var start = this.__slineNum;
|
||||||
var nline = this.__lines;
|
var nline = this.__lines;
|
||||||
|
var indentMult = 1;
|
||||||
|
|
||||||
if( 1 < e.count )
|
if( 1 < e.count )
|
||||||
{
|
{
|
||||||
nline += e.count;
|
nline += e.count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// default: >>, <<, >l, <h
|
||||||
var end = start;
|
var end = start;
|
||||||
|
|
||||||
var shiftCount = 1;
|
var shiftCount = 1;
|
||||||
@ -81,30 +83,86 @@
|
|||||||
|
|
||||||
if( this.__startX != currAp )
|
if( this.__startX != currAp )
|
||||||
{
|
{
|
||||||
if( e.kMap( "h" ) || e.kMap( "l" ) ){}
|
if( currAp < sp )
|
||||||
else if( e.kMap( "j" ) )
|
|
||||||
{
|
{
|
||||||
end = start + nline;
|
sp = sp + currAp;
|
||||||
|
currAp = sp - currAp;
|
||||||
|
sp = sp - currAp;
|
||||||
}
|
}
|
||||||
else if( e.kMap( "k" ) )
|
|
||||||
{
|
start = end = 0;
|
||||||
start -= nline;
|
for( var i = 0; i < currAp; i ++ )
|
||||||
}
|
|
||||||
else // TODO: Dectect movement line count
|
|
||||||
{
|
{
|
||||||
|
if( feeder.content[ i ] == "\n" )
|
||||||
|
{
|
||||||
|
end ++;
|
||||||
|
if( i < sp )
|
||||||
|
{
|
||||||
|
start ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( !( ( 0 < dir && ( e.kMap( ">" ) || e.kMap( "l" ) ) )
|
if( e.range )
|
||||||
|| ( dir < 0 && ( e.kMap( "<" ) || e.kMap( "h" ) ) )
|
{
|
||||||
) )
|
sp = e.range.close;
|
||||||
|
|
||||||
|
start = 1; end = -1;
|
||||||
|
for( var i = 0; i < sp; i ++ )
|
||||||
|
{
|
||||||
|
if( feeder.content[ i ] == "\n" )
|
||||||
|
{
|
||||||
|
end ++;
|
||||||
|
if( i < e.range.open )
|
||||||
|
{
|
||||||
|
start ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( end == -1 )
|
||||||
|
{
|
||||||
|
start = end = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( end < start )
|
||||||
|
{
|
||||||
|
end = -- start;
|
||||||
|
}
|
||||||
|
|
||||||
|
indentMult = e.count;
|
||||||
|
}
|
||||||
|
else if( 0 < dir && ( e.kMap( ">" ) || e.kMap( "l" ) ) );
|
||||||
|
else if( dir < 0 && ( e.kMap( "<" ) || e.kMap( "h" ) ) );
|
||||||
|
else
|
||||||
{
|
{
|
||||||
beep();
|
beep();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// VISUAL Mode
|
||||||
|
else
|
||||||
|
{
|
||||||
|
start = 0;
|
||||||
|
for( var i = 0; i < sp; i ++ )
|
||||||
|
{
|
||||||
|
if( feeder.content[ i ] == "\n" ) start ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
end = this.__slineNum;
|
||||||
|
|
||||||
|
indentMult = e.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( end < start )
|
||||||
|
{
|
||||||
|
start = start + end;
|
||||||
|
end = start - end;
|
||||||
|
start = start - end;
|
||||||
|
}
|
||||||
|
|
||||||
// last "\n" padding
|
// last "\n" padding
|
||||||
var c = feeder.content.slice( 0, -1 );
|
var c = feeder.content.slice( 0, -1 );
|
||||||
@ -124,7 +182,7 @@
|
|||||||
var spOccr = 0;
|
var spOccr = 0;
|
||||||
|
|
||||||
// Guess indent
|
// Guess indent
|
||||||
var tabStat = {};
|
var tabStat = [];
|
||||||
|
|
||||||
for( var i = 0; i < l; i ++ )
|
for( var i = 0; i < l; i ++ )
|
||||||
{
|
{
|
||||||
@ -146,6 +204,7 @@
|
|||||||
var indentCLen = 0;
|
var indentCLen = 0;
|
||||||
for( var i in tabStat )
|
for( var i in tabStat )
|
||||||
{
|
{
|
||||||
|
i = Number( i );
|
||||||
var p = tabStat[ i ];
|
var p = tabStat[ i ];
|
||||||
if( upperDiff < p )
|
if( upperDiff < p )
|
||||||
{
|
{
|
||||||
@ -179,13 +238,15 @@
|
|||||||
var nLen = 0;
|
var nLen = 0;
|
||||||
|
|
||||||
var started = false;
|
var started = false;
|
||||||
var indentTimes = 1;
|
|
||||||
|
|
||||||
var recStart = 0;
|
var recStart = 0;
|
||||||
|
|
||||||
feeder.content = "";
|
feeder.content = "";
|
||||||
nline = 0;
|
nline = 0;
|
||||||
|
|
||||||
|
var indented = "";
|
||||||
|
for( var i = 0; i < indentMult; i ++ ) indented += indentChar;
|
||||||
|
|
||||||
for( var i = 0, j = 0; 0 <= i; i = c.indexOf( "\n", i ), j ++ )
|
for( var i = 0, j = 0; 0 <= i; i = c.indexOf( "\n", i ), j ++ )
|
||||||
{
|
{
|
||||||
i ++;
|
i ++;
|
||||||
@ -216,24 +277,24 @@
|
|||||||
var indentedLine;
|
var indentedLine;
|
||||||
if( 0 < dir )
|
if( 0 < dir )
|
||||||
{
|
{
|
||||||
indentedLine = indentChar + line;
|
indentedLine = indented + line;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for( var si = 0, sj = 1; si < indentTimes; si ++ )
|
for( var si = 0, sj = 0; si < indentMult; si ++ )
|
||||||
{
|
{
|
||||||
var startC = line[ si ];
|
var startC = line[ sj ];
|
||||||
if( startC == " " )
|
if( startC == " " )
|
||||||
{
|
{
|
||||||
for( ; sj < tabwidth; sj ++ )
|
for( var swidth = tabwidth + ( sj ++ ); sj < swidth; sj ++ )
|
||||||
{
|
{
|
||||||
if( !~"\t ".indexOf( line[ si + sj ] ) ) break;
|
if( !~"\t ".indexOf( line[ sj ] ) ) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( startC != "\t" ) break;
|
else if( startC != "\t" ) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
indentedLine = line.substring( si + sj - 1 );
|
indentedLine = line.substring( sj );
|
||||||
}
|
}
|
||||||
|
|
||||||
feeder.content += indentedLine;
|
feeder.content += indentedLine;
|
||||||
@ -267,7 +328,14 @@
|
|||||||
|
|
||||||
cur.rec.record( stack );
|
cur.rec.record( stack );
|
||||||
|
|
||||||
this.__msg = Mesg( "LINES_SHIFTED", nline, dir < 0 ? "<" : ">", 1 );
|
if( nline )
|
||||||
|
{
|
||||||
|
this.__msg = Mesg( "LINES_SHIFTED", nline, dir < 0 ? "<" : ">", indentMult );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.__msg = Mesg( "NO_SHIFT", dir < 0 ? "<" : ">" );
|
||||||
|
}
|
||||||
|
|
||||||
return Triggered;
|
return Triggered;
|
||||||
};
|
};
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
var YANK = ns[ NS_INVOKE ]( "YANK" );
|
var YANK = ns[ NS_INVOKE ]( "YANK" );
|
||||||
/** @type {Components.Vim.IAction} */
|
/** @type {Components.Vim.IAction} */
|
||||||
var DELETE = ns[ NS_INVOKE ]( "DELETE" );
|
var DELETE = ns[ NS_INVOKE ]( "DELETE" );
|
||||||
|
/** @type {Components.Vim.IAction} */
|
||||||
|
var SHIFT_LINES = ns[ NS_INVOKE ]( "SHIFT_LINES" );
|
||||||
|
|
||||||
var MODE_NULL = -1;
|
var MODE_NULL = -1;
|
||||||
var MODE_VISUAL = 0;
|
var MODE_VISUAL = 0;
|
||||||
@ -129,6 +131,10 @@
|
|||||||
this.__msg = Mesg( "VISLINE" );
|
this.__msg = Mesg( "VISLINE" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( e.kMap( "<" ) || e.kMap( ">" ) )
|
||||||
|
{
|
||||||
|
Action = new SHIFT_LINES( cur, e );
|
||||||
|
}
|
||||||
else if( e.kMap( "v" ) )
|
else if( e.kMap( "v" ) )
|
||||||
{
|
{
|
||||||
if( this.__mode == MODE_VISUAL ) return true;
|
if( this.__mode == MODE_VISUAL ) return true;
|
||||||
|
@ -300,8 +300,9 @@
|
|||||||
var ccur = this.__ccur;
|
var ccur = this.__ccur;
|
||||||
|
|
||||||
var x = ccur.X;
|
var x = ccur.X;
|
||||||
|
var y = ccur.Y;
|
||||||
ccur.moveX( a, b, c || ccur.pSpace );
|
ccur.moveX( a, b, c || ccur.pSpace );
|
||||||
if( ccur.X == x )
|
if( ccur.X == x && ccur.Y == y )
|
||||||
{
|
{
|
||||||
beep();
|
beep();
|
||||||
return false;
|
return false;
|
||||||
@ -559,15 +560,32 @@
|
|||||||
this.__composite( e, curlyBracket, SHIFT + S_BRACKET_R );
|
this.__composite( e, curlyBracket, SHIFT + S_BRACKET_R );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case G: // Go to top
|
case G:
|
||||||
|
|
||||||
this.__cMovement = true;
|
this.__cMovement = true;
|
||||||
this.__composite( e, function(){
|
|
||||||
|
// Go to top
|
||||||
|
this.__composite( e, function() {
|
||||||
ccur.moveY( -Number.MAX_VALUE );
|
ccur.moveY( -Number.MAX_VALUE );
|
||||||
ccur.moveX( -Number.MAX_VALUE, true );
|
ccur.moveX( -Number.MAX_VALUE, true );
|
||||||
}, G );
|
}, G );
|
||||||
this.__composite( e, function(){
|
|
||||||
|
// Print Hex
|
||||||
|
this.__composite( e, function() {
|
||||||
ccur.openRunAction( "PRINT_HEX", e );
|
ccur.openRunAction( "PRINT_HEX", e );
|
||||||
}, _8 );
|
}, _8 );
|
||||||
|
|
||||||
|
// to lowercase
|
||||||
|
this.__composite( e, function( e2 ) {
|
||||||
|
if( ccur.action ) { beep(); return; }
|
||||||
|
// TODO
|
||||||
|
}, U );
|
||||||
|
|
||||||
|
// to uppercase
|
||||||
|
this.__composite( e, function( e2 ) {
|
||||||
|
if( ccur.action ) { beep(); return; }
|
||||||
|
// TODO
|
||||||
|
}, SHIFT + U );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SHIFT + N: // Next Search
|
case SHIFT + N: // Next Search
|
||||||
|
@ -26,6 +26,8 @@ VIMRE_VERSION = "1.0.0b";
|
|||||||
, "LINES_YANKED": "%1 line(s) yanked"
|
, "LINES_YANKED": "%1 line(s) yanked"
|
||||||
, "LINES_SHIFTED": "%1 line(s) %2ed %3 time(s)"
|
, "LINES_SHIFTED": "%1 line(s) %2ed %3 time(s)"
|
||||||
|
|
||||||
|
, "NO_SHIFT": "No line to %1"
|
||||||
|
|
||||||
, "SEARCH_HIT_BOTTOM": "search hit BOTTOM, continuing at TOP"
|
, "SEARCH_HIT_BOTTOM": "search hit BOTTOM, continuing at TOP"
|
||||||
, "SEARCH_HIT_TOP": "search hit TOP, continuing at BOTTOM"
|
, "SEARCH_HIT_TOP": "search hit TOP, continuing at BOTTOM"
|
||||||
, "REPLACE": "%1 substitution(s) on %2 line(s)"
|
, "REPLACE": "%1 substitution(s) on %2 line(s)"
|
||||||
|
Loading…
Reference in New Issue
Block a user