文件树快捷键
This commit is contained in:
parent
1be309b08a
commit
5e5d13965a
|
@ -19,7 +19,7 @@
|
||||||
<li>Ctrl+]: 缩进</li>
|
<li>Ctrl+]: 缩进</li>
|
||||||
<li>Ctrl+[: 反缩进</li>
|
<li>Ctrl+[: 反缩进</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
TBD:
|
TBD:
|
||||||
<ul>
|
<ul>
|
||||||
<li>Alt+F7:查找使用</li>
|
<li>Alt+F7:查找使用</li>
|
||||||
|
@ -27,6 +27,7 @@
|
||||||
<li>Ctrl+0:焦点切换到编辑器</li>
|
<li>Ctrl+0:焦点切换到编辑器</li>
|
||||||
<li>Ctrl+W:关闭当前编辑器</li>
|
<li>Ctrl+W:关闭当前编辑器</li>
|
||||||
<li>Ctrl+4:焦点切换到 Output</li>
|
<li>Ctrl+4:焦点切换到 Output</li>
|
||||||
|
<li>Alt+Shift+F:格式化</li>
|
||||||
</ul>
|
</ul>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -191,7 +191,7 @@ func FindDeclarationHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
ch := int(args["cursorCh"].(float64))
|
ch := int(args["cursorCh"].(float64))
|
||||||
|
|
||||||
offset := getCursorOffset(code, line, ch)
|
offset := getCursorOffset(code, line, ch)
|
||||||
glog.Infof("offset [%d]", offset)
|
// glog.Infof("offset [%d]", offset)
|
||||||
|
|
||||||
// TODO: 目前是调用 liteide_stub 工具来查找声明,后续需要重新实现
|
// TODO: 目前是调用 liteide_stub 工具来查找声明,后续需要重新实现
|
||||||
argv := []string{"type", "-cursor", filename + ":" + strconv.Itoa(offset), "-def", "."}
|
argv := []string{"type", "-cursor", filename + ":" + strconv.Itoa(offset), "-def", "."}
|
||||||
|
@ -221,8 +221,6 @@ func FindDeclarationHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
cursorLine := found[cursorSep+1 : strings.LastIndex(found, ":")]
|
cursorLine := found[cursorSep+1 : strings.LastIndex(found, ":")]
|
||||||
cursorCh := found[strings.LastIndex(found, ":")+1:]
|
cursorCh := found[strings.LastIndex(found, ":")+1:]
|
||||||
|
|
||||||
glog.Infof("Find Decl [path: %s, cursor(%s:%s)]", path, cursorLine, cursorCh)
|
|
||||||
|
|
||||||
data["path"] = path
|
data["path"] = path
|
||||||
data["cursorLine"] = cursorLine
|
data["cursorLine"] = cursorLine
|
||||||
data["cursorCh"] = cursorCh
|
data["cursorCh"] = cursorCh
|
||||||
|
|
|
@ -63,6 +63,7 @@ var editors = {
|
||||||
},
|
},
|
||||||
fullscreen: function() {
|
fullscreen: function() {
|
||||||
wide.curEditor.setOption("fullScreen", true);
|
wide.curEditor.setOption("fullScreen", true);
|
||||||
|
wide.curEditor.focus();
|
||||||
},
|
},
|
||||||
_initAutocomplete: function() {
|
_initAutocomplete: function() {
|
||||||
CodeMirror.registerHelper("hint", "go", function(editor) {
|
CodeMirror.registerHelper("hint", "go", function(editor) {
|
||||||
|
@ -274,7 +275,6 @@ var editors = {
|
||||||
|
|
||||||
$("#footer-cursor").text('| ' + (cursor.line + 1) + ':' + (cursor.ch + 1) + ' |');
|
$("#footer-cursor").text('| ' + (cursor.line + 1) + ':' + (cursor.ch + 1) + ' |');
|
||||||
// TODO: 关闭 tab 的时候要重置
|
// TODO: 关闭 tab 的时候要重置
|
||||||
// TODO: 保存当前编辑器光标位置,切换 tab 的时候要设置回来
|
|
||||||
});
|
});
|
||||||
|
|
||||||
editor.setSize('100%', $(".edit-panel").height() - $(".edit-header").height());
|
editor.setSize('100%', $(".edit-panel").height() - $(".edit-header").height());
|
||||||
|
|
|
@ -205,13 +205,6 @@ var tree = {
|
||||||
},
|
},
|
||||||
_onClick: function(treeNode) {
|
_onClick: function(treeNode) {
|
||||||
if (wide.curNode) {
|
if (wide.curNode) {
|
||||||
var id = wide.curNode.tId;
|
|
||||||
if (id === treeNode.tId) {
|
|
||||||
// 再次点击当前选中节点
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for (var i = 0, ii = editors.data.length; i < ii; i++) {
|
for (var i = 0, ii = editors.data.length; i < ii; i++) {
|
||||||
// 该节点文件已经打开
|
// 该节点文件已经打开
|
||||||
if (editors.data[i].id === treeNode.tId) {
|
if (editors.data[i].id === treeNode.tId) {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
var outputWS = new WebSocket(config.channel.output + '/output/ws');
|
var outputWS = new WebSocket(config.channel.output + '/output/ws');
|
||||||
outputWS.onopen = function() {
|
outputWS.onopen = function () {
|
||||||
console.log('[output onopen] connected');
|
console.log('[output onopen] connected');
|
||||||
};
|
};
|
||||||
|
|
||||||
outputWS.onmessage = function(e) {
|
outputWS.onmessage = function (e) {
|
||||||
console.log('[output onmessage]' + e.data);
|
console.log('[output onmessage]' + e.data);
|
||||||
var data = JSON.parse(e.data);
|
var data = JSON.parse(e.data);
|
||||||
|
|
||||||
|
@ -43,37 +43,37 @@ outputWS.onmessage = function(e) {
|
||||||
url: '/run',
|
url: '/run',
|
||||||
data: JSON.stringify(request),
|
data: JSON.stringify(request),
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
beforeSend: function(data) {
|
beforeSend: function (data) {
|
||||||
$('#output').text('');
|
$('#output').text('');
|
||||||
},
|
},
|
||||||
success: function(data) {
|
success: function (data) {
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
outputWS.onclose = function(e) {
|
outputWS.onclose = function (e) {
|
||||||
console.log('[output onclose] disconnected (' + e.code + ')');
|
console.log('[output onclose] disconnected (' + e.code + ')');
|
||||||
delete outputWS;
|
delete outputWS;
|
||||||
};
|
};
|
||||||
outputWS.onerror = function(e) {
|
outputWS.onerror = function (e) {
|
||||||
console.log('[output onerror] ' + e);
|
console.log('[output onerror] ' + e);
|
||||||
};
|
};
|
||||||
|
|
||||||
var wide = {
|
var wide = {
|
||||||
curNode: undefined,
|
curNode: undefined,
|
||||||
curEditor: undefined,
|
curEditor: undefined,
|
||||||
_initLayout: function() {
|
_initLayout: function () {
|
||||||
var mainH = $(window).height() - $(".menu").height() - $(".footer").height() - 2;
|
var mainH = $(window).height() - $(".menu").height() - $(".footer").height() - 2;
|
||||||
$(".content, .ztree").height(mainH);
|
$(".content, .ztree").height(mainH);
|
||||||
|
|
||||||
$(".edit-panel").height(mainH - $(".output").height());
|
$(".edit-panel").height(mainH - $(".output").height());
|
||||||
},
|
},
|
||||||
init: function() {
|
init: function () {
|
||||||
this._initLayout();
|
this._initLayout();
|
||||||
|
|
||||||
$("body").bind("mousedown", function(event) {
|
$("body").bind("mousedown", function (event) {
|
||||||
if (!(event.target.id === "dirRMenu" || $(event.target).closest("#dirRMenu").length > 0)) {
|
if (!(event.target.id === "dirRMenu" || $(event.target).closest("#dirRMenu").length > 0)) {
|
||||||
$("#dirRMenu").hide();
|
$("#dirRMenu").hide();
|
||||||
}
|
}
|
||||||
|
@ -88,8 +88,10 @@ var wide = {
|
||||||
menu.subMenu();
|
menu.subMenu();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this._bindKey();
|
||||||
},
|
},
|
||||||
saveFile: function() {
|
saveFile: function () {
|
||||||
var request = {
|
var request = {
|
||||||
file: $(".edit-header .current span:eq(0)").attr("title"),
|
file: $(".edit-header .current span:eq(0)").attr("title"),
|
||||||
code: wide.curEditor.getValue()
|
code: wide.curEditor.getValue()
|
||||||
|
@ -99,23 +101,23 @@ var wide = {
|
||||||
url: '/file/save',
|
url: '/file/save',
|
||||||
data: JSON.stringify(request),
|
data: JSON.stringify(request),
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
success: function(data) {
|
success: function (data) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
saveAllFiles: function() {
|
saveAllFiles: function () {
|
||||||
// TODO: save all
|
// TODO: save all
|
||||||
},
|
},
|
||||||
closeFile: function() {
|
closeFile: function () {
|
||||||
// TODO: save all
|
// TODO: save all
|
||||||
},
|
},
|
||||||
closeAllFiles: function() {
|
closeAllFiles: function () {
|
||||||
// TODO: save all
|
// TODO: save all
|
||||||
},
|
},
|
||||||
exit: function() {
|
exit: function () {
|
||||||
// TODO: exit
|
// TODO: exit
|
||||||
},
|
},
|
||||||
run: function() {
|
run: function () {
|
||||||
var request = {
|
var request = {
|
||||||
file: $(".edit-header .current span:eq(0)").attr("title"),
|
file: $(".edit-header .current span:eq(0)").attr("title"),
|
||||||
code: wide.curEditor.getValue()
|
code: wide.curEditor.getValue()
|
||||||
|
@ -126,14 +128,14 @@ var wide = {
|
||||||
url: '/build',
|
url: '/build',
|
||||||
data: JSON.stringify(request),
|
data: JSON.stringify(request),
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
beforeSend: function(data) {
|
beforeSend: function (data) {
|
||||||
$('#output').text('');
|
$('#output').text('');
|
||||||
},
|
},
|
||||||
success: function(data) {
|
success: function (data) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
goget: function() {
|
goget: function () {
|
||||||
var request = {
|
var request = {
|
||||||
file: $(".edit-header .current span:eq(0)").attr("title")
|
file: $(".edit-header .current span:eq(0)").attr("title")
|
||||||
};
|
};
|
||||||
|
@ -143,14 +145,14 @@ var wide = {
|
||||||
url: '/go/get',
|
url: '/go/get',
|
||||||
data: JSON.stringify(request),
|
data: JSON.stringify(request),
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
beforeSend: function(data) {
|
beforeSend: function (data) {
|
||||||
$('#output').text('');
|
$('#output').text('');
|
||||||
},
|
},
|
||||||
success: function(data) {
|
success: function (data) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
goinstall: function() {
|
goinstall: function () {
|
||||||
var request = {
|
var request = {
|
||||||
file: $(".edit-header .current span:eq(0)").attr("title"),
|
file: $(".edit-header .current span:eq(0)").attr("title"),
|
||||||
code: wide.curEditor.getValue()
|
code: wide.curEditor.getValue()
|
||||||
|
@ -161,14 +163,14 @@ var wide = {
|
||||||
url: '/go/install',
|
url: '/go/install',
|
||||||
data: JSON.stringify(request),
|
data: JSON.stringify(request),
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
beforeSend: function(data) {
|
beforeSend: function (data) {
|
||||||
$('#output').text('');
|
$('#output').text('');
|
||||||
},
|
},
|
||||||
success: function(data) {
|
success: function (data) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
fmt: function() {
|
fmt: function () {
|
||||||
var path = $(".edit-header .current span:eq(0)").attr("title");
|
var path = $(".edit-header .current span:eq(0)").attr("title");
|
||||||
var mode = wide.curNode.mode;
|
var mode = wide.curNode.mode;
|
||||||
|
|
||||||
|
@ -186,7 +188,7 @@ var wide = {
|
||||||
url: '/go/fmt',
|
url: '/go/fmt',
|
||||||
data: JSON.stringify(request),
|
data: JSON.stringify(request),
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
success: function(data) {
|
success: function (data) {
|
||||||
if (data.succ) {
|
if (data.succ) {
|
||||||
wide.curEditor.setValue(data.code);
|
wide.curEditor.setValue(data.code);
|
||||||
}
|
}
|
||||||
|
@ -200,7 +202,7 @@ var wide = {
|
||||||
url: '/html/fmt',
|
url: '/html/fmt',
|
||||||
data: JSON.stringify(request),
|
data: JSON.stringify(request),
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
success: function(data) {
|
success: function (data) {
|
||||||
if (data.succ) {
|
if (data.succ) {
|
||||||
wide.curEditor.setValue(data.code);
|
wide.curEditor.setValue(data.code);
|
||||||
}
|
}
|
||||||
|
@ -224,12 +226,50 @@ var wide = {
|
||||||
// TODO: XML/JSON 格式化处理
|
// TODO: XML/JSON 格式化处理
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
_bindKey: function () {
|
||||||
|
$("#files").keydown(function (event) {
|
||||||
|
if (!wide.curNode) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (event.which) {
|
||||||
|
case 13: // 回车
|
||||||
|
if (wide.curNode.iconSkin === "ico-ztree-dir ") { // 选中节点是目录
|
||||||
|
// 不做任何处理
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 模拟点击:打开文件
|
||||||
|
tree._onClick(wide.curNode);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 38: // 上
|
||||||
|
tree.fileTree.selectNode(wide.curNode.getPreNode());
|
||||||
|
wide.curNode = wide.curNode.getPreNode();
|
||||||
|
$("#files").focus();
|
||||||
|
break;
|
||||||
|
case 40: // 下
|
||||||
|
// TODO: 处理滚动条,递归获取下一个
|
||||||
|
tree.fileTree.selectNode(wide.curNode.getNextNode());
|
||||||
|
wide.curNode = wide.curNode.getNextNode();
|
||||||
|
$("#files").focus();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).keydown(function (event) {
|
||||||
|
if (event.ctrlKey && event.which === 49) { // Ctrl+1 焦点切换到文件树
|
||||||
|
|
||||||
|
// 有些元素需设置 tabindex 为 -1 时才可以 focus
|
||||||
|
$("#files").focus();
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function () {
|
||||||
wide.init();
|
wide.init();
|
||||||
tree.init();
|
tree.init();
|
||||||
menu.init();
|
menu.init();
|
||||||
|
|
|
@ -103,7 +103,7 @@
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="side">
|
<div class="side">
|
||||||
<div class="side-1">
|
<div class="side-1">
|
||||||
<ul id="files" class="ztree"></ul>
|
<ul id="files" tabindex="-1" class="ztree"></ul>
|
||||||
|
|
||||||
<!-- 目录右键菜单 -->
|
<!-- 目录右键菜单 -->
|
||||||
<div id="dirRMenu" class="frame">
|
<div id="dirRMenu" class="frame">
|
||||||
|
|
Loading…
Reference in New Issue