@@ -645,6 +645,38 @@ define(function(){
645
645
return / ^ [ A - Z 0 - 9 . : " ] $ / i. test ( key ) ;
646
646
}
647
647
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
+
648
680
Completer . prototype . keypress = function ( event ) {
649
681
/**
650
682
* FIXME: This is a band-aid.
@@ -658,7 +690,7 @@ define(function(){
658
690
var code = event . keyCode ;
659
691
660
692
// don't handle keypress if it's not a character (arrows on FF)
661
- // or ENTER/TAB
693
+ // or ENTER/TAB/BACKSPACE
662
694
if ( event . charCode === 0 ||
663
695
code == keycodes . tab ||
664
696
code == keycodes . enter ||
@@ -719,6 +751,8 @@ define(function(){
719
751
}
720
752
721
753
CodeCell . prototype . _handle_change = function ( cm , changes ) {
754
+ _processCompletionOnChange ( cm , changes , this . completer )
755
+
722
756
clearAllErrors ( this . notebook ) ;
723
757
this . kernel . listErrors ( cm . getValue ( ) , ( msg ) => {
724
758
var content = msg . content ;
@@ -851,22 +885,11 @@ define(function(){
851
885
// is empty. In this case, let CodeMirror handle indentation.
852
886
return false ;
853
887
} 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 ) ;
867
892
}
868
-
869
- this . completer . startCompletion ( doAutoPrint ) ;
870
893
return true ;
871
894
}
872
895
}
0 commit comments