Insert mode line break bug fix

This commit is contained in:
斟酌 鵬兄 2016-03-20 07:52:44 +08:00
parent dc63a882e3
commit 8769e69f35
6 changed files with 102 additions and 89 deletions

View File

@ -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()

View File

@ -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
} }
}; };

View File

@ -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

View File

@ -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 );

View File

@ -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 );

View File

@ -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"