codemirror-rails 2.23 → 2.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. data/lib/codemirror/rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/codemirror.js +163 -88
  3. data/vendor/assets/javascripts/codemirror/keymaps/emacs.js +1 -1
  4. data/vendor/assets/javascripts/codemirror/keymaps/vim.js +85 -202
  5. data/vendor/assets/javascripts/codemirror/modes/clike.js +1 -1
  6. data/vendor/assets/javascripts/codemirror/modes/gfm.js +1 -1
  7. data/vendor/assets/javascripts/codemirror/modes/htmlembedded.js +1 -1
  8. data/vendor/assets/javascripts/codemirror/modes/htmlmixed.js +3 -1
  9. data/vendor/assets/javascripts/codemirror/modes/javascript.js +4 -3
  10. data/vendor/assets/javascripts/codemirror/modes/less.js +27 -13
  11. data/vendor/assets/javascripts/codemirror/modes/markdown.js +1 -1
  12. data/vendor/assets/javascripts/codemirror/modes/php.js +1 -1
  13. data/vendor/assets/javascripts/codemirror/modes/pig.js +172 -0
  14. data/vendor/assets/javascripts/codemirror/modes/python.js +1 -0
  15. data/vendor/assets/javascripts/codemirror/modes/rpm-spec.css +5 -0
  16. data/vendor/assets/javascripts/codemirror/modes/rst.js +1 -1
  17. data/vendor/assets/javascripts/codemirror/modes/shell.js +103 -0
  18. data/vendor/assets/javascripts/codemirror/modes/tiki.js +316 -0
  19. data/vendor/assets/javascripts/codemirror/modes/xml.js +63 -6
  20. data/vendor/assets/javascripts/codemirror/utils/foldcode.js +13 -8
  21. data/vendor/assets/javascripts/codemirror/utils/loadmode.js +50 -0
  22. data/vendor/assets/javascripts/codemirror/utils/overlay.js +1 -1
  23. data/vendor/assets/javascripts/codemirror/utils/search.js +2 -2
  24. data/vendor/assets/stylesheets/codemirror.css +2 -0
  25. data/vendor/assets/stylesheets/codemirror/modes/tiki.css +26 -0
  26. data/vendor/assets/stylesheets/codemirror/themes/ambiance.css +82 -0
  27. data/vendor/assets/stylesheets/codemirror/themes/blackboard.css +25 -0
  28. data/vendor/assets/stylesheets/codemirror/themes/lesser-dark.css +1 -1
  29. metadata +12 -4
@@ -24,6 +24,6 @@
24
24
 
25
25
  CodeMirror.keyMap["emacs-Ctrl-X"] = {
26
26
  "Ctrl-S": "save", "Ctrl-W": "save", "S": "saveAll", "F": "open", "U": "undo", "K": "close",
27
- auto: "emacs", catchall: function(cm) {/*ignore*/}
27
+ auto: "emacs", nofallthrough: true
28
28
  };
29
29
  })();
@@ -78,21 +78,41 @@
78
78
  }
79
79
  cm.setCursor(start);
80
80
  }
81
+ function goLineStartText(cm) {
82
+ // Go to the start of the line where the text begins, or the end for whitespace-only lines
83
+ var cur = cm.getCursor(), firstNonWS = cm.getLine(cur.line).search(/\S/);
84
+ cm.setCursor(cur.line, firstNonWS == -1 ? line.length : firstNonWS, true);
85
+ }
81
86
 
