Skip to content

Commit c2f7e76

Browse files
committed
Suppress shift-selection when handling a binding that requires shift
Context in pull req #281
1 parent eb988d1 commit c2f7e76

File tree

1 file changed

+26
-21
lines changed

1 file changed

+26
-21
lines changed

lib/codemirror.js

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)