@@ -432,14 +432,31 @@ var CodeMirror = (function() {
432432 e . dataTransfer . setData ( "Text" , txt ) ;
433433 }
434434 function handleKeyBinding ( e ) {
435- if ( e . altGraphKey ) return false ;
436- var bound = lookupKey ( e , options . extraKeys , options . keyMap ) ;
437- var next = keyMap [ options . keyMap ] . auto ;
438- if ( next && ! isModifierKey ( e ) ) options . keyMap = next ;
435+ var name = keyNames [ event . keyCode ] , next = keyMap [ options . keyMap ] . auto , bound , dropShift ;
436+ if ( name == null || e . altGraphKey ) {
437+ if ( next ) options . keyMap = next ;
438+ return null ;
439+ }
440+ if ( event . altKey ) name = "Alt-" + name ;
441+ if ( event . ctrlKey ) name = "Ctrl-" + name ;
442+ if ( event . metaKey ) name = "Cmd-" + name ;
443+ if ( event . shiftKey && ( bound = lookupKey ( "Shift-" + name , options . extraKeys , options . keyMap ) ) ) {
444+ dropShift = true ;
445+ } else {
446+ bound = lookupKey ( name , options . extraKeys , options . keyMap ) ;
447+ }
448+ if ( typeof bound == "string" ) {
449+ if ( commands . propertyIsEnumerable ( bound ) ) bound = commands [ bound ] ;
450+ else bound = null ;
451+ }
452+ if ( next && ( bound || ! isModifierKey ( e ) ) ) options . keyMap = next ;
439453 if ( ! bound ) return false ;
440- if ( typeof bound != "string" ) bound ( instance ) ;
441- else if ( commands . propertyIsEnumerable ( bound ) ) commands [ bound ] ( instance ) ;
442- else if ( ! next ) return false ;
454+ if ( dropShift ) {
455+ var prevShift = shiftSelecting ;
456+ shiftSelecting = null ;
457+ bound ( instance ) ;
458+ shiftSelecting = prevShift ;
459+ } else bound ( instance ) ;
443460 e_preventDefault ( e ) ;
444461 return true ;
445462 }
@@ -1835,12 +1852,7 @@ var CodeMirror = (function() {
18351852 "Alt-D" : "delWordRight" , "Alt-Backspace" : "delWordLeft" , "Ctrl-K" : "killLine" , "Ctrl-T" : "transposeChars"
18361853 } ;
18371854
1838- function lookupKey ( event , extraMap , map ) {
1839- var name = keyNames [ event . keyCode ] ;
1840- if ( name == null ) return null ;
1841- if ( event . altKey ) name = "Alt-" + name ;
1842- if ( event . ctrlKey ) name = "Ctrl-" + name ;
1843- if ( event . metaKey ) name = "Cmd-" + name ;
1855+ function lookupKey ( name , extraMap , map ) {
18441856 function lookup ( name , map , ft ) {
18451857 var found = map [ name ] ;
18461858 if ( found != null ) return found ;
@@ -1853,14 +1865,7 @@ var CodeMirror = (function() {
18531865 }
18541866 return null ;
18551867 }
1856- function lookup0 ( name ) {
1857- return extraMap ? lookup ( name , extraMap , map ) : lookup ( name , keyMap [ map ] ) ;
1858- }
1859- if ( event . shiftKey ) {
1860- var found = lookup0 ( "Shift-" + name ) ;
1861- if ( found != null ) return found ;
1862- }
1863- return lookup0 ( name ) ;
1868+ return extraMap ? lookup ( name , extraMap , map ) : lookup ( name , keyMap [ map ] ) ;
18641869 }
18651870 function isModifierKey ( event ) {
18661871 var name = keyNames [ event . keyCode ] ;
0 commit comments