82
87
  var map = CodeMirror.keyMap.vim = {
83
88
  "0": function(cm) {count.length > 0 ? pushCountDigit("0")(cm) : CodeMirror.commands.goLineStart(cm);},
89
+ // Pipe (|); TODO: should be *screen* chars, so need a util function to turn tabs into spaces?
90
+ "'|'": function(cm) {cm.setCursor(cm.getCursor().line, popCount() - 1, true);},
91
+ "'^'": function(cm) {popCount(); goLineStartText(cm);},
84
92
  "A": function(cm) {popCount(); cm.setCursor(cm.getCursor().line, cm.getCursor().ch+1, true); cm.setOption("keyMap", "vim-insert"); editCursor("vim-insert");},
85
93
  "Shift-A": function(cm) {popCount(); CodeMirror.commands.goLineEnd(cm); cm.setOption("keyMap", "vim-insert"); editCursor("vim-insert");},
86
94
  "I": function(cm) {popCount(); cm.setOption("keyMap", "vim-insert"); editCursor("vim-insert");},
87
- "Shift-I": function(cm) {popCount(); CodeMirror.commands.goLineStartSmart(cm); cm.setOption("keyMap", "vim-insert"); editCursor("vim-insert");},
88
- "O": function(cm) {popCount(); CodeMirror.commands.goLineEnd(cm); cm.replaceSelection("\n", "end"); cm.setOption("keyMap", "vim-insert"); editCursor("vim-insert");},
89
- "Shift-O": function(cm) {popCount(); CodeMirror.commands.goLineStart(cm); cm.replaceSelection("\n", "start"); cm.setOption("keyMap", "vim-insert"); editCursor("vim-insert");},
95
+ "Shift-I": function(cm) {popCount(); goLineStartText(cm); cm.setOption("keyMap", "vim-insert"); editCursor("vim-insert");},
96
+ "O": function(cm) {popCount(); CodeMirror.commands.goLineEnd(cm); CodeMirror.commands.newlineAndIndent(cm); cm.setOption("keyMap", "vim-insert"); editCursor("vim-insert");},
97
+ "Shift-O": function(cm) {popCount(); CodeMirror.commands.goLineStart(cm); cm.replaceSelection("\n", "start"); cm.indentLine(cm.getCursor().line); cm.setOption("keyMap", "vim-insert"); editCursor("vim-insert");},
90
98
  "G": function(cm) {cm.setOption("keyMap", "vim-prefix-g");},
91
99
  "D": function(cm) {cm.setOption("keyMap", "vim-prefix-d"); emptyBuffer();},
100
+ "Shift-D": function(cm) {
101
+ emptyBuffer();
102
+ mark["Shift-D"] = cm.getCursor(false).line;
103
+ cm.setCursor(cm.getCursor(true).line);
104
+ delTillMark(cm,"Shift-D"); mark = [];
105
+ },
92
106
  "M": function(cm) {cm.setOption("keyMap", "vim-prefix-m"); mark = [];},
93
107
  "Y": function(cm) {cm.setOption("keyMap", "vim-prefix-y"); emptyBuffer(); yank = 0;},
108
+ "Shift-Y": function(cm) {
109
+ emptyBuffer();
110
+ mark["Shift-D"] = cm.getCursor(false).line;
111
+ cm.setCursor(cm.getCursor(true).line);
112
+ yankTillMark(cm,"Shift-D"); mark = [];
113
+ },
94
114
  "/": function(cm) {var f = CodeMirror.commands.find; f && f(cm); sdir = "f"},
95
- "Shift-/": function(cm) {
115
+ "'?'": function(cm) {
96
116
  var f = CodeMirror.commands.find;
97
117
  if (f) { f(cm); CodeMirror.commands.findPrev(cm); sdir = "r"; }
98
118
  },
@@ -105,240 +125,103 @@
105
125
  if (fn) sdir != "r" ? CodeMirror.commands.findPrev(cm) : fn.findNext(cm);
106
126
  },
107
127
  "Shift-G": function(cm) {count == "" ? cm.setCursor(cm.lineCount()) : cm.setCursor(parseInt(count)-1); popCount(); CodeMirror.commands.goLineStart(cm);},
108
- catchall: function(cm) {/*ignore*/}
128
+ nofallthrough: true
109
129
  };
110
130
  // Add bindings for number keys
111
131
  for (var i = 1; i < 10; ++i) map[i] = pushCountDigit(i);
112
132
  // Add bindings that are influenced by number keys
