8
if (typeof exports == "object" && typeof module == "object")
9
mod(require("../lib/codemirror"), require("../addon/search/searchcursor"), require("../addon/edit/matchbrackets"));
10
else if (typeof define == "function" && define.amd)
11
define(["../lib/codemirror", "../addon/search/searchcursor", "../addon/edit/matchbrackets"], mod);
14
})(function(CodeMirror) {
17
var cmds = CodeMirror.commands;
18
var Pos = CodeMirror.Pos;
21
function findPosSubword(doc, start, dir) {
22
if (dir < 0 && start.ch == 0) return doc.clipPos(Pos(start.line - 1));
23
var line = doc.getLine(start.line);
24
if (dir > 0 && start.ch >= line.length) return doc.clipPos(Pos(start.line + 1, 0));
25
var state = "start", type, startPos = start.ch;
26
for (var pos = startPos, e = dir < 0 ? 0 : line.length, i = 0; pos != e; pos += dir, i++) {
27
var next = line.charAt(dir < 0 ? pos - 1 : pos);
28
var cat = next != "_" && CodeMirror.isWordChar(next) ? "w" : "o";
29
if (cat == "w" && next.toUpperCase() == next) cat = "W";
30
if (state == "start") {
31
if (cat != "o") { state = "in"; type = cat; }
32
else startPos = pos + dir
33
} else if (state == "in") {
35
if (type == "w" && cat == "W" && dir < 0) pos--;
36
if (type == "W" && cat == "w" && dir > 0) {
37
if (pos == startPos + 1) { type = "w"; continue; }
44
return Pos(start.line, pos);
47
function moveSubword(cm, dir) {
48
cm.extendSelectionsBy(function(range) {
49
if (cm.display.shift || cm.doc.extend || range.empty())
50
return findPosSubword(cm.doc, range.head, dir);
52
return dir < 0 ? range.from() : range.to();
56
cmds.goSubwordLeft = function(cm) { moveSubword(cm, -1); };
57
cmds.goSubwordRight = function(cm) { moveSubword(cm, 1); };
59
cmds.scrollLineUp = function(cm) {
60
var info = cm.getScrollInfo();
61
if (!cm.somethingSelected()) {
62
var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, "local");
63
if (cm.getCursor().line >= visibleBottomLine)
64
cm.execCommand("goLineUp");
66
cm.scrollTo(null, info.top - cm.defaultTextHeight());
68
cmds.scrollLineDown = function(cm) {
69
var info = cm.getScrollInfo();
70
if (!cm.somethingSelected()) {
71
var visibleTopLine = cm.lineAtHeight(info.top, "local")+1;
72
if (cm.getCursor().line <= visibleTopLine)
73
cm.execCommand("goLineDown");
75
cm.scrollTo(null, info.top + cm.defaultTextHeight());
78
cmds.splitSelectionByLine = function(cm) {
79
var ranges = cm.listSelections(), lineRanges = [];
80
for (var i = 0; i < ranges.length; i++) {
81
var from = ranges[i].from(), to = ranges[i].to();
82
for (var line = from.line; line <= to.line; ++line)
83
if (!(to.line > from.line && line == to.line && to.ch == 0))
84
lineRanges.push({anchor: line == from.line ? from : Pos(line, 0),
85
head: line == to.line ? to : Pos(line)});
87
cm.setSelections(lineRanges, 0);
90
cmds.singleSelectionTop = function(cm) {
91
var range = cm.listSelections()[0];
92
cm.setSelection(range.anchor, range.head, {scroll: false});
95
cmds.selectLine = function(cm) {
96
var ranges = cm.listSelections(), extended = [];
97
for (var i = 0; i < ranges.length; i++) {
98
var range = ranges[i];
99
extended.push({anchor: Pos(range.from().line, 0),
100
head: Pos(range.to().line + 1, 0)});
102
cm.setSelections(extended);
105
function insertLine(cm, above) {
106
if (cm.isReadOnly()) return CodeMirror.Pass
107
cm.operation(function() {
108
var len = cm.listSelections().length, newSelection = [], last = -1;
109
for (var i = 0; i < len; i++) {
110
var head = cm.listSelections()[i].head;
111
if (head.line <= last) continue;
112
var at = Pos(head.line + (above ? 0 : 1), 0);
113
cm.replaceRange("\n", at, null, "+insertLine");
114
cm.indentLine(at.line, null, true);
115
newSelection.push({head: at, anchor: at});
116
last = head.line + 1;
118
cm.setSelections(newSelection);
120
cm.execCommand("indentAuto");
123
cmds.insertLineAfter = function(cm) { return insertLine(cm, false); };
125
cmds.insertLineBefore = function(cm) { return insertLine(cm, true); };
127
function wordAt(cm, pos) {
128
var start = pos.ch, end = start, line = cm.getLine(pos.line);
129
while (start && CodeMirror.isWordChar(line.charAt(start - 1))) --start;
130
while (end < line.length && CodeMirror.isWordChar(line.charAt(end))) ++end;
131
return {from: Pos(pos.line, start), to: Pos(pos.line, end), word: line.slice(start, end)};
134
cmds.selectNextOccurrence = function(cm) {
135
var from = cm.getCursor("from"), to = cm.getCursor("to");
136
var fullWord = cm.state.sublimeFindFullWord == cm.doc.sel;
137
if (CodeMirror.cmpPos(from, to) == 0) {
138
var word = wordAt(cm, from);
139
if (!word.word) return;
140
cm.setSelection(word.from, word.to);
143
var text = cm.getRange(from, to);
144
var query = fullWord ? new RegExp("\\b" + text + "\\b") : text;
145
var cur = cm.getSearchCursor(query, to);
146
var found = cur.findNext();
148
cur = cm.getSearchCursor(query, Pos(cm.firstLine(), 0));
149
found = cur.findNext();
151
if (!found || isSelectedRange(cm.listSelections(), cur.from(), cur.to())) return
152
cm.addSelection(cur.from(), cur.to());
155
cm.state.sublimeFindFullWord = cm.doc.sel;
158
cmds.skipAndSelectNextOccurrence = function(cm) {
159
var prevAnchor = cm.getCursor("anchor"), prevHead = cm.getCursor("head");
160
cmds.selectNextOccurrence(cm);
161
if (CodeMirror.cmpPos(prevAnchor, prevHead) != 0) {
162
cm.doc.setSelections(cm.doc.listSelections()
163
.filter(function (sel) {
164
return sel.anchor != prevAnchor || sel.head != prevHead;
169
function addCursorToSelection(cm, dir) {
170
var ranges = cm.listSelections(), newRanges = [];
171
for (var i = 0; i < ranges.length; i++) {
172
var range = ranges[i];
173
var newAnchor = cm.findPosV(
174
range.anchor, dir, "line", range.anchor.goalColumn);
175
var newHead = cm.findPosV(
176
range.head, dir, "line", range.head.goalColumn);
177
newAnchor.goalColumn = range.anchor.goalColumn != null ?
178
range.anchor.goalColumn : cm.cursorCoords(range.anchor, "div").left;
179
newHead.goalColumn = range.head.goalColumn != null ?
180
range.head.goalColumn : cm.cursorCoords(range.head, "div").left;
181
var newRange = {anchor: newAnchor, head: newHead};
182
newRanges.push(range);
183
newRanges.push(newRange);
185
cm.setSelections(newRanges);
187
cmds.addCursorToPrevLine = function(cm) { addCursorToSelection(cm, -1); };
188
cmds.addCursorToNextLine = function(cm) { addCursorToSelection(cm, 1); };
190
function isSelectedRange(ranges, from, to) {
191
for (var i = 0; i < ranges.length; i++)
192
if (CodeMirror.cmpPos(ranges[i].from(), from) == 0 &&
193
CodeMirror.cmpPos(ranges[i].to(), to) == 0) return true
197
var mirror = "(){}[]";
198
function selectBetweenBrackets(cm) {
199
var ranges = cm.listSelections(), newRanges = []
200
for (var i = 0; i < ranges.length; i++) {
201
var range = ranges[i], pos = range.head, opening = cm.scanForBracket(pos, -1);
202
if (!opening) return false;
204
var closing = cm.scanForBracket(pos, 1);
205
if (!closing) return false;
206
if (closing.ch == mirror.charAt(mirror.indexOf(opening.ch) + 1)) {
207
var startPos = Pos(opening.pos.line, opening.pos.ch + 1);
208
if (CodeMirror.cmpPos(startPos, range.from()) == 0 &&
209
CodeMirror.cmpPos(closing.pos, range.to()) == 0) {
210
opening = cm.scanForBracket(opening.pos, -1);
211
if (!opening) return false;
213
newRanges.push({anchor: startPos, head: closing.pos});
217
pos = Pos(closing.pos.line, closing.pos.ch + 1);
220
cm.setSelections(newRanges);
224
cmds.selectScope = function(cm) {
225
selectBetweenBrackets(cm) || cm.execCommand("selectAll");
227
cmds.selectBetweenBrackets = function(cm) {
228
if (!selectBetweenBrackets(cm)) return CodeMirror.Pass;
231
function puncType(type) {
232
return !type ? null : /\bpunctuation\b/.test(type) ? type : undefined
235
cmds.goToBracket = function(cm) {
236
cm.extendSelectionsBy(function(range) {
237
var next = cm.scanForBracket(range.head, 1, puncType(cm.getTokenTypeAt(range.head)));
238
if (next && CodeMirror.cmpPos(next.pos, range.head) != 0) return next.pos;
239
var prev = cm.scanForBracket(range.head, -1, puncType(cm.getTokenTypeAt(Pos(range.head.line, range.head.ch + 1))));
240
return prev && Pos(prev.pos.line, prev.pos.ch + 1) || range.head;
244
cmds.swapLineUp = function(cm) {
245
if (cm.isReadOnly()) return CodeMirror.Pass
246
var ranges = cm.listSelections(), linesToMove = [], at = cm.firstLine() - 1, newSels = [];
247
for (var i = 0; i < ranges.length; i++) {
248
var range = ranges[i], from = range.from().line - 1, to = range.to().line;
249
newSels.push({anchor: Pos(range.anchor.line - 1, range.anchor.ch),
250
head: Pos(range.head.line - 1, range.head.ch)});
251
if (range.to().ch == 0 && !range.empty()) --to;
252
if (from > at) linesToMove.push(from, to);
253
else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;
256
cm.operation(function() {
257
for (var i = 0; i < linesToMove.length; i += 2) {
258
var from = linesToMove[i], to = linesToMove[i + 1];
259
var line = cm.getLine(from);
260
cm.replaceRange("", Pos(from, 0), Pos(from + 1, 0), "+swapLine");
261
if (to > cm.lastLine())
262
cm.replaceRange("\n" + line, Pos(cm.lastLine()), null, "+swapLine");
264
cm.replaceRange(line + "\n", Pos(to, 0), null, "+swapLine");
266
cm.setSelections(newSels);
271
cmds.swapLineDown = function(cm) {
272
if (cm.isReadOnly()) return CodeMirror.Pass
273
var ranges = cm.listSelections(), linesToMove = [], at = cm.lastLine() + 1;
274
for (var i = ranges.length - 1; i >= 0; i--) {
275
var range = ranges[i], from = range.to().line + 1, to = range.from().line;
276
if (range.to().ch == 0 && !range.empty()) from--;
277
if (from < at) linesToMove.push(from, to);
278
else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;
281
cm.operation(function() {
282
for (var i = linesToMove.length - 2; i >= 0; i -= 2) {
283
var from = linesToMove[i], to = linesToMove[i + 1];
284
var line = cm.getLine(from);
285
if (from == cm.lastLine())
286
cm.replaceRange("", Pos(from - 1), Pos(from), "+swapLine");
288
cm.replaceRange("", Pos(from, 0), Pos(from + 1, 0), "+swapLine");
289
cm.replaceRange(line + "\n", Pos(to, 0), null, "+swapLine");
295
cmds.toggleCommentIndented = function(cm) {
296
cm.toggleComment({ indent: true });
299
cmds.joinLines = function(cm) {
300
var ranges = cm.listSelections(), joined = [];
301
for (var i = 0; i < ranges.length; i++) {
302
var range = ranges[i], from = range.from();
303
var start = from.line, end = range.to().line;
304
while (i < ranges.length - 1 && ranges[i + 1].from().line == end)
305
end = ranges[++i].to().line;
306
joined.push({start: start, end: end, anchor: !range.empty() && from});
308
cm.operation(function() {
309
var offset = 0, ranges = [];
310
for (var i = 0; i < joined.length; i++) {
312
var anchor = obj.anchor && Pos(obj.anchor.line - offset, obj.anchor.ch), head;
313
for (var line = obj.start; line <= obj.end; line++) {
314
var actual = line - offset;
315
if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1);
316
if (actual < cm.lastLine()) {
317
cm.replaceRange(" ", Pos(actual), Pos(actual + 1, /^\s*/.exec(cm.getLine(actual + 1))[0].length));
321
ranges.push({anchor: anchor || head, head: head});
323
cm.setSelections(ranges, 0);
327
cmds.duplicateLine = function(cm) {
328
cm.operation(function() {
329
var rangeCount = cm.listSelections().length;
330
for (var i = 0; i < rangeCount; i++) {
331
var range = cm.listSelections()[i];
333
cm.replaceRange(cm.getLine(range.head.line) + "\n", Pos(range.head.line, 0));
335
cm.replaceRange(cm.getRange(range.from(), range.to()), range.from());
342
function sortLines(cm, caseSensitive, direction) {
343
if (cm.isReadOnly()) return CodeMirror.Pass
344
var ranges = cm.listSelections(), toSort = [], selected;
345
for (var i = 0; i < ranges.length; i++) {
346
var range = ranges[i];
347
if (range.empty()) continue;
348
var from = range.from().line, to = range.to().line;
349
while (i < ranges.length - 1 && ranges[i + 1].from().line == to)
350
to = ranges[++i].to().line;
351
if (!ranges[i].to().ch) to--;
352
toSort.push(from, to);
354
if (toSort.length) selected = true;
355
else toSort.push(cm.firstLine(), cm.lastLine());
357
cm.operation(function() {
359
for (var i = 0; i < toSort.length; i += 2) {
360
var from = toSort[i], to = toSort[i + 1];
361
var start = Pos(from, 0), end = Pos(to);
362
var lines = cm.getRange(start, end, false);
364
lines.sort(function(a, b) { return a < b ? -direction : a == b ? 0 : direction; });
366
lines.sort(function(a, b) {
367
var au = a.toUpperCase(), bu = b.toUpperCase();
368
if (au != bu) { a = au; b = bu; }
369
return a < b ? -direction : a == b ? 0 : direction;
371
cm.replaceRange(lines, start, end);
372
if (selected) ranges.push({anchor: start, head: Pos(to + 1, 0)});
374
if (selected) cm.setSelections(ranges, 0);
378
cmds.sortLines = function(cm) { sortLines(cm, true, 1); };
379
cmds.reverseSortLines = function(cm) { sortLines(cm, true, -1); };
380
cmds.sortLinesInsensitive = function(cm) { sortLines(cm, false, 1); };
381
cmds.reverseSortLinesInsensitive = function(cm) { sortLines(cm, false, -1); };
383
cmds.nextBookmark = function(cm) {
384
var marks = cm.state.sublimeBookmarks;
385
if (marks) while (marks.length) {
386
var current = marks.shift();
387
var found = current.find();
390
return cm.setSelection(found.from, found.to);
395
cmds.prevBookmark = function(cm) {
396
var marks = cm.state.sublimeBookmarks;
397
if (marks) while (marks.length) {
398
marks.unshift(marks.pop());
399
var found = marks[marks.length - 1].find();
403
return cm.setSelection(found.from, found.to);
407
cmds.toggleBookmark = function(cm) {
408
var ranges = cm.listSelections();
409
var marks = cm.state.sublimeBookmarks || (cm.state.sublimeBookmarks = []);
410
for (var i = 0; i < ranges.length; i++) {
411
var from = ranges[i].from(), to = ranges[i].to();
412
var found = ranges[i].empty() ? cm.findMarksAt(from) : cm.findMarks(from, to);
413
for (var j = 0; j < found.length; j++) {
414
if (found[j].sublimeBookmark) {
416
for (var k = 0; k < marks.length; k++)
417
if (marks[k] == found[j])
418
marks.splice(k--, 1);
422
if (j == found.length)
423
marks.push(cm.markText(from, to, {sublimeBookmark: true, clearWhenEmpty: false}));
427
cmds.clearBookmarks = function(cm) {
428
var marks = cm.state.sublimeBookmarks;
429
if (marks) for (var i = 0; i < marks.length; i++) marks[i].clear();
433
cmds.selectBookmarks = function(cm) {
434
var marks = cm.state.sublimeBookmarks, ranges = [];
435
if (marks) for (var i = 0; i < marks.length; i++) {
436
var found = marks[i].find();
438
marks.splice(i--, 0);
440
ranges.push({anchor: found.from, head: found.to});
443
cm.setSelections(ranges, 0);
446
function modifyWordOrSelection(cm, mod) {
447
cm.operation(function() {
448
var ranges = cm.listSelections(), indices = [], replacements = [];
449
for (var i = 0; i < ranges.length; i++) {
450
var range = ranges[i];
451
if (range.empty()) { indices.push(i); replacements.push(""); }
452
else replacements.push(mod(cm.getRange(range.from(), range.to())));
454
cm.replaceSelections(replacements, "around", "case");
455
for (var i = indices.length - 1, at; i >= 0; i--) {
456
var range = ranges[indices[i]];
457
if (at && CodeMirror.cmpPos(range.head, at) > 0) continue;
458
var word = wordAt(cm, range.head);
460
cm.replaceRange(mod(word.word), word.from, word.to);
465
cmds.smartBackspace = function(cm) {
466
if (cm.somethingSelected()) return CodeMirror.Pass;
468
cm.operation(function() {
469
var cursors = cm.listSelections();
470
var indentUnit = cm.getOption("indentUnit");
472
for (var i = cursors.length - 1; i >= 0; i--) {
473
var cursor = cursors[i].head;
474
var toStartOfLine = cm.getRange({line: cursor.line, ch: 0}, cursor);
475
var column = CodeMirror.countColumn(toStartOfLine, null, cm.getOption("tabSize"));
478
var deletePos = cm.findPosH(cursor, -1, "char", false);
480
if (toStartOfLine && !/\S/.test(toStartOfLine) && column % indentUnit == 0) {
481
var prevIndent = new Pos(cursor.line,
482
CodeMirror.findColumn(toStartOfLine, column - indentUnit, indentUnit));
485
if (prevIndent.ch != cursor.ch) deletePos = prevIndent;
488
cm.replaceRange("", deletePos, cursor, "+delete");
493
cmds.delLineRight = function(cm) {
494
cm.operation(function() {
495
var ranges = cm.listSelections();
496
for (var i = ranges.length - 1; i >= 0; i--)
497
cm.replaceRange("", ranges[i].anchor, Pos(ranges[i].to().line), "+delete");
502
cmds.upcaseAtCursor = function(cm) {
503
modifyWordOrSelection(cm, function(str) { return str.toUpperCase(); });
505
cmds.downcaseAtCursor = function(cm) {
506
modifyWordOrSelection(cm, function(str) { return str.toLowerCase(); });
509
cmds.setSublimeMark = function(cm) {
510
if (cm.state.sublimeMark) cm.state.sublimeMark.clear();
511
cm.state.sublimeMark = cm.setBookmark(cm.getCursor());
513
cmds.selectToSublimeMark = function(cm) {
514
var found = cm.state.sublimeMark && cm.state.sublimeMark.find();
515
if (found) cm.setSelection(cm.getCursor(), found);
517
cmds.deleteToSublimeMark = function(cm) {
518
var found = cm.state.sublimeMark && cm.state.sublimeMark.find();
520
var from = cm.getCursor(), to = found;
521
if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; }
522
cm.state.sublimeKilled = cm.getRange(from, to);
523
cm.replaceRange("", from, to);
526
cmds.swapWithSublimeMark = function(cm) {
527
var found = cm.state.sublimeMark && cm.state.sublimeMark.find();
529
cm.state.sublimeMark.clear();
530
cm.state.sublimeMark = cm.setBookmark(cm.getCursor());
534
cmds.sublimeYank = function(cm) {
535
if (cm.state.sublimeKilled != null)
536
cm.replaceSelection(cm.state.sublimeKilled, null, "paste");
539
cmds.showInCenter = function(cm) {
540
var pos = cm.cursorCoords(null, "local");
541
cm.scrollTo(null, (pos.top + pos.bottom) / 2 - cm.getScrollInfo().clientHeight / 2);
544
function getTarget(cm) {
545
var from = cm.getCursor("from"), to = cm.getCursor("to");
546
if (CodeMirror.cmpPos(from, to) == 0) {
547
var word = wordAt(cm, from);
548
if (!word.word) return;
552
return {from: from, to: to, query: cm.getRange(from, to), word: word};
555
function findAndGoTo(cm, forward) {
556
var target = getTarget(cm);
558
var query = target.query;
559
var cur = cm.getSearchCursor(query, forward ? target.to : target.from);
561
if (forward ? cur.findNext() : cur.findPrevious()) {
562
cm.setSelection(cur.from(), cur.to());
564
cur = cm.getSearchCursor(query, forward ? Pos(cm.firstLine(), 0)
565
: cm.clipPos(Pos(cm.lastLine())));
566
if (forward ? cur.findNext() : cur.findPrevious())
567
cm.setSelection(cur.from(), cur.to());
568
else if (target.word)
569
cm.setSelection(target.from, target.to);
572
cmds.findUnder = function(cm) { findAndGoTo(cm, true); };
573
cmds.findUnderPrevious = function(cm) { findAndGoTo(cm,false); };
574
cmds.findAllUnder = function(cm) {
575
var target = getTarget(cm);
577
var cur = cm.getSearchCursor(target.query);
579
var primaryIndex = -1;
580
while (cur.findNext()) {
581
matches.push({anchor: cur.from(), head: cur.to()});
582
if (cur.from().line <= target.from.line && cur.from().ch <= target.from.ch)
585
cm.setSelections(matches, primaryIndex);
589
var keyMap = CodeMirror.keyMap;
590
keyMap.macSublime = {
591
"Cmd-Left": "goLineStartSmart",
592
"Shift-Tab": "indentLess",
593
"Shift-Ctrl-K": "deleteLine",
594
"Alt-Q": "wrapLines",
595
"Ctrl-Left": "goSubwordLeft",
596
"Ctrl-Right": "goSubwordRight",
597
"Ctrl-Alt-Up": "scrollLineUp",
598
"Ctrl-Alt-Down": "scrollLineDown",
599
"Cmd-L": "selectLine",
600
"Shift-Cmd-L": "splitSelectionByLine",
601
"Esc": "singleSelectionTop",
602
"Cmd-Enter": "insertLineAfter",
603
"Shift-Cmd-Enter": "insertLineBefore",
604
"Cmd-D": "selectNextOccurrence",
605
"Shift-Cmd-Space": "selectScope",
606
"Shift-Cmd-M": "selectBetweenBrackets",
607
"Cmd-M": "goToBracket",
608
"Cmd-Ctrl-Up": "swapLineUp",
609
"Cmd-Ctrl-Down": "swapLineDown",
610
"Cmd-/": "toggleCommentIndented",
611
"Cmd-J": "joinLines",
612
"Shift-Cmd-D": "duplicateLine",
614
"Shift-F5": "reverseSortLines",
615
"Cmd-F5": "sortLinesInsensitive",
616
"Shift-Cmd-F5": "reverseSortLinesInsensitive",
617
"F2": "nextBookmark",
618
"Shift-F2": "prevBookmark",
619
"Cmd-F2": "toggleBookmark",
620
"Shift-Cmd-F2": "clearBookmarks",
621
"Alt-F2": "selectBookmarks",
622
"Backspace": "smartBackspace",
623
"Cmd-K Cmd-D": "skipAndSelectNextOccurrence",
624
"Cmd-K Cmd-K": "delLineRight",
625
"Cmd-K Cmd-U": "upcaseAtCursor",
626
"Cmd-K Cmd-L": "downcaseAtCursor",
627
"Cmd-K Cmd-Space": "setSublimeMark",
628
"Cmd-K Cmd-A": "selectToSublimeMark",
629
"Cmd-K Cmd-W": "deleteToSublimeMark",
630
"Cmd-K Cmd-X": "swapWithSublimeMark",
631
"Cmd-K Cmd-Y": "sublimeYank",
632
"Cmd-K Cmd-C": "showInCenter",
633
"Cmd-K Cmd-G": "clearBookmarks",
634
"Cmd-K Cmd-Backspace": "delLineLeft",
635
"Cmd-K Cmd-1": "foldAll",
636
"Cmd-K Cmd-0": "unfoldAll",
637
"Cmd-K Cmd-J": "unfoldAll",
638
"Ctrl-Shift-Up": "addCursorToPrevLine",
639
"Ctrl-Shift-Down": "addCursorToNextLine",
640
"Cmd-F3": "findUnder",
641
"Shift-Cmd-F3": "findUnderPrevious",
642
"Alt-F3": "findAllUnder",
643
"Shift-Cmd-[": "fold",
644
"Shift-Cmd-]": "unfold",
645
"Cmd-I": "findIncremental",
646
"Shift-Cmd-I": "findIncrementalReverse",
649
"Shift-F3": "findPrev",
650
"fallthrough": "macDefault"
652
CodeMirror.normalizeKeyMap(keyMap.macSublime);
655
"Shift-Tab": "indentLess",
656
"Shift-Ctrl-K": "deleteLine",
657
"Alt-Q": "wrapLines",
658
"Ctrl-T": "transposeChars",
659
"Alt-Left": "goSubwordLeft",
660
"Alt-Right": "goSubwordRight",
661
"Ctrl-Up": "scrollLineUp",
662
"Ctrl-Down": "scrollLineDown",
663
"Ctrl-L": "selectLine",
664
"Shift-Ctrl-L": "splitSelectionByLine",
665
"Esc": "singleSelectionTop",
666
"Ctrl-Enter": "insertLineAfter",
667
"Shift-Ctrl-Enter": "insertLineBefore",
668
"Ctrl-D": "selectNextOccurrence",
669
"Shift-Ctrl-Space": "selectScope",
670
"Shift-Ctrl-M": "selectBetweenBrackets",
671
"Ctrl-M": "goToBracket",
672
"Shift-Ctrl-Up": "swapLineUp",
673
"Shift-Ctrl-Down": "swapLineDown",
674
"Ctrl-/": "toggleCommentIndented",
675
"Ctrl-J": "joinLines",
676
"Shift-Ctrl-D": "duplicateLine",
678
"Shift-F9": "reverseSortLines",
679
"Ctrl-F9": "sortLinesInsensitive",
680
"Shift-Ctrl-F9": "reverseSortLinesInsensitive",
681
"F2": "nextBookmark",
682
"Shift-F2": "prevBookmark",
683
"Ctrl-F2": "toggleBookmark",
684
"Shift-Ctrl-F2": "clearBookmarks",
685
"Alt-F2": "selectBookmarks",
686
"Backspace": "smartBackspace",
687
"Ctrl-K Ctrl-D": "skipAndSelectNextOccurrence",
688
"Ctrl-K Ctrl-K": "delLineRight",
689
"Ctrl-K Ctrl-U": "upcaseAtCursor",
690
"Ctrl-K Ctrl-L": "downcaseAtCursor",
691
"Ctrl-K Ctrl-Space": "setSublimeMark",
692
"Ctrl-K Ctrl-A": "selectToSublimeMark",
693
"Ctrl-K Ctrl-W": "deleteToSublimeMark",
694
"Ctrl-K Ctrl-X": "swapWithSublimeMark",
695
"Ctrl-K Ctrl-Y": "sublimeYank",
696
"Ctrl-K Ctrl-C": "showInCenter",
697
"Ctrl-K Ctrl-G": "clearBookmarks",
698
"Ctrl-K Ctrl-Backspace": "delLineLeft",
699
"Ctrl-K Ctrl-1": "foldAll",
700
"Ctrl-K Ctrl-0": "unfoldAll",
701
"Ctrl-K Ctrl-J": "unfoldAll",
702
"Ctrl-Alt-Up": "addCursorToPrevLine",
703
"Ctrl-Alt-Down": "addCursorToNextLine",
704
"Ctrl-F3": "findUnder",
705
"Shift-Ctrl-F3": "findUnderPrevious",
706
"Alt-F3": "findAllUnder",
707
"Shift-Ctrl-[": "fold",
708
"Shift-Ctrl-]": "unfold",
709
"Ctrl-I": "findIncremental",
710
"Shift-Ctrl-I": "findIncrementalReverse",
713
"Shift-F3": "findPrev",
714
"fallthrough": "pcDefault"
716
CodeMirror.normalizeKeyMap(keyMap.pcSublime);
718
var mac = keyMap.default == keyMap.macDefault;
719
keyMap.sublime = mac ? keyMap.macSublime : keyMap.pcSublime;