幻想小说网 酷文学 深夜书屋 叮当小说网 找小说网 无限小说网 红尘小说网

集成代码编辑器ACE的经验

ACE是最流行的在线代码编辑器之一,在CanTK的集成开发环境GameBuilder里也使用了ACE。ACE的功能非常强大,但是由于使用方法不当,大家反映GameBuilder的代码编辑器不好用。最近花了点时间去完善它,这里把遇到的问题写出来,供有需要的朋友参考。

1.Linux下代码显示与输入不一致。

Fedora下代码显示与输入不一致,水平方向上,输入位置是代码显示的一倍。这个问题困扰了我很久,它让代码编辑器根本没法使用。升级操作系统和ACE到最新版本,也无法解决这个问题,而且大部分使用ACE的网站都有这个问题。后来发现是字体的问题,使用edgefonts的字体就OK了。但是国内访问use.edgefonts.net经常超时,需要把https://use.edgefonts.net/source-code-pro.js及字体取到本地服务器上。

2.代码自动补全。

ACE支持代码自动补全,网上也有文章介绍。但是实际使用时,有两点值得注意:

1.数据格式 下面的代码注册一个Completer,回调函数把准备的数据传递给ACE,ACE会自动根据当前的输入进行匹配,所以这里不需要预先过滤。
var tangideCompleter = {
    getCompletions: function(editor, session, pos, prefix, callback) {
        if (prefix.length === 0) {
            return callback(null, []);
        }else {
            return callback(null, autoCompleteData);
        }
    }
}
editor.setOptions({enableBasicAutocompletion: true, enableSnippets: true, enableLiveAutocompletion: true});
var langTools = ace.require("ace/ext/language_tools");
langTools.addCompleter(tangideCompleter);

autoCompleteData是一个数组,每一项都类似于下面这个结构:
{“meta”:”function”, “caption”:”addShape”, “value”:”addShape”,”score”:1},

meta:显示在提示框的右边(如下图)。
caption:显示在提示框的左边(如下图)。
value:是实际插入的数据。
score:表示优先级,高的排在前面。

显示效果

1.快捷键 启用补全的快捷键是Ctrl+Space,在中文Windows下,与开关输入法的快捷键冲突。这个可以开启enableLiveAutocompletion选项,或者修改一下ext-language_tools.js:
Autocomplete.startCommand = {
name: "startAutocomplete",
exec: function(editor) {
    if (!editor.completer)
        editor.completer = new Autocomplete();
    editor.completer.autoInsert = false;
    editor.completer.autoSelect = true;
    editor.completer.showPopup(editor);
    editor.completer.cancelContextMenu();
},
bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space|Ctrl-P"

};

3.全屏编辑

ACE的全屏编辑需要自己处理,这里全屏并非真正的全屏,只是占满浏览器的窗口。通过Ctrl+Enter进行全屏和非全盘切换。

    editor.commands.addCommand({
    name: "fullscreen",
    bindKey: {win: "Ctrl-Enter", mac: "Command-Enter"},
    exec: function(editor) {
        var vp = cantkGetViewPort();
        if(editor.isFullScreen) {
            div.style.width = editorW + "px";
            div.style.height = editorH + "px";
            div.style.position = "absolute";
            div.style.left = editorX + "px";
            div.style.top = (scrollTop + editorY) + "px";
            editor.resize();
            editor.isFullScreen = false;
            document.body.style.overflow = "auto";
        }
        else {
            div.style.width = vp.width+ "px";
            div.style.height = vp.height+ "px";
            div.style.position = "absolute";
            div.style.left = 0 + "px";
            div.style.top = (scrollTop + 0) + "px";
            editor.resize();
            editor.isFullScreen = true;
            document.body.style.overflow = "hidden";
        }
    }
});

以上代码是GameBuilder里的实现,需要根据实际情况修改。

posted on 2015-03-03 11:27  张云临  阅读(602)  评论(0编辑  收藏  举报

导航