113
- iterObj({"H": "goColumnLeft", "L": "goColumnRight", "J": "goLineDown", "K": "goLineUp",
114
- "Left": "goColumnLeft", "Right": "goColumnRight", "Down": "goLineDown", "Up": "goLineUp",
115
- "Backspace": "goCharLeft", "Space": "goCharRight",
116
- "B": function(cm) {moveToWord(cm, word, -1, "end");},
117
- "E": function(cm) {moveToWord(cm, word, 1, "end");},
118
- "W": function(cm) {moveToWord(cm, word, 1, "start");},
119
- "Shift-B": function(cm) {moveToWord(cm, bigWord, -1, "end");},
120
- "Shift-E": function(cm) {moveToWord(cm, bigWord, 1, "end");},
121
- "Shift-W": function(cm) {moveToWord(cm, bigWord, 1, "start");},
122
- "X": function(cm) {CodeMirror.commands.delCharRight(cm)},
123
- "P": function(cm) {
124
- var cur = cm.getCursor().line;
125
- if (buf!= "") {
126
- CodeMirror.commands.goLineEnd(cm);
127
- cm.replaceSelection(buf, "end");
128
- }
129
- cm.setCursor(cur+1);
130
- },
131
- "Shift-X": function(cm) {CodeMirror.commands.delCharLeft(cm)},
132
- "Shift-J": function(cm) {joinLineNext(cm)},
133
- "Shift-`": function(cm) {
134
- var cur = cm.getCursor(), cHar = cm.getRange({line: cur.line, ch: cur.ch}, {line: cur.line, ch: cur.ch+1});
135
- cHar = cHar != cHar.toLowerCase() ? cHar.toLowerCase() : cHar.toUpperCase();
136
- cm.replaceRange(cHar, {line: cur.line, ch: cur.ch}, {line: cur.line, ch: cur.ch+1});
137
- cm.setCursor(cur.line, cur.ch+1);
138
- },
139
- "Ctrl-B": function(cm) {CodeMirror.commands.goPageUp(cm)},
140
- "Ctrl-F": function(cm) {CodeMirror.commands.goPageDown(cm)},
141
- "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
142
- "U": "undo", "Ctrl-R": "redo", "Shift-4": "goLineEnd"},
143
- function(key, cmd) { map[key] = countTimes(cmd); });
133
+ iterObj({
134
+ "H": "goColumnLeft", "L": "goColumnRight", "J": "goLineDown",
135
+ "K": "goLineUp", "Left": "goColumnLeft", "Right": "goColumnRight",
136
+ "Down": "goLineDown", "Up": "goLineUp", "Backspace": "goCharLeft",
137
+ "Space": "goCharRight",
138
+ "B": function(cm) {moveToWord(cm, word, -1, "end");},
139
+ "E": function(cm) {moveToWord(cm, word, 1, "end");},
140
+ "W": function(cm) {moveToWord(cm, word, 1, "start");},
141
+ "Shift-B": function(cm) {moveToWord(cm, bigWord, -1, "end");},
142
+ "Shift-E": function(cm) {moveToWord(cm, bigWord, 1, "end");},
143
+ "Shift-W": function(cm) {moveToWord(cm, bigWord, 1, "start");},
144
+ "X": function(cm) {CodeMirror.commands.delCharRight(cm)},
145
+ "P": function(cm) {
146
+ var cur = cm.getCursor().line;
147
+ if (buf!= "") {
148
+ CodeMirror.commands.goLineEnd(cm);
149
+ cm.replaceSelection(buf, "end");
150
+ }
151
+ cm.setCursor(cur+1);
152
+ },
153
+ "Shift-X": function(cm) {CodeMirror.commands.delCharLeft(cm)},
154
+ "Shift-J": function(cm) {joinLineNext(cm)},
155
+ "'~'": function(cm) {
156
+ var cur = cm.getCursor(), cHar = cm.getRange({line: cur.line, ch: cur.ch}, {line: cur.line, ch: cur.ch+1});
157
+ cHar = cHar != cHar.toLowerCase() ? cHar.toLowerCase() : cHar.toUpperCase();
158
+ cm.replaceRange(cHar, {line: cur.line, ch: cur.ch}, {line: cur.line, ch: cur.ch+1});
159
+ cm.setCursor(cur.line, cur.ch+1);
160
+ },
161
+ "Ctrl-B": function(cm) {CodeMirror.commands.goPageUp(cm)},
162
+ "Ctrl-F": function(cm) {CodeMirror.commands.goPageDown(cm)},
163
+ "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
164
+ "U": "undo", "Ctrl-R": "redo", "'$'": "goLineEnd"
165
+ }, function(key, cmd) { map[key] = countTimes(cmd); });
144
166
 
145
167
  CodeMirror.keyMap["vim-prefix-g"] = {
146
168
  "E": countTimes(function(cm) { moveToWord(cm, word, -1, "start");}),
147
169
  "Shift-E": countTimes(function(cm) { moveToWord(cm, bigWord, -1, "start");}),
148
170
  auto: "vim",
149
- catchall: function(cm) {/*ignore*/}
171
+ nofallthrough: true
150
172
  };
151
173
 
