2 var DEFAULT_BRACKETS
= "()[]{}''\"\"";
3 var SPACE_CHAR_REGEX
= /\s/;
5 CodeMirror
.defineOption("autoCloseBrackets", false, function(cm
, val
, old
) {
6 var wasOn
= old
&& old
!= CodeMirror
.Init
;
8 cm
.addKeyMap(buildKeymap(typeof val
== "string" ? val
: DEFAULT_BRACKETS
));
9 else if (!val
&& wasOn
)
10 cm
.removeKeyMap("autoCloseBrackets");
13 function buildKeymap(pairs
) {
15 name
: "autoCloseBrackets",
16 Backspace: function(cm
) {
17 if (cm
.somethingSelected()) return CodeMirror
.Pass
;
18 var cur
= cm
.getCursor(), line
= cm
.getLine(cur
.line
);
19 if (cur
.ch
&& cur
.ch
< line
.length
&&
20 pairs
.indexOf(line
.slice(cur
.ch
- 1, cur
.ch
+ 1)) % 2 == 0)
21 cm
.replaceRange("", CodeMirror
.Pos(cur
.line
, cur
.ch
- 1), CodeMirror
.Pos(cur
.line
, cur
.ch
+ 1));
23 return CodeMirror
.Pass
;
26 var closingBrackets
= "";
27 for (var i
= 0; i
< pairs
.length
; i
+= 2) (function(left
, right
) {
28 if (left
!= right
) closingBrackets
+= right
;
29 function surround(cm
) {
30 var selection
= cm
.getSelection();
31 cm
.replaceSelection(left
+ selection
+ right
);
33 function maybeOverwrite(cm
) {
34 var cur
= cm
.getCursor(), ahead
= cm
.getRange(cur
, CodeMirror
.Pos(cur
.line
, cur
.ch
+ 1));
35 if (ahead
!= right
|| cm
.somethingSelected()) return CodeMirror
.Pass
;
36 else cm
.execCommand("goCharRight");
38 map
["'" + left
+ "'"] = function(cm
) {
39 if (left
== "'" && cm
.getTokenAt(cm
.getCursor()).type
== "comment")
40 return CodeMirror
.Pass
;
41 if (cm
.somethingSelected()) return surround(cm
);
42 if (left
== right
&& maybeOverwrite(cm
) != CodeMirror
.Pass
) return;
43 var cur
= cm
.getCursor(), ahead
= CodeMirror
.Pos(cur
.line
, cur
.ch
+ 1);
44 var line
= cm
.getLine(cur
.line
), nextChar
= line
.charAt(cur
.ch
);
45 if (line
.length
== cur
.ch
|| closingBrackets
.indexOf(nextChar
) >= 0 || SPACE_CHAR_REGEX
.test(nextChar
))
46 cm
.replaceSelection(left
+ right
, {head
: ahead
, anchor
: ahead
});
48 return CodeMirror
.Pass
;
50 if (left
!= right
) map
["'" + right
+ "'"] = maybeOverwrite
;
51 })(pairs
.charAt(i
), pairs
.charAt(i
+ 1));