@@ -645,6 +645,38 @@ define(function(){
645645 return / ^ [ A - Z 0 - 9 . : " ] $ / i. test ( key ) ;
646646 }
647647
648+ function _processCompletionOnChange ( cm , changes , completer ) {
649+ var close_completion = false
650+ for ( var i = 0 ; i < changes . length ; ++ i ) {
651+ var change = changes [ i ] ;
652+ if ( change . origin === "+input" ) {
653+ for ( var j = 0 ; j < change . text . length ; ++ j ) {
654+ var t = change . text [ j ] ;
655+ for ( var k = 0 ; k < t . length ; ++ k ) {
656+ if ( _isCompletionKey ( t [ k ] ) ) {
657+ completer . startCompletion ( false ) ;
658+ return ;
659+ }
660+ }
661+ }
662+ } else {
663+ var line = change . from . line ;
664+ var ch = change . from . ch ;
665+ if ( ch === 0 ) continue ;
666+ var removed = change . removed ;
667+ if ( removed . length > 1 || removed [ 0 ] . length > 0 ) {
668+ var prevChar = cm . getRange ( { line : line , ch : ch - 1 } , change . from ) ;
669+ if ( _isCompletionKey ( prevChar ) ) {
670+ completer . startCompletion ( false ) ;
671+ return ;
672+ }
673+ else close_completion = true ;
674+ }
675+ }
676+ }
677+ if ( close_completion ) completer . close ( ) ;
678+ }
679+
648680 Completer . prototype . keypress = function ( event ) {
649681 /**
650682 * FIXME: This is a band-aid.
@@ -658,7 +690,7 @@ define(function(){
658690 var code = event . keyCode ;
659691
660692 // don't handle keypress if it's not a character (arrows on FF)
661- // or ENTER/TAB
693+ // or ENTER/TAB/BACKSPACE
662694 if ( event . charCode === 0 ||
663695 code == keycodes . tab ||
664696 code == keycodes . enter ||
@@ -719,6 +751,8 @@ define(function(){
719751 }
720752
721753 CodeCell . prototype . _handle_change = function ( cm , changes ) {
754+ _processCompletionOnChange ( cm , changes , this . completer )
755+
722756 clearAllErrors ( this . notebook ) ;
723757 this . kernel . listErrors ( cm . getValue ( ) , ( msg ) => {
724758 var content = msg . content ;
@@ -851,22 +885,11 @@ define(function(){
851885 // is empty. In this case, let CodeMirror handle indentation.
852886 return false ;
853887 } else {
854- event . preventDefault ( ) ;
855- event . codemirrorIgnore = true ;
856-
857- var doAutoPrint = event . keyCode === keycodes . tab ;
858-
859- if ( ! doAutoPrint && event . key . length === 1 ) {
860- editor . replaceRange ( event . key , cur , cur ) ;
861- } else if ( event . keyCode === keycodes . backspace ) {
862- var fromInd = this . code_mirror . indexFromPos ( cur ) - 1 ;
863-
864- if ( fromInd >= 0 ) {
865- editor . replaceRange ( "" , this . code_mirror . posFromIndex ( fromInd ) , cur ) ;
866- }
888+ if ( event . keyCode === keycodes . tab ) {
889+ event . preventDefault ( ) ;
890+ event . codemirrorIgnore = true ;
891+ this . completer . startCompletion ( true ) ;
867892 }
868-
869- this . completer . startCompletion ( doAutoPrint ) ;
870893 return true ;
871894 }
872895 }
0 commit comments