152
174
  CodeMirror.keyMap["vim-prefix-m"] = {
153
- "A": function(cm) {mark["A"] = cm.getCursor().line;},
154
- "Shift-A": function(cm) {mark["Shift-A"] = cm.getCursor().line;},
155
- "B": function(cm) {mark["B"] = cm.getCursor().line;},
156
- "Shift-B": function(cm) {mark["Shift-B"] = cm.getCursor().line;},
157
- "C": function(cm) {mark["C"] = cm.getCursor().line;},
158
- "Shift-C": function(cm) {mark["Shift-C"] = cm.getCursor().line;},
159
- "D": function(cm) {mark["D"] = cm.getCursor().line;},
160
- "Shift-D": function(cm) {mark["Shift-D"] = cm.getCursor().line;},
161
- "E": function(cm) {mark["E"] = cm.getCursor().line;},
162
- "Shift-E": function(cm) {mark["Shift-E"] = cm.getCursor().line;},
163
- "F": function(cm) {mark["F"] = cm.getCursor().line;},
164
- "Shift-F": function(cm) {mark["Shift-F"] = cm.getCursor().line;},
165
- "G": function(cm) {mark["G"] = cm.getCursor().line;},
166
- "Shift-G": function(cm) {mark["Shift-G"] = cm.getCursor().line;},
167
- "H": function(cm) {mark["H"] = cm.getCursor().line;},
168
- "Shift-H": function(cm) {mark["Shift-H"] = cm.getCursor().line;},
169
- "I": function(cm) {mark["I"] = cm.getCursor().line;},
170
- "Shift-I": function(cm) {mark["Shift-I"] = cm.getCursor().line;},
171
- "J": function(cm) {mark["J"] = cm.getCursor().line;},
172
- "Shift-J": function(cm) {mark["Shift-J"] = cm.getCursor().line;},
173
- "K": function(cm) {mark["K"] = cm.getCursor().line;},
174
- "Shift-K": function(cm) {mark["Shift-K"] = cm.getCursor().line;},
175
- "L": function(cm) {mark["L"] = cm.getCursor().line;},
176
- "Shift-L": function(cm) {mark["Shift-L"] = cm.getCursor().line;},
177
- "M": function(cm) {mark["M"] = cm.getCursor().line;},
178
- "Shift-M": function(cm) {mark["Shift-M"] = cm.getCursor().line;},
179
- "N": function(cm) {mark["N"] = cm.getCursor().line;},
180
- "Shift-N": function(cm) {mark["Shift-N"] = cm.getCursor().line;},
181
- "O": function(cm) {mark["O"] = cm.getCursor().line;},
182
- "Shift-O": function(cm) {mark["Shift-O"] = cm.getCursor().line;},
183
- "P": function(cm) {mark["P"] = cm.getCursor().line;},
184
- "Shift-P": function(cm) {mark["Shift-P"] = cm.getCursor().line;},
185
- "Q": function(cm) {mark["Q"] = cm.getCursor().line;},
186
- "Shift-Q": function(cm) {mark["Shift-Q"] = cm.getCursor().line;},
187
- "R": function(cm) {mark["R"] = cm.getCursor().line;},
188
- "Shift-R": function(cm) {mark["Shift-R"] = cm.getCursor().line;},
189
- "S": function(cm) {mark["S"] = cm.getCursor().line;},
190
- "Shift-S": function(cm) {mark["Shift-S"] = cm.getCursor().line;},
191
- "T": function(cm) {mark["T"] = cm.getCursor().line;},
192
- "Shift-T": function(cm) {mark["Shift-T"] = cm.getCursor().line;},
193
- "U": function(cm) {mark["U"] = cm.getCursor().line;},
194
- "Shift-U": function(cm) {mark["Shift-U"] = cm.getCursor().line;},
195
- "V": function(cm) {mark["V"] = cm.getCursor().line;},
196
- "Shift-V": function(cm) {mark["Shift-V"] = cm.getCursor().line;},
197
- "W": function(cm) {mark["W"] = cm.getCursor().line;},
198
- "Shift-W": function(cm) {mark["Shift-W"] = cm.getCursor().line;},
199
- "X": function(cm) {mark["X"] = cm.getCursor().line;},
200
- "Shift-X": function(cm) {mark["Shift-X"] = cm.getCursor().line;},
201
- "Y": function(cm) {mark["Y"] = cm.getCursor().line;},
202
- "Shift-Y": function(cm) {mark["Shift-Y"] = cm.getCursor().line;},
203
- "Z": function(cm) {mark["Z"] = cm.getCursor().line;},
204
- "Shift-Z": function(cm) {mark["Shift-Z"] = cm.getCursor().line;},
205
175
  auto: "vim",
206
- catchall: function(cm) {/*ignore*/}
207
- }
176
+ nofallthrough: true
177
+ };
208
178
 
