-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkeyhandler.js
More file actions
155 lines (141 loc) · 4.72 KB
/
keyhandler.js
File metadata and controls
155 lines (141 loc) · 4.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/**
* Cloud9 Language Foundation
*
* @copyright 2011, Ajax.org B.V.
* @license GPLv3 <http://www.gnu.org/licenses/gpl.txt>
*/
define(function(require, exports, module) {
var editors = require("ext/editors/editors");
var completionUtil = require("ext/codecomplete/complete_util");
var editors = require("ext/editors/editors");
var language;
function hook(ext) {
language = ext;
}
function composeHandlers(mainHandler, fallbackHandler) {
return function onKeyPress() {
var result = mainHandler.apply(null, arguments);
if(!result)
fallbackHandler.apply(null, arguments);
};
}
function onTextInput(text, pasted) {
if (language.disabled)
return false;
if (language.isContinuousCompletionEnabled())
typeAlongCompleteTextInput(text, pasted);
else
inputTriggerComplete(text, pasted);
return false;
}
function onCommandKey(e) {
if (language.disabled)
return false;
if (language.isContinuousCompletionEnabled())
typeAlongComplete(e);
if (e.keyCode == 27) // Esc
require("ext/language/marker").hideToolTip();
return false;
}
function typeAlongComplete(e) {
if (e.metaKey || e.altKey || e.ctrlKey)
return false;
if (!isJavaScript())
return false;
if (e.keyCode === 8) { // Backspace
var complete = require("ext/language/complete");
var editor = editors.currentEditor.amlEditor.$editor;
var pos = editor.getCursorPosition();
var line = editor.session.getDocument().getLine(pos.row);
if(!preceededByIdentifier(line, pos.column))
return false;
complete.deferredInvoke();
}
}
function inputTriggerComplete(text, pasted) {
if (!isJavaScript())
return false;
if (!pasted && text === "." && language.isInferAvailable())
handleChar(text);
}
function typeAlongCompleteTextInput(text, pasted) {
if (!isJavaScript())
return false;
if(!pasted)
handleChar(text);
}
function isJavaScript() {
return editors.currentEditor.amlEditor.syntax === "javascript";
}
function handleChar(ch) {
if(ch.match(/[A-Za-z0-9_\$\.]/)) {
var ext = require("ext/language/complete");
var editor = editors.currentEditor.amlEditor.$editor;
var pos = editor.getCursorPosition();
var line = editor.session.getDocument().getLine(pos.row);
if(!preceededByIdentifier(line, pos.column, ch))
return false;
ext.deferredInvoke();
}
}
/**
* Ensure that code completion is not triggered.
*/
function inCompletableCodeContext(line, column, id) {
var inMode = null;
if (line.match(/^\s*\*.+/))
return false;
for (var i = 0; i < column; i++) {
if(line[i] === '"' && !inMode)
inMode = '"';
else if(line[i] === '"' && inMode === '"' && line[i-1] !== "\\")
inMode = null;
else if(line[i] === "'" && !inMode)
inMode = "'";
else if(line[i] === "'" && inMode === "'" && line[i-1] !== "\\")
inMode = null;
else if(line[i] === "/" && line[i+1] === "/") {
inMode = '//';
i++;
}
else if(line[i] === "/" && line[i+1] === "*" && !inMode) {
if (line.substr(i + 2, 6) === "global")
continue;
inMode = '/*';
i++;
}
else if(line[i] === "*" && line[i+1] === "/" && inMode === "/*") {
inMode = null;
i++;
}
else if(line[i] === "/" && !inMode)
inMode = "/";
else if(line[i] === "/" && inMode === "/" && line[i-1] !== "\\")
inMode = null;
}
return !inMode;
}
function preceededByIdentifier(line, column, postfix) {
var id = completionUtil.retrievePreceedingIdentifier(line, column);
if(postfix) id += postfix;
return id !== "" && !(id[0] >= '0' && id[0] <= '9') && inCompletableCodeContext(line, column, id);
}
function isRequireJSCall(line, column) {
if (editors.currentEditor.amlEditor.syntax !== "javascript" || !language.isInferAvailable())
return false;
var id = completionUtil.retrievePreceedingIdentifier(line, column);
var LENGTH = 'require("'.length;
var start = column - id.length - LENGTH;
return start >= 0 && line.substr(start, LENGTH) === 'require("';
}
exports.hook = hook;
exports.onTextInput = onTextInput;
exports.onCommandKey = onCommandKey;
exports.inputTriggerComplete = inputTriggerComplete;
exports.typeAlongCompleteTextInput = typeAlongCompleteTextInput;
exports.typeAlongComplete = typeAlongComplete;
exports.composeHandlers = composeHandlers;
exports.inCompletableCodeContext = inCompletableCodeContext;
exports.preceededByIdentifier = preceededByIdentifier;
exports.isRequireJSCall = isRequireJSCall;
});