forked from Botanical/BotanJS
Insert mode line break bug fix
This commit is contained in:
parent
dc63a882e3
commit
8769e69f35
@ -36,13 +36,21 @@
|
|||||||
INSERT.prototype.__saveCur = function()
|
INSERT.prototype.__saveCur = function()
|
||||||
{
|
{
|
||||||
var c = this.__cursor;
|
var c = this.__cursor;
|
||||||
return {
|
var obj = {
|
||||||
p: c.P
|
p: c.P
|
||||||
, x: c.X
|
, x: c.X
|
||||||
, y: c.Y
|
, y: c.Y
|
||||||
, px: c.feeder.panX
|
, px: c.feeder.panX
|
||||||
, py: c.feeder.panY
|
, py: c.feeder.panY
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if( 0 < obj.x )
|
||||||
|
{
|
||||||
|
obj.p -= 1;
|
||||||
|
obj.x -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
INSERT.prototype.dispose = function()
|
INSERT.prototype.dispose = function()
|
||||||
@ -186,20 +194,23 @@
|
|||||||
+ inputChar
|
+ inputChar
|
||||||
+ feeder.content.substring( f );
|
+ feeder.content.substring( f );
|
||||||
|
|
||||||
feeder.pan();
|
|
||||||
feeder.dispatcher.dispatchEvent( new BotanEvent( "VisualUpdate" ) );
|
|
||||||
|
|
||||||
this.__rec( inputChar );
|
|
||||||
|
|
||||||
if( inputChar == "\n" )
|
if( inputChar == "\n" )
|
||||||
{
|
{
|
||||||
|
feeder.softReset();
|
||||||
|
feeder.pan();
|
||||||
cur.moveY( 1 );
|
cur.moveY( 1 );
|
||||||
cur.lineStart();
|
cur.lineStart();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cur.moveX( 1 );
|
feeder.pan();
|
||||||
|
cur.moveX( 1, false, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
feeder.dispatcher.dispatchEvent( new BotanEvent( "VisualUpdate" ) );
|
||||||
|
|
||||||
|
this.__rec( inputChar );
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
INSERT.prototype.getMessage = function()
|
INSERT.prototype.getMessage = function()
|
||||||
|
@ -19,6 +19,12 @@
|
|||||||
var U = 85; var V = 86; var W = 87; var X = 88; var Y = 89;
|
var U = 85; var V = 86; var W = 87; var X = 88; var Y = 89;
|
||||||
var Z = 90;
|
var Z = 90;
|
||||||
|
|
||||||
|
var ESC = 27;
|
||||||
|
|
||||||
|
var F1 = 112; var F2 = 113; var F3 = 114; var F4 = 115; var F5 = 116;
|
||||||
|
var F6 = 117; var F7 = 118; var F8 = 119; var F9 = 120; var F10 = 121;
|
||||||
|
var F11 = 122; var F12 = 123;
|
||||||
|
|
||||||
var Controls = function( vimArea )
|
var Controls = function( vimArea )
|
||||||
{
|
{
|
||||||
/** @type {Components.Vim.VimArea} */
|
/** @type {Components.Vim.VimArea} */
|
||||||
@ -77,7 +83,7 @@
|
|||||||
// Neve capture these keys
|
// Neve capture these keys
|
||||||
if( e.altKey
|
if( e.altKey
|
||||||
// F2 - F12
|
// F2 - F12
|
||||||
|| ( 112 < e.keyCode && e.keyCode < 124 )
|
|| ( F1 < e.keyCode && e.keyCode < 124 )
|
||||||
) return;
|
) return;
|
||||||
|
|
||||||
var vArea = this.__vimArea;
|
var vArea = this.__vimArea;
|
||||||
@ -85,7 +91,7 @@
|
|||||||
var cfeeder = vArea.contentFeeder;
|
var cfeeder = vArea.contentFeeder;
|
||||||
|
|
||||||
// Esc OR Ctrl + c
|
// Esc OR Ctrl + c
|
||||||
var Escape = e.keyCode == 27 || ( e.ctrlKey && e.keyCode == 67 );
|
var Escape = e.keyCode == ESC || ( e.ctrlKey && e.keyCode == C );
|
||||||
|
|
||||||
// Clear the keychains in combo commands
|
// Clear the keychains in combo commands
|
||||||
if( Escape && this.__keyChains.length )
|
if( Escape && this.__keyChains.length )
|
||||||
@ -141,26 +147,10 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var ActionHandled = true;
|
||||||
|
// Action Commands
|
||||||
switch( kCode )
|
switch( kCode )
|
||||||
{
|
{
|
||||||
// Cursor movements
|
|
||||||
case BACKSPACE: // Backspace, go back 1 char, regardless of line
|
|
||||||
cMoveX( -1, true );
|
|
||||||
break;
|
|
||||||
case H: // Left
|
|
||||||
cMoveX( -1 );
|
|
||||||
break;
|
|
||||||
case L: // Right
|
|
||||||
cMoveX( 1 );
|
|
||||||
break;
|
|
||||||
case K: // Up
|
|
||||||
cMoveY( -1 );
|
|
||||||
break;
|
|
||||||
case J: // Down
|
|
||||||
cMoveY( 1 );
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Insert
|
|
||||||
case SHIFT + A: // Append at the line end
|
case SHIFT + A: // Append at the line end
|
||||||
ccur.lineEnd();
|
ccur.lineEnd();
|
||||||
case A: // Append
|
case A: // Append
|
||||||
@ -182,34 +172,57 @@
|
|||||||
break;
|
break;
|
||||||
case SHIFT + I: // Append before the line start, after spaces
|
case SHIFT + I: // Append before the line start, after spaces
|
||||||
break;
|
break;
|
||||||
|
case SHIFT + J: // Join lines
|
||||||
|
break;
|
||||||
|
case SHIFT + K: // Find the manual entry
|
||||||
|
break;
|
||||||
|
|
||||||
case SHIFT + G: // Goto last line
|
case F1: // F1, help
|
||||||
ccur.moveY( Number.MAX_VALUE );
|
|
||||||
ccur.moveX( Number.MAX_VALUE, true );
|
|
||||||
break;
|
|
||||||
// remove characters
|
|
||||||
case X: // Remove in cursor
|
|
||||||
break;
|
|
||||||
case SHIFT + X: // Remove before cursor
|
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
ActionHandled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ActionHandled ) return;
|
||||||
|
|
||||||
|
// Cursor Commands
|
||||||
|
switch( kCode )
|
||||||
|
{
|
||||||
|
case BACKSPACE: cMoveX( -1, true ); break; // Backspace, go back 1 char, regardless of line
|
||||||
|
case H: cMoveX( -1 ); break; // Left
|
||||||
|
case L: cMoveX( 1 ); break; // Right
|
||||||
|
case K: cMoveY( -1 ); break; // Up
|
||||||
|
case J: cMoveY( 1 ); break; // Down
|
||||||
|
|
||||||
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
|
||||||
break;
|
break;
|
||||||
case SHIFT + _4: // $, End
|
|
||||||
ccur.lineEnd();
|
|
||||||
break;
|
|
||||||
case SHIFT + _5: // %, Find next item
|
|
||||||
break;
|
|
||||||
case SHIFT + _6: // ^, Start
|
case SHIFT + _6: // ^, Start
|
||||||
ccur.lineStart();
|
ccur.lineStart();
|
||||||
break;
|
break;
|
||||||
case SHIFT + J: // Join lines
|
case SHIFT + _4: // $, End
|
||||||
|
ccur.lineEnd();
|
||||||
break;
|
break;
|
||||||
case SHIFT + K: // manual entry
|
case SHIFT + G: // Goto last line
|
||||||
|
ccur.moveY( Number.MAX_VALUE );
|
||||||
|
ccur.moveX( Number.MAX_VALUE, true );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SHIFT + _5: // %, Find next item
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Integrated commands
|
||||||
|
switch( kCode )
|
||||||
|
{
|
||||||
|
case V: // Visual
|
||||||
|
ccur.openAction( "VISUAL" );
|
||||||
|
break;
|
||||||
|
case SHIFT + V: // Visual line
|
||||||
|
ccur.openAction( "VISUAL_LINE" );
|
||||||
break;
|
break;
|
||||||
case 112: // F1, help
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -9,26 +9,6 @@
|
|||||||
|
|
||||||
var Actions = __import( "Components.Vim.Actions.*" );
|
var Actions = __import( "Components.Vim.Actions.*" );
|
||||||
|
|
||||||
var GetLine = function( buffs, l )
|
|
||||||
{
|
|
||||||
/** @type {Components.Vim.LineBuffer} */
|
|
||||||
var LineHead = buffs[0];
|
|
||||||
l ++;
|
|
||||||
|
|
||||||
for( var i = 0, line = LineHead;
|
|
||||||
line && i < l; i ++ )
|
|
||||||
{
|
|
||||||
LineHead = line;
|
|
||||||
while( line )
|
|
||||||
{
|
|
||||||
line = line.next;
|
|
||||||
if( line.br ) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return LineHead;
|
|
||||||
};
|
|
||||||
|
|
||||||
var LineOffset = function( buffs, l )
|
var LineOffset = function( buffs, l )
|
||||||
{
|
{
|
||||||
/** @type {Components.Vim.LineBuffer} */
|
/** @type {Components.Vim.LineBuffer} */
|
||||||
@ -123,7 +103,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @type {Components.Vim.LineBuffer} */
|
/** @type {Components.Vim.LineBuffer} */
|
||||||
var line = GetLine( buffs, this.Y );
|
var line = this.getLine();
|
||||||
var content = line.visualLines.join( "\n" );
|
var content = line.visualLines.join( "\n" );
|
||||||
var cLen = content.length;
|
var cLen = content.length;
|
||||||
|
|
||||||
@ -211,35 +191,40 @@
|
|||||||
{
|
{
|
||||||
var lastLine = feeder.lastBuffer.lineNum;
|
var lastLine = feeder.lastBuffer.lineNum;
|
||||||
var lineShift = Y - feeder.moreAt;
|
var lineShift = Y - feeder.moreAt;
|
||||||
|
var thisLine = this.getLine().lineNum;
|
||||||
|
|
||||||
i = lineShift;
|
if( !feeder.EOF )
|
||||||
while( !feeder.EOF )
|
feeder.pan( undefined, lineShift );
|
||||||
|
|
||||||
|
// if it turns out to be the same line
|
||||||
|
// before after panning
|
||||||
|
// we keep scrolling it ( panning )
|
||||||
|
// until the entire line cosumes the screen
|
||||||
|
while( !feeder.EOF && feeder.lastBuffer.lineNum == lastLine )
|
||||||
{
|
{
|
||||||
feeder.pan( undefined, i );
|
feeder.pan( undefined, 1 );
|
||||||
|
|
||||||
// if it turns out to be the same line
|
|
||||||
// before after panning
|
|
||||||
// we keep scrolling it ( panning )
|
|
||||||
// until the entire line cosumes the screen
|
|
||||||
if( feeder.lastBuffer.lineNum == lastLine )
|
|
||||||
{
|
|
||||||
i ++;
|
|
||||||
}
|
|
||||||
else break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// The line number cursor need to be in
|
// The line number cursor need to be in
|
||||||
Y = lastLine + lineShift;
|
Y = thisLine + d;
|
||||||
|
|
||||||
|
i = this.Y;
|
||||||
|
this.Y = 0;
|
||||||
// Calculate the visual line position "i"
|
// Calculate the visual line position "i"
|
||||||
for( i = 0, line = feeder.firstBuffer;
|
for( var line = this.getLine();
|
||||||
line != feeder.lastBuffer;
|
line && line.lineNum != Y && !line.placeholder;
|
||||||
line = line.next )
|
this.Y ++, line = this.getLine() )
|
||||||
{
|
{
|
||||||
if( line.br ) i ++;
|
|
||||||
if( line.lineNum == Y || line.next.placeholder ) break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i = this.Y;
|
||||||
|
|
||||||
|
// Check if this line is collapsed
|
||||||
|
if( !feeder.EOF && feeder.lastBuffer.next.lineNum == line.lineNum )
|
||||||
|
{
|
||||||
|
// If yes, step back to last visible line
|
||||||
|
i --;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.Y = i;
|
this.Y = i;
|
||||||
@ -301,15 +286,16 @@
|
|||||||
{
|
{
|
||||||
var feeder = this.feeder;
|
var feeder = this.feeder;
|
||||||
var line = feeder.firstBuffer;
|
var line = feeder.firstBuffer;
|
||||||
|
var eBuffer = feeder.lastBuffer.next;
|
||||||
for( var i = 0;
|
for( var i = 0;
|
||||||
line != feeder.lastBuffer;
|
line != eBuffer;
|
||||||
line = line.next )
|
line = line.next )
|
||||||
{
|
{
|
||||||
if( line.br ) i ++;
|
if( line.br ) i ++;
|
||||||
if( this.Y == i ) break;
|
if( this.Y == i ) return line;
|
||||||
}
|
}
|
||||||
|
|
||||||
return line;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
// The absX for current Line
|
// The absX for current Line
|
||||||
|
@ -94,7 +94,7 @@
|
|||||||
this.__softRender = function()
|
this.__softRender = function()
|
||||||
{
|
{
|
||||||
var line = _self.lineBuffers[ _self.__rStart ];
|
var line = _self.lineBuffers[ _self.__rStart ];
|
||||||
var steps = _self.__rLength;
|
var steps = _self.__rLength + 1;
|
||||||
|
|
||||||
for( var i = 0;
|
for( var i = 0;
|
||||||
line && i < steps && ( line = line.next ) && placeholdCond( line );
|
line && i < steps && ( line = line.next ) && placeholdCond( line );
|
||||||
|
@ -92,7 +92,9 @@
|
|||||||
// Content feeder
|
// Content feeder
|
||||||
var cfeeder = new LineFeeder( cRange, c );
|
var cfeeder = new LineFeeder( cRange, c );
|
||||||
|
|
||||||
cfeeder.init( content );
|
// This "\n" fixes the last line "\n" not displaying
|
||||||
|
// it will be trimmed after saving
|
||||||
|
cfeeder.init( content + "\n" );
|
||||||
|
|
||||||
// Status can consumes up to full screen, I think
|
// Status can consumes up to full screen, I think
|
||||||
sfeeder = new LineFeeder( r, c );
|
sfeeder = new LineFeeder( r, c );
|
||||||
@ -147,7 +149,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
__readOnly( VimArea.prototype, "content", function() {
|
__readOnly( VimArea.prototype, "content", function() {
|
||||||
return this.contentFeeder.content;
|
return this.contentFeeder.content.slice( 0, -1 );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
ns[ NS_EXPORT ]( EX_CLASS, "VimArea", VimArea );
|
ns[ NS_EXPORT ]( EX_CLASS, "VimArea", VimArea );
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
"INSERT": "-- INSERT --"
|
"INSERT": "-- INSERT --"
|
||||||
, "REPLACE": "-- REPLACE --"
|
, "REPLACE": "-- REPLACE --"
|
||||||
, "MORE": "-- MORE --"
|
, "MORE": "-- MORE --"
|
||||||
|
, "VISUAL": "-- VISUAL --"
|
||||||
, "VISLINE": "-- VISUAL LINE --"
|
, "VISLINE": "-- VISUAL LINE --"
|
||||||
, "WRITE": "\"%1\" %2L, %3C written"
|
, "WRITE": "\"%1\" %2L, %3C written"
|
||||||
, "CONTINUE": "Press ENTER or type command to continue"
|
, "CONTINUE": "Press ENTER or type command to continue"
|
||||||
|
Loading…
Reference in New Issue
Block a user