209
179
  CodeMirror.keyMap["vim-prefix-d"] = {
210
180
  "D": countTimes(function(cm) { pushInBuffer("\n"+cm.getLine(cm.getCursor().line)); cm.removeLine(cm.getCursor().line); }),
211
181
  "'": function(cm) {cm.setOption("keyMap", "vim-prefix-d'"); emptyBuffer();},
212
182
  auto: "vim",
213
- catchall: function(cm) {/*ignore*/}
183
+ nofallthrough: true
214
184
  };
215
185
 
216
186
  CodeMirror.keyMap["vim-prefix-d'"] = {
217
- "A": function(cm) {delTillMark(cm,"A");},
218
- "Shift-A": function(cm) {delTillMark(cm,"Shift-A");},
219
- "B": function(cm) {delTillMark(cm,"B");},
220
- "Shift-B": function(cm) {delTillMark(cm,"Shift-B");},
221
- "C": function(cm) {delTillMark(cm,"C");},
222
- "Shift-C": function(cm) {delTillMark(cm,"Shift-C");},
223
- "D": function(cm) {delTillMark(cm,"D");},
224
- "Shift-D": function(cm) {delTillMark(cm,"Shift-D");},
225
- "E": function(cm) {delTillMark(cm,"E");},
226
- "Shift-E": function(cm) {delTillMark(cm,"Shift-E");},
227
- "F": function(cm) {delTillMark(cm,"F");},
228
- "Shift-F": function(cm) {delTillMark(cm,"Shift-F");},
229
- "G": function(cm) {delTillMark(cm,"G");},
230
- "Shift-G": function(cm) {delTillMark(cm,"Shift-G");},
231
- "H": function(cm) {delTillMark(cm,"H");},
232
- "Shift-H": function(cm) {delTillMark(cm,"Shift-H");},
233
- "I": function(cm) {delTillMark(cm,"I");},
234
- "Shift-I": function(cm) {delTillMark(cm,"Shift-I");},
235
- "J": function(cm) {delTillMark(cm,"J");},
236
- "Shift-J": function(cm) {delTillMark(cm,"Shift-J");},
237
- "K": function(cm) {delTillMark(cm,"K");},
238
- "Shift-K": function(cm) {delTillMark(cm,"Shift-K");},
239
- "L": function(cm) {delTillMark(cm,"L");},
240
- "Shift-L": function(cm) {delTillMark(cm,"Shift-L");},
241
- "M": function(cm) {delTillMark(cm,"M");},
242
- "Shift-M": function(cm) {delTillMark(cm,"Shift-M");},
243
- "N": function(cm) {delTillMark(cm,"N");},
244
- "Shift-N": function(cm) {delTillMark(cm,"Shift-N");},
245
- "O": function(cm) {delTillMark(cm,"O");},
246
- "Shift-O": function(cm) {delTillMark(cm,"Shift-O");},
247
- "P": function(cm) {delTillMark(cm,"P");},
248
- "Shift-P": function(cm) {delTillMark(cm,"Shift-P");},
249
- "Q": function(cm) {delTillMark(cm,"Q");},
250
- "Shift-Q": function(cm) {delTillMark(cm,"Shift-Q");},
251
- "R": function(cm) {delTillMark(cm,"R");},
252
- "Shift-R": function(cm) {delTillMark(cm,"Shift-R");},
253
- "S": function(cm) {delTillMark(cm,"S");},
254
- "Shift-S": function(cm) {delTillMark(cm,"Shift-S");},
255
- "T": function(cm) {delTillMark(cm,"T");},
256
- "Shift-T": function(cm) {delTillMark(cm,"Shift-T");},
257
- "U": function(cm) {delTillMark(cm,"U");},
258
- "Shift-U": function(cm) {delTillMark(cm,"Shift-U");},
259
- "V": function(cm) {delTillMark(cm,"V");},
260
- "Shift-V": function(cm) {delTillMark(cm,"Shift-V");},
261
- "W": function(cm) {delTillMark(cm,"W");},
262
- "Shift-W": function(cm) {delTillMark(cm,"Shift-W");},
263
- "X": function(cm) {delTillMark(cm,"X");},
264
- "Shift-X": function(cm) {delTillMark(cm,"Shift-X");},
265
- "Y": function(cm) {delTillMark(cm,"Y");},
266
- "Shift-Y": function(cm) {delTillMark(cm,"Shift-Y");},
267
- "Z": function(cm) {delTillMark(cm,"Z");},
268
- "Shift-Z": function(cm) {delTillMark(cm,"Shift-Z");},
269
187
  auto: "vim",
270
- catchall: function(cm) {/*ignore*/}
188
+ nofallthrough: true
271
189
  };
272
190
 
273
191
  CodeMirror.keyMap["vim-prefix-y'"] = {
274
- "A": function(cm) {yankTillMark(cm,"A");},
275
- "Shift-A": function(cm) {yankTillMark(cm,"Shift-A");},
276
- "B": function(cm) {yankTillMark(cm,"B");},
277
- "Shift-B": function(cm) {yankTillMark(cm,"Shift-B");},
278
- "C": function(cm) {yankTillMark(cm,"C");},
279
- "Shift-C": function(cm) {yankTillMark(cm,"Shift-C");},
280
- "D": function(cm) {yankTillMark(cm,"D");},
281
- "Shift-D": function(cm) {yankTillMark(cm,"Shift-D");},
282
- "E": function(cm) {yankTillMark(cm,"E");},
283
- "Shift-E": function(cm) {yankTillMark(cm,"Shift-E");},
284
- "F": function(cm) {yankTillMark(cm,"F");},
285
- "Shift-F": function(cm) {yankTillMark(cm,"Shift-F");},
286
- "G": function(cm) {yankTillMark(cm,"G");},
287
- "Shift-G": function(cm) {yankTillMark(cm,"Shift-G");},
288
- "H": function(cm) {yankTillMark(cm,"H");},
289
- "Shift-H": function(cm) {yankTillMark(cm,"Shift-H");},
290
- "I": function(cm) {yankTillMark(cm,"I");},
291
- "Shift-I": function(cm) {yankTillMark(cm,"Shift-I");},
292
- "J": function(cm) {yankTillMark(cm,"J");},
293
- "Shift-J": function(cm) {yankTillMark(cm,"Shift-J");},
294
- "K": function(cm) {yankTillMark(cm,"K");},
295
- "Shift-K": function(cm) {yankTillMark(cm,"Shift-K");},
296
- "L": function(cm) {yankTillMark(cm,"L");},
297
- "Shift-L": function(cm) {yankTillMark(cm,"Shift-L");},
298
- "M": function(cm) {yankTillMark(cm,"M");},
299
- "Shift-M": function(cm) {yankTillMark(cm,"Shift-M");},
300
- "N": function(cm) {yankTillMark(cm,"N");},
301
- "Shift-N": function(cm) {yankTillMark(cm,"Shift-N");},
302
- "O": function(cm) {yankTillMark(cm,"O");},
303
- "Shift-O": function(cm) {yankTillMark(cm,"Shift-O");},
304
- "P": function(cm) {yankTillMark(cm,"P");},
305
- "Shift-P": function(cm) {yankTillMark(cm,"Shift-P");},
306
- "Q": function(cm) {yankTillMark(cm,"Q");},
307
- "Shift-Q": function(cm) {yankTillMark(cm,"Shift-Q");},
308
- "R": function(cm) {yankTillMark(cm,"R");},
309
- "Shift-R": function(cm) {yankTillMark(cm,"Shift-R");},
310
- "S": function(cm) {yankTillMark(cm,"S");},
311
- "Shift-S": function(cm) {yankTillMark(cm,"Shift-S");},
312
- "T": function(cm) {yankTillMark(cm,"T");},
313
- "Shift-T": function(cm) {yankTillMark(cm,"Shift-T");},
314
- "U": function(cm) {yankTillMark(cm,"U");},
315
- "Shift-U": function(cm) {yankTillMark(cm,"Shift-U");},
316
- "V": function(cm) {yankTillMark(cm,"V");},
317
- "Shift-V": function(cm) {yankTillMark(cm,"Shift-V");},
318
- "W": function(cm) {yankTillMark(cm,"W");},
319
- "Shift-W": function(cm) {yankTillMark(cm,"Shift-W");},
320
- "X": function(cm) {yankTillMark(cm,"X");},
321
- "Shift-X": function(cm) {yankTillMark(cm,"Shift-X");},
322
- "Y": function(cm) {yankTillMark(cm,"Y");},
323
- "Shift-Y": function(cm) {yankTillMark(cm,"Shift-Y");},
324
- "Z": function(cm) {yankTillMark(cm,"Z");},
325
- "Shift-Z": function(cm) {yankTillMark(cm,"Shift-Z");},
326
192
  auto: "vim",
327
- catchall: function(cm) {/*ignore*/}
193
+ nofallthrough: true
328
194
  };
329
195
 
196
+ // iterate through uppercase alphabet char codes
197
+ for (var i = 65; i < 65 + 26; i++) {
198
+ // apply for `letter` and 'Shift-' + `letter`
199
+ for (var m = String.fromCharCode(i); m.length < 8; m = "Shift-" + m) {
200
+ CodeMirror.keyMap["vim-prefix-m"][m] = function(cm) {
201
+ mark[m] = cm.getCursor().line;
202
+ };
203
+ CodeMirror.keyMap["vim-prefix-d'"][m] = function(cm) {
204
+ delTillMark(cm,m);
205
+ };
206
+ CodeMirror.keyMap["vim-prefix-y'"][m] = function(cm) {
207
+ yankTillMark(cm,m);
208
+ };
209
+ }
210
+ }
211
+
330
212
  CodeMirror.keyMap["vim-prefix-y"] = {
331
213
  "Y": countTimes(function(cm) { pushInBuffer("\n"+cm.getLine(cm.getCursor().line+yank)); yank++; }),
332
214
  "'": function(cm) {cm.setOption("keyMap", "vim-prefix-y'"); emptyBuffer();},
333
215
  auto: "vim",
334
- catchall: function(cm) {/*ignore*/}
216
+ nofallthrough: true
335
217
  };
336
218
 
337
219
  CodeMirror.keyMap["vim-insert"] = {
220
+ // TODO: override navigation keys so that Esc will cancel automatic indentation from o, O, i_<CR>
338
221
  "Esc": function(cm) {
339
- cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1, true);
340
- cm.setOption("keyMap", "vim");
341
- editCursor("vim");
222
+ cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1, true);
223
+ cm.setOption("keyMap", "vim");
224
+ editCursor("vim");
342
225
  },
343
226
  "Ctrl-N": function(cm) {/* Code to bring up autocomplete hint */},
344
227
  "Ctrl-P": function(cm) {/* Code to bring up autocomplete hint */},
@@ -21,7 +21,7 @@ CodeMirror.defineMode("clike", function(config, parserConfig) {
21
21
  }
22
22
  if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
23
23
  curPunc = ch;
24
- return null
24
+ return null;
25
25
  }
26
26
  if (/\d/.test(ch)) {
27
27
  stream.eatWhile(/[\w\.]/);
@@ -105,4 +105,4 @@ CodeMirror.defineMode("gfm", function(config, parserConfig) {
105
105
  return state.token(stream, state);
106
106
  }
107
107
  }
108
- });
108
+ }, "markdown");
@@ -61,7 +61,7 @@ CodeMirror.defineMode("htmlembedded", function(config, parserConfig) {
61
61
 
62
62
  electricChars: "/{}:"
63
63
  }
64
- });
64
+ }, "htmlmixed");
65
65
 
66
66
  CodeMirror.defineMIME("application/x-ejs", { name: "htmlembedded", scriptingModeSpec:"javascript"});
67
67
  CodeMirror.defineMIME("application/x-aspx", { name: "htmlembedded", scriptingModeSpec:"text/x-csharp"});
@@ -73,11 +73,13 @@ CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
73
73
  },
74
74
 
75
75
  compareStates: function(a, b) {
76
+ if (a.mode != b.mode) return false;
77
+ if (a.localState) return CodeMirror.Pass;
76
78
  return htmlMode.compareStates(a.htmlState, b.htmlState);
77
79
  },
78
80
 
79
81
  electricChars: "/{}:"
80
82
  }
81
- });
83
+ }, "xml", "javascript", "css");
82
84
 
83
85
  CodeMirror.defineMIME("text/html", "htmlmixed");
@@ -243,7 +243,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
243
243
 
244
244
  function maybeoperator(type, value) {
245
245
  if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
246
- if (type == "operator") return cont(expression);
246
+ if (type == "operator" || type == ":") return cont(expression);
247
247
  if (type == ";") return;
248
248
  if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
249
249
  if (type == ".") return cont(property, maybeoperator);
@@ -341,8 +341,9 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) {
341
341
 
342
342
  indent: function(state, textAfter) {
343
343
  if (state.tokenize != jsTokenBase) return 0;
344
- var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical,
345
- type = lexical.type, closing = firstChar == type;
344
+ var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
345
+ if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
346
+ var type = lexical.type, closing = firstChar == type;
346
347
  if (type == "vardef") return lexical.indented + 4;
347
348
  else if (type == "form" && firstChar == "{") return lexical.indented;
348
349
  else if (type == "stat" || type == "form") return lexical.indented + indentUnit;
@@ -41,7 +41,7 @@ CodeMirror.defineMode("css", function(config) {
41
41
  return tokenSComment(stream, state);
42
42
  }else{
43
43
  stream.eatWhile(/[\a-zA-Z0-9\-_.\s]/);
44
- if(/\/|\)/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == ")")))return ret("string", "string");//let url(/images/logo.png) without quotes return as string
44
+ if(/\/|\)|#/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == ")")))return ret("string", "string");//let url(/images/logo.png) without quotes return as string
45
45
  return ret("number", "unit");
46
46
  }
47
47
  }
@@ -105,21 +105,33 @@ CodeMirror.defineMode("css", function(config) {
105
105
  stream.eatWhile(/[\w\-]/);
106
106
  return ret(null, ch);
107
107
  }
108
- else if (ch == "&") {
109
- stream.eatWhile(/[\w\-]/);
110
- return ret(null, ch);
111
- }
112
108
  else {
113
- stream.eatWhile(/[\w\\\-_.%]/);
114
- if( stream.peek().match(/\(/) != null ){// lesscss
115
- stream.eatWhile(/[a-zA-Z\s]/);
116
- if(stream.peek() == "(")return ret(null, ch);
117
- }else if( stream.current().match(/\-\d|\-.\d/) ){ // lesscss match e.g.: -5px -0.4 etc...
118
- return ret("number", "unit");
109
+ stream.eatWhile(/[\w\\\-_%.{]/);
110
+ if(stream.current().match(/http|https/) != null){
111
+ stream.eatWhile(/[\w\\\-_%.{:\/]/);
112
+ return ret("string", "string");
113
+ }else if(stream.peek() == "<" || stream.peek() == ">"){
114
+ return ret("tag", "tag");
115
+ }else if( stream.peek().match(/\(/) != null ){// lessc
116
+ return ret(null, ch);
117
+ }else if (stream.peek() == "/" && state.stack[state.stack.length-1] != undefined){ // url(dir/center/image.png)
118
+ return ret("string", "string");
119
+ }else if( stream.current().match(/\-\d|\-.\d/) ){ // lesscss match e.g.: -5px -0.4 etc... only colorize the minus sign
120
+ //stream.backUp(stream.current().length-1); //commment out these 2 comment if you want the minus sign to be parsed as null -500px
121
+ //return ret(null, ch);
122
+ return ret("number", "unit");
119
123
  }else if( inTagsArray(stream.current()) ){ // lesscss match html tags
120
124
  return ret("tag", "tag");
121
- }else if( /\/|\)/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == ")")) && stream.current().indexOf(".") !== -1){
125
+ }else if( /\/|[\s\)]/.test(stream.peek() || stream.eol() || (stream.eatSpace() && stream.peek() == "/")) && stream.current().indexOf(".") !== -1){
126
+ if(stream.current().substring(stream.current().length-1,stream.current().length) == "{"){
127
+ stream.backUp(1);
128
+ return ret("tag", "tag");
129
+ }//end if
130
+ if( (stream.eatSpace() && stream.peek().match(/[{<>.a-zA-Z]/) != null) || stream.eol() )return ret("tag", "tag");//e.g. button.icon-plus
122
131
  return ret("string", "string");//let url(/images/logo.png) without quotes return as string
132
+ }else if( stream.eol() ){
133
+ if(stream.current().substring(stream.current().length-1,stream.current().length) == "{")stream.backUp(1);
134
+ return ret("tag", "tag");
123
135
  }else{
124
136
  return ret("variable", "variable");
125
137
  }
@@ -215,4 +227,6 @@ CodeMirror.defineMode("css", function(config) {
215
227
  };
216
228
  });
217
229
 
218
- CodeMirror.defineMIME("text/css", "css");
230
+ CodeMirror.defineMIME("text/x-less", "less");
231
+ if (!CodeMirror.mimeModes.hasOwnProperty("text/css"))
232
+ CodeMirror.defineMIME("text/css", "less");