annotate .cms/lib/codemirror/keymap/sublime.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 // A rough approximation of Sublime Text's keybindings
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 // Depends on addon/search/searchcursor.js and optionally addon/dialog/dialogs.js
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 (function(mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 mod(require("../lib/codemirror"), require("../addon/search/searchcursor"), require("../addon/edit/matchbrackets"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 define(["../lib/codemirror", "../addon/search/searchcursor", "../addon/edit/matchbrackets"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 })(function(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 var cmds = CodeMirror.commands;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 var Pos = CodeMirror.Pos;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 // This is not exactly Sublime's algorithm. I couldn't make heads or tails of that.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 function findPosSubword(doc, start, dir) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 if (dir < 0 && start.ch == 0) return doc.clipPos(Pos(start.line - 1));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 var line = doc.getLine(start.line);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 if (dir > 0 && start.ch >= line.length) return doc.clipPos(Pos(start.line + 1, 0));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 var state = "start", type, startPos = start.ch;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 for (var pos = startPos, e = dir < 0 ? 0 : line.length, i = 0; pos != e; pos += dir, i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 var next = line.charAt(dir < 0 ? pos - 1 : pos);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 var cat = next != "_" && CodeMirror.isWordChar(next) ? "w" : "o";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 if (cat == "w" && next.toUpperCase() == next) cat = "W";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 if (state == "start") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 if (cat != "o") { state = "in"; type = cat; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 else startPos = pos + dir
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 } else if (state == "in") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 if (type != cat) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 if (type == "w" && cat == "W" && dir < 0) pos--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 if (type == "W" && cat == "w" && dir > 0) { // From uppercase to lowercase
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 if (pos == startPos + 1) { type = "w"; continue; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 else pos--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 return Pos(start.line, pos);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 function moveSubword(cm, dir) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 cm.extendSelectionsBy(function(range) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 if (cm.display.shift || cm.doc.extend || range.empty())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 return findPosSubword(cm.doc, range.head, dir);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 return dir < 0 ? range.from() : range.to();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 cmds.goSubwordLeft = function(cm) { moveSubword(cm, -1); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 cmds.goSubwordRight = function(cm) { moveSubword(cm, 1); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 cmds.scrollLineUp = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 var info = cm.getScrollInfo();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 if (!cm.somethingSelected()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, "local");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 if (cm.getCursor().line >= visibleBottomLine)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 cm.execCommand("goLineUp");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 cm.scrollTo(null, info.top - cm.defaultTextHeight());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 cmds.scrollLineDown = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 var info = cm.getScrollInfo();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 if (!cm.somethingSelected()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 var visibleTopLine = cm.lineAtHeight(info.top, "local")+1;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 if (cm.getCursor().line <= visibleTopLine)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 cm.execCommand("goLineDown");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 cm.scrollTo(null, info.top + cm.defaultTextHeight());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 cmds.splitSelectionByLine = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 var ranges = cm.listSelections(), lineRanges = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 for (var i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 var from = ranges[i].from(), to = ranges[i].to();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 for (var line = from.line; line <= to.line; ++line)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 if (!(to.line > from.line && line == to.line && to.ch == 0))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 lineRanges.push({anchor: line == from.line ? from : Pos(line, 0),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 head: line == to.line ? to : Pos(line)});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 cm.setSelections(lineRanges, 0);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 cmds.singleSelectionTop = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 var range = cm.listSelections()[0];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 cm.setSelection(range.anchor, range.head, {scroll: false});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 cmds.selectLine = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 var ranges = cm.listSelections(), extended = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 for (var i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 var range = ranges[i];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 extended.push({anchor: Pos(range.from().line, 0),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 head: Pos(range.to().line + 1, 0)});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 cm.setSelections(extended);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 function insertLine(cm, above) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 if (cm.isReadOnly()) return CodeMirror.Pass
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 cm.operation(function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 var len = cm.listSelections().length, newSelection = [], last = -1;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 for (var i = 0; i < len; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 var head = cm.listSelections()[i].head;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 if (head.line <= last) continue;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 var at = Pos(head.line + (above ? 0 : 1), 0);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 cm.replaceRange("\n", at, null, "+insertLine");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 cm.indentLine(at.line, null, true);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 newSelection.push({head: at, anchor: at});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 last = head.line + 1;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 cm.setSelections(newSelection);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 cm.execCommand("indentAuto");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 cmds.insertLineAfter = function(cm) { return insertLine(cm, false); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 cmds.insertLineBefore = function(cm) { return insertLine(cm, true); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 function wordAt(cm, pos) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 var start = pos.ch, end = start, line = cm.getLine(pos.line);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 while (start && CodeMirror.isWordChar(line.charAt(start - 1))) --start;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 while (end < line.length && CodeMirror.isWordChar(line.charAt(end))) ++end;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 return {from: Pos(pos.line, start), to: Pos(pos.line, end), word: line.slice(start, end)};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 cmds.selectNextOccurrence = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 var from = cm.getCursor("from"), to = cm.getCursor("to");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 var fullWord = cm.state.sublimeFindFullWord == cm.doc.sel;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 if (CodeMirror.cmpPos(from, to) == 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 var word = wordAt(cm, from);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 if (!word.word) return;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 cm.setSelection(word.from, word.to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 fullWord = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 var text = cm.getRange(from, to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 var query = fullWord ? new RegExp("\\b" + text + "\\b") : text;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 var cur = cm.getSearchCursor(query, to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 var found = cur.findNext();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 if (!found) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 cur = cm.getSearchCursor(query, Pos(cm.firstLine(), 0));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 found = cur.findNext();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 if (!found || isSelectedRange(cm.listSelections(), cur.from(), cur.to())) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 cm.addSelection(cur.from(), cur.to());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 if (fullWord)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 cm.state.sublimeFindFullWord = cm.doc.sel;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 cmds.skipAndSelectNextOccurrence = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 var prevAnchor = cm.getCursor("anchor"), prevHead = cm.getCursor("head");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 cmds.selectNextOccurrence(cm);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 if (CodeMirror.cmpPos(prevAnchor, prevHead) != 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 cm.doc.setSelections(cm.doc.listSelections()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 .filter(function (sel) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 return sel.anchor != prevAnchor || sel.head != prevHead;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 }));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 function addCursorToSelection(cm, dir) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 var ranges = cm.listSelections(), newRanges = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 for (var i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 var range = ranges[i];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 var newAnchor = cm.findPosV(
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 range.anchor, dir, "line", range.anchor.goalColumn);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 var newHead = cm.findPosV(
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 range.head, dir, "line", range.head.goalColumn);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 newAnchor.goalColumn = range.anchor.goalColumn != null ?
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 range.anchor.goalColumn : cm.cursorCoords(range.anchor, "div").left;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 newHead.goalColumn = range.head.goalColumn != null ?
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 range.head.goalColumn : cm.cursorCoords(range.head, "div").left;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 var newRange = {anchor: newAnchor, head: newHead};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 newRanges.push(range);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 newRanges.push(newRange);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 cm.setSelections(newRanges);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 cmds.addCursorToPrevLine = function(cm) { addCursorToSelection(cm, -1); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 cmds.addCursorToNextLine = function(cm) { addCursorToSelection(cm, 1); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 function isSelectedRange(ranges, from, to) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 for (var i = 0; i < ranges.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192 if (CodeMirror.cmpPos(ranges[i].from(), from) == 0 &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 CodeMirror.cmpPos(ranges[i].to(), to) == 0) return true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 return false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 var mirror = "(){}[]";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 function selectBetweenBrackets(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199 var ranges = cm.listSelections(), newRanges = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 for (var i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 var range = ranges[i], pos = range.head, opening = cm.scanForBracket(pos, -1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 if (!opening) return false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203 for (;;) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 var closing = cm.scanForBracket(pos, 1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 if (!closing) return false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 if (closing.ch == mirror.charAt(mirror.indexOf(opening.ch) + 1)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207 var startPos = Pos(opening.pos.line, opening.pos.ch + 1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 if (CodeMirror.cmpPos(startPos, range.from()) == 0 &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209 CodeMirror.cmpPos(closing.pos, range.to()) == 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210 opening = cm.scanForBracket(opening.pos, -1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
211 if (!opening) return false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213 newRanges.push({anchor: startPos, head: closing.pos});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
217 pos = Pos(closing.pos.line, closing.pos.ch + 1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
218 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
219 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
220 cm.setSelections(newRanges);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
221 return true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
222 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
223
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
224 cmds.selectScope = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
225 selectBetweenBrackets(cm) || cm.execCommand("selectAll");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
226 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
227 cmds.selectBetweenBrackets = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
228 if (!selectBetweenBrackets(cm)) return CodeMirror.Pass;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
229 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
230
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
231 function puncType(type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
232 return !type ? null : /\bpunctuation\b/.test(type) ? type : undefined
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
233 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
234
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
235 cmds.goToBracket = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
236 cm.extendSelectionsBy(function(range) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
237 var next = cm.scanForBracket(range.head, 1, puncType(cm.getTokenTypeAt(range.head)));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
238 if (next && CodeMirror.cmpPos(next.pos, range.head) != 0) return next.pos;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
239 var prev = cm.scanForBracket(range.head, -1, puncType(cm.getTokenTypeAt(Pos(range.head.line, range.head.ch + 1))));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
240 return prev && Pos(prev.pos.line, prev.pos.ch + 1) || range.head;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
241 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
242 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
243
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
244 cmds.swapLineUp = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
245 if (cm.isReadOnly()) return CodeMirror.Pass
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
246 var ranges = cm.listSelections(), linesToMove = [], at = cm.firstLine() - 1, newSels = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
247 for (var i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
248 var range = ranges[i], from = range.from().line - 1, to = range.to().line;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
249 newSels.push({anchor: Pos(range.anchor.line - 1, range.anchor.ch),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
250 head: Pos(range.head.line - 1, range.head.ch)});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
251 if (range.to().ch == 0 && !range.empty()) --to;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
252 if (from > at) linesToMove.push(from, to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
253 else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
254 at = to;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
255 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
256 cm.operation(function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
257 for (var i = 0; i < linesToMove.length; i += 2) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
258 var from = linesToMove[i], to = linesToMove[i + 1];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
259 var line = cm.getLine(from);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
260 cm.replaceRange("", Pos(from, 0), Pos(from + 1, 0), "+swapLine");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
261 if (to > cm.lastLine())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
262 cm.replaceRange("\n" + line, Pos(cm.lastLine()), null, "+swapLine");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
263 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
264 cm.replaceRange(line + "\n", Pos(to, 0), null, "+swapLine");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
265 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
266 cm.setSelections(newSels);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
267 cm.scrollIntoView();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
268 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
269 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
270
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
271 cmds.swapLineDown = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
272 if (cm.isReadOnly()) return CodeMirror.Pass
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
273 var ranges = cm.listSelections(), linesToMove = [], at = cm.lastLine() + 1;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
274 for (var i = ranges.length - 1; i >= 0; i--) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
275 var range = ranges[i], from = range.to().line + 1, to = range.from().line;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
276 if (range.to().ch == 0 && !range.empty()) from--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
277 if (from < at) linesToMove.push(from, to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
278 else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
279 at = to;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
280 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
281 cm.operation(function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
282 for (var i = linesToMove.length - 2; i >= 0; i -= 2) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
283 var from = linesToMove[i], to = linesToMove[i + 1];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
284 var line = cm.getLine(from);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
285 if (from == cm.lastLine())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
286 cm.replaceRange("", Pos(from - 1), Pos(from), "+swapLine");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
287 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
288 cm.replaceRange("", Pos(from, 0), Pos(from + 1, 0), "+swapLine");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
289 cm.replaceRange(line + "\n", Pos(to, 0), null, "+swapLine");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
290 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
291 cm.scrollIntoView();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
292 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
293 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
294
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
295 cmds.toggleCommentIndented = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
296 cm.toggleComment({ indent: true });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
297 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
298
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
299 cmds.joinLines = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
300 var ranges = cm.listSelections(), joined = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
301 for (var i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
302 var range = ranges[i], from = range.from();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
303 var start = from.line, end = range.to().line;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
304 while (i < ranges.length - 1 && ranges[i + 1].from().line == end)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
305 end = ranges[++i].to().line;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
306 joined.push({start: start, end: end, anchor: !range.empty() && from});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
307 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
308 cm.operation(function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
309 var offset = 0, ranges = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
310 for (var i = 0; i < joined.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
311 var obj = joined[i];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
312 var anchor = obj.anchor && Pos(obj.anchor.line - offset, obj.anchor.ch), head;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
313 for (var line = obj.start; line <= obj.end; line++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
314 var actual = line - offset;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
315 if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
316 if (actual < cm.lastLine()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
317 cm.replaceRange(" ", Pos(actual), Pos(actual + 1, /^\s*/.exec(cm.getLine(actual + 1))[0].length));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
318 ++offset;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
319 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
320 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
321 ranges.push({anchor: anchor || head, head: head});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
322 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
323 cm.setSelections(ranges, 0);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
324 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
325 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
326
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
327 cmds.duplicateLine = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
328 cm.operation(function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
329 var rangeCount = cm.listSelections().length;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
330 for (var i = 0; i < rangeCount; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
331 var range = cm.listSelections()[i];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
332 if (range.empty())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
333 cm.replaceRange(cm.getLine(range.head.line) + "\n", Pos(range.head.line, 0));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
334 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
335 cm.replaceRange(cm.getRange(range.from(), range.to()), range.from());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
336 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
337 cm.scrollIntoView();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
338 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
339 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
340
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
341
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
342 function sortLines(cm, caseSensitive, direction) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
343 if (cm.isReadOnly()) return CodeMirror.Pass
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
344 var ranges = cm.listSelections(), toSort = [], selected;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
345 for (var i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
346 var range = ranges[i];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
347 if (range.empty()) continue;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
348 var from = range.from().line, to = range.to().line;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
349 while (i < ranges.length - 1 && ranges[i + 1].from().line == to)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
350 to = ranges[++i].to().line;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
351 if (!ranges[i].to().ch) to--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
352 toSort.push(from, to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
353 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
354 if (toSort.length) selected = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
355 else toSort.push(cm.firstLine(), cm.lastLine());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
356
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
357 cm.operation(function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
358 var ranges = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
359 for (var i = 0; i < toSort.length; i += 2) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
360 var from = toSort[i], to = toSort[i + 1];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
361 var start = Pos(from, 0), end = Pos(to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
362 var lines = cm.getRange(start, end, false);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
363 if (caseSensitive)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
364 lines.sort(function(a, b) { return a < b ? -direction : a == b ? 0 : direction; });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
365 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
366 lines.sort(function(a, b) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
367 var au = a.toUpperCase(), bu = b.toUpperCase();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
368 if (au != bu) { a = au; b = bu; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
369 return a < b ? -direction : a == b ? 0 : direction;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
370 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
371 cm.replaceRange(lines, start, end);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
372 if (selected) ranges.push({anchor: start, head: Pos(to + 1, 0)});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
373 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
374 if (selected) cm.setSelections(ranges, 0);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
375 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
376 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
377
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
378 cmds.sortLines = function(cm) { sortLines(cm, true, 1); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
379 cmds.reverseSortLines = function(cm) { sortLines(cm, true, -1); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
380 cmds.sortLinesInsensitive = function(cm) { sortLines(cm, false, 1); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
381 cmds.reverseSortLinesInsensitive = function(cm) { sortLines(cm, false, -1); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
382
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
383 cmds.nextBookmark = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
384 var marks = cm.state.sublimeBookmarks;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
385 if (marks) while (marks.length) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
386 var current = marks.shift();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
387 var found = current.find();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
388 if (found) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
389 marks.push(current);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
390 return cm.setSelection(found.from, found.to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
391 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
392 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
393 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
394
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
395 cmds.prevBookmark = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
396 var marks = cm.state.sublimeBookmarks;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
397 if (marks) while (marks.length) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
398 marks.unshift(marks.pop());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
399 var found = marks[marks.length - 1].find();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
400 if (!found)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
401 marks.pop();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
402 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
403 return cm.setSelection(found.from, found.to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
404 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
405 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
406
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
407 cmds.toggleBookmark = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
408 var ranges = cm.listSelections();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
409 var marks = cm.state.sublimeBookmarks || (cm.state.sublimeBookmarks = []);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
410 for (var i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
411 var from = ranges[i].from(), to = ranges[i].to();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
412 var found = ranges[i].empty() ? cm.findMarksAt(from) : cm.findMarks(from, to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
413 for (var j = 0; j < found.length; j++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
414 if (found[j].sublimeBookmark) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
415 found[j].clear();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
416 for (var k = 0; k < marks.length; k++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
417 if (marks[k] == found[j])
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
418 marks.splice(k--, 1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
419 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
420 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
421 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
422 if (j == found.length)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
423 marks.push(cm.markText(from, to, {sublimeBookmark: true, clearWhenEmpty: false}));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
424 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
425 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
426
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
427 cmds.clearBookmarks = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
428 var marks = cm.state.sublimeBookmarks;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
429 if (marks) for (var i = 0; i < marks.length; i++) marks[i].clear();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
430 marks.length = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
431 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
432
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
433 cmds.selectBookmarks = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
434 var marks = cm.state.sublimeBookmarks, ranges = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
435 if (marks) for (var i = 0; i < marks.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
436 var found = marks[i].find();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
437 if (!found)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
438 marks.splice(i--, 0);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
439 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
440 ranges.push({anchor: found.from, head: found.to});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
441 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
442 if (ranges.length)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
443 cm.setSelections(ranges, 0);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
444 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
445
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
446 function modifyWordOrSelection(cm, mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
447 cm.operation(function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
448 var ranges = cm.listSelections(), indices = [], replacements = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
449 for (var i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
450 var range = ranges[i];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
451 if (range.empty()) { indices.push(i); replacements.push(""); }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
452 else replacements.push(mod(cm.getRange(range.from(), range.to())));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
453 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
454 cm.replaceSelections(replacements, "around", "case");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
455 for (var i = indices.length - 1, at; i >= 0; i--) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
456 var range = ranges[indices[i]];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
457 if (at && CodeMirror.cmpPos(range.head, at) > 0) continue;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
458 var word = wordAt(cm, range.head);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
459 at = word.from;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
460 cm.replaceRange(mod(word.word), word.from, word.to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
461 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
462 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
463 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
464
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
465 cmds.smartBackspace = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
466 if (cm.somethingSelected()) return CodeMirror.Pass;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
467
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
468 cm.operation(function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
469 var cursors = cm.listSelections();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
470 var indentUnit = cm.getOption("indentUnit");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
471
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
472 for (var i = cursors.length - 1; i >= 0; i--) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
473 var cursor = cursors[i].head;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
474 var toStartOfLine = cm.getRange({line: cursor.line, ch: 0}, cursor);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
475 var column = CodeMirror.countColumn(toStartOfLine, null, cm.getOption("tabSize"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
476
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
477 // Delete by one character by default
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
478 var deletePos = cm.findPosH(cursor, -1, "char", false);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
479
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
480 if (toStartOfLine && !/\S/.test(toStartOfLine) && column % indentUnit == 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
481 var prevIndent = new Pos(cursor.line,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
482 CodeMirror.findColumn(toStartOfLine, column - indentUnit, indentUnit));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
483
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
484 // Smart delete only if we found a valid prevIndent location
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
485 if (prevIndent.ch != cursor.ch) deletePos = prevIndent;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
486 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
487
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
488 cm.replaceRange("", deletePos, cursor, "+delete");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
489 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
490 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
491 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
492
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
493 cmds.delLineRight = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
494 cm.operation(function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
495 var ranges = cm.listSelections();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
496 for (var i = ranges.length - 1; i >= 0; i--)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
497 cm.replaceRange("", ranges[i].anchor, Pos(ranges[i].to().line), "+delete");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
498 cm.scrollIntoView();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
499 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
500 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
501
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
502 cmds.upcaseAtCursor = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
503 modifyWordOrSelection(cm, function(str) { return str.toUpperCase(); });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
504 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
505 cmds.downcaseAtCursor = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
506 modifyWordOrSelection(cm, function(str) { return str.toLowerCase(); });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
507 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
508
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
509 cmds.setSublimeMark = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
510 if (cm.state.sublimeMark) cm.state.sublimeMark.clear();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
511 cm.state.sublimeMark = cm.setBookmark(cm.getCursor());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
512 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
513 cmds.selectToSublimeMark = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
514 var found = cm.state.sublimeMark && cm.state.sublimeMark.find();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
515 if (found) cm.setSelection(cm.getCursor(), found);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
516 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
517 cmds.deleteToSublimeMark = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
518 var found = cm.state.sublimeMark && cm.state.sublimeMark.find();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
519 if (found) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
520 var from = cm.getCursor(), to = found;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
521 if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
522 cm.state.sublimeKilled = cm.getRange(from, to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
523 cm.replaceRange("", from, to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
524 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
525 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
526 cmds.swapWithSublimeMark = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
527 var found = cm.state.sublimeMark && cm.state.sublimeMark.find();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
528 if (found) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
529 cm.state.sublimeMark.clear();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
530 cm.state.sublimeMark = cm.setBookmark(cm.getCursor());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
531 cm.setCursor(found);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
532 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
533 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
534 cmds.sublimeYank = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
535 if (cm.state.sublimeKilled != null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
536 cm.replaceSelection(cm.state.sublimeKilled, null, "paste");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
537 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
538
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
539 cmds.showInCenter = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
540 var pos = cm.cursorCoords(null, "local");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
541 cm.scrollTo(null, (pos.top + pos.bottom) / 2 - cm.getScrollInfo().clientHeight / 2);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
542 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
543
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
544 function getTarget(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
545 var from = cm.getCursor("from"), to = cm.getCursor("to");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
546 if (CodeMirror.cmpPos(from, to) == 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
547 var word = wordAt(cm, from);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
548 if (!word.word) return;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
549 from = word.from;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
550 to = word.to;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
551 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
552 return {from: from, to: to, query: cm.getRange(from, to), word: word};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
553 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
554
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
555 function findAndGoTo(cm, forward) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
556 var target = getTarget(cm);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
557 if (!target) return;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
558 var query = target.query;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
559 var cur = cm.getSearchCursor(query, forward ? target.to : target.from);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
560
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
561 if (forward ? cur.findNext() : cur.findPrevious()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
562 cm.setSelection(cur.from(), cur.to());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
563 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
564 cur = cm.getSearchCursor(query, forward ? Pos(cm.firstLine(), 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
565 : cm.clipPos(Pos(cm.lastLine())));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
566 if (forward ? cur.findNext() : cur.findPrevious())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
567 cm.setSelection(cur.from(), cur.to());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
568 else if (target.word)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
569 cm.setSelection(target.from, target.to);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
570 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
571 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
572 cmds.findUnder = function(cm) { findAndGoTo(cm, true); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
573 cmds.findUnderPrevious = function(cm) { findAndGoTo(cm,false); };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
574 cmds.findAllUnder = function(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
575 var target = getTarget(cm);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
576 if (!target) return;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
577 var cur = cm.getSearchCursor(target.query);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
578 var matches = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
579 var primaryIndex = -1;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
580 while (cur.findNext()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
581 matches.push({anchor: cur.from(), head: cur.to()});
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
582 if (cur.from().line <= target.from.line && cur.from().ch <= target.from.ch)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
583 primaryIndex++;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
584 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
585 cm.setSelections(matches, primaryIndex);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
586 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
587
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
588
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
589 var keyMap = CodeMirror.keyMap;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
590 keyMap.macSublime = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
591 "Cmd-Left": "goLineStartSmart",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
592 "Shift-Tab": "indentLess",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
593 "Shift-Ctrl-K": "deleteLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
594 "Alt-Q": "wrapLines",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
595 "Ctrl-Left": "goSubwordLeft",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
596 "Ctrl-Right": "goSubwordRight",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
597 "Ctrl-Alt-Up": "scrollLineUp",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
598 "Ctrl-Alt-Down": "scrollLineDown",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
599 "Cmd-L": "selectLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
600 "Shift-Cmd-L": "splitSelectionByLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
601 "Esc": "singleSelectionTop",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
602 "Cmd-Enter": "insertLineAfter",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
603 "Shift-Cmd-Enter": "insertLineBefore",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
604 "Cmd-D": "selectNextOccurrence",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
605 "Shift-Cmd-Space": "selectScope",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
606 "Shift-Cmd-M": "selectBetweenBrackets",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
607 "Cmd-M": "goToBracket",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
608 "Cmd-Ctrl-Up": "swapLineUp",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
609 "Cmd-Ctrl-Down": "swapLineDown",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
610 "Cmd-/": "toggleCommentIndented",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
611 "Cmd-J": "joinLines",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
612 "Shift-Cmd-D": "duplicateLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
613 "F5": "sortLines",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
614 "Shift-F5": "reverseSortLines",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
615 "Cmd-F5": "sortLinesInsensitive",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
616 "Shift-Cmd-F5": "reverseSortLinesInsensitive",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
617 "F2": "nextBookmark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
618 "Shift-F2": "prevBookmark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
619 "Cmd-F2": "toggleBookmark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
620 "Shift-Cmd-F2": "clearBookmarks",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
621 "Alt-F2": "selectBookmarks",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
622 "Backspace": "smartBackspace",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
623 "Cmd-K Cmd-D": "skipAndSelectNextOccurrence",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
624 "Cmd-K Cmd-K": "delLineRight",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
625 "Cmd-K Cmd-U": "upcaseAtCursor",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
626 "Cmd-K Cmd-L": "downcaseAtCursor",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
627 "Cmd-K Cmd-Space": "setSublimeMark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
628 "Cmd-K Cmd-A": "selectToSublimeMark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
629 "Cmd-K Cmd-W": "deleteToSublimeMark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
630 "Cmd-K Cmd-X": "swapWithSublimeMark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
631 "Cmd-K Cmd-Y": "sublimeYank",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
632 "Cmd-K Cmd-C": "showInCenter",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
633 "Cmd-K Cmd-G": "clearBookmarks",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
634 "Cmd-K Cmd-Backspace": "delLineLeft",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
635 "Cmd-K Cmd-1": "foldAll",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
636 "Cmd-K Cmd-0": "unfoldAll",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
637 "Cmd-K Cmd-J": "unfoldAll",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
638 "Ctrl-Shift-Up": "addCursorToPrevLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
639 "Ctrl-Shift-Down": "addCursorToNextLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
640 "Cmd-F3": "findUnder",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
641 "Shift-Cmd-F3": "findUnderPrevious",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
642 "Alt-F3": "findAllUnder",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
643 "Shift-Cmd-[": "fold",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
644 "Shift-Cmd-]": "unfold",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
645 "Cmd-I": "findIncremental",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
646 "Shift-Cmd-I": "findIncrementalReverse",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
647 "Cmd-H": "replace",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
648 "F3": "findNext",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
649 "Shift-F3": "findPrev",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
650 "fallthrough": "macDefault"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
651 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
652 CodeMirror.normalizeKeyMap(keyMap.macSublime);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
653
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
654 keyMap.pcSublime = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
655 "Shift-Tab": "indentLess",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
656 "Shift-Ctrl-K": "deleteLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
657 "Alt-Q": "wrapLines",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
658 "Ctrl-T": "transposeChars",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
659 "Alt-Left": "goSubwordLeft",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
660 "Alt-Right": "goSubwordRight",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
661 "Ctrl-Up": "scrollLineUp",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
662 "Ctrl-Down": "scrollLineDown",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
663 "Ctrl-L": "selectLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
664 "Shift-Ctrl-L": "splitSelectionByLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
665 "Esc": "singleSelectionTop",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
666 "Ctrl-Enter": "insertLineAfter",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
667 "Shift-Ctrl-Enter": "insertLineBefore",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
668 "Ctrl-D": "selectNextOccurrence",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
669 "Shift-Ctrl-Space": "selectScope",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
670 "Shift-Ctrl-M": "selectBetweenBrackets",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
671 "Ctrl-M": "goToBracket",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
672 "Shift-Ctrl-Up": "swapLineUp",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
673 "Shift-Ctrl-Down": "swapLineDown",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
674 "Ctrl-/": "toggleCommentIndented",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
675 "Ctrl-J": "joinLines",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
676 "Shift-Ctrl-D": "duplicateLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
677 "F9": "sortLines",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
678 "Shift-F9": "reverseSortLines",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
679 "Ctrl-F9": "sortLinesInsensitive",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
680 "Shift-Ctrl-F9": "reverseSortLinesInsensitive",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
681 "F2": "nextBookmark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
682 "Shift-F2": "prevBookmark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
683 "Ctrl-F2": "toggleBookmark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
684 "Shift-Ctrl-F2": "clearBookmarks",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
685 "Alt-F2": "selectBookmarks",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
686 "Backspace": "smartBackspace",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
687 "Ctrl-K Ctrl-D": "skipAndSelectNextOccurrence",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
688 "Ctrl-K Ctrl-K": "delLineRight",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
689 "Ctrl-K Ctrl-U": "upcaseAtCursor",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
690 "Ctrl-K Ctrl-L": "downcaseAtCursor",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
691 "Ctrl-K Ctrl-Space": "setSublimeMark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
692 "Ctrl-K Ctrl-A": "selectToSublimeMark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
693 "Ctrl-K Ctrl-W": "deleteToSublimeMark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
694 "Ctrl-K Ctrl-X": "swapWithSublimeMark",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
695 "Ctrl-K Ctrl-Y": "sublimeYank",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
696 "Ctrl-K Ctrl-C": "showInCenter",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
697 "Ctrl-K Ctrl-G": "clearBookmarks",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
698 "Ctrl-K Ctrl-Backspace": "delLineLeft",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
699 "Ctrl-K Ctrl-1": "foldAll",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
700 "Ctrl-K Ctrl-0": "unfoldAll",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
701 "Ctrl-K Ctrl-J": "unfoldAll",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
702 "Ctrl-Alt-Up": "addCursorToPrevLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
703 "Ctrl-Alt-Down": "addCursorToNextLine",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
704 "Ctrl-F3": "findUnder",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
705 "Shift-Ctrl-F3": "findUnderPrevious",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
706 "Alt-F3": "findAllUnder",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
707 "Shift-Ctrl-[": "fold",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
708 "Shift-Ctrl-]": "unfold",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
709 "Ctrl-I": "findIncremental",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
710 "Shift-Ctrl-I": "findIncrementalReverse",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
711 "Ctrl-H": "replace",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
712 "F3": "findNext",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
713 "Shift-F3": "findPrev",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
714 "fallthrough": "pcDefault"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
715 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
716 CodeMirror.normalizeKeyMap(keyMap.pcSublime);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
717
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
718 var mac = keyMap.default == keyMap.macDefault;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
719 keyMap.sublime = mac ? keyMap.macSublime : keyMap.pcSublime;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
720 });