【问题标题】:Simple autocomplete with Ace Editor in AS3?在 AS3 中使用 Ace 编辑器进行简单的自动完成?
【发布时间】:2016-12-10 20:13:42
【问题描述】:

我正在使用 XML,我想为使用 AS3 的特定节点类型的属性提供自动完成建议。

例如,如果用户在以下节点中有光标:

 <s:Button label="Hello World"/>

我希望自动完成以显示“宽度、高度、x、y”。

我正在尝试获取节点名称和命名空间,然后为编辑器提供应出现在自动完成中的属性列表。

我发现了类似的问题,但这些问题正在使用服务电话和一些已经过时的问题。如果它是重复的,我可以删除这个问题。

AS3 的 Ace 编辑器here

【问题讨论】:

    标签: actionscript-3 flash ace-editor


    【解决方案1】:

    就我而言,对于 AS3,它是项目的组合:

    ace.setCompleters(null); // I'm removing existing autocomplete  
    ace.addCompleter(codeCompleter); // adding my own
    
    public var autoCompleteErrorMessage:String = "Nothing available";
    public function codeCompleter(editor:Object, session:Object, position:Object, prefix:String, callback:Function):void {
        var row:int = position.row;
        var column:int = position.column;
    
        /*
        if (prefix.length === 0) { 
            callback(null, []);
            return;
        }
        */
        //var myList:Array = {value: "message", caption: "Caption to user", meta: "Type shown", score: "I don't know"};
    
        var testing:Boolean = false;
    
        if (testing) {
            callback(autoCompleteErrorMessage, [{value:"addedToStage"},{value:"added"},{value:"adding"}]);
        }
        else {
            callback(autoCompleteErrorMessage, attributes);
        }
    }
    
    
    protected function cursorChangeHandler(event:Event):void {
    
        var qname:QName = getQNameFromCursorPosition(ace.row, ace.column);
        if (qname==null) {
            if (attributes.length) {
                attributes = [];
            }
            return;
        }
    
        if (qname) { 
            attributes = getSuggestionListFromObject(classObject);
            autoCompleteErrorMessage = null;
            lastSelectedQName = qname;
        }
    }
    
    
    public static var XML_TAG_NAME:String       = "meta.tag.tag-name.xml";
    public static var XML_TAG_OPEN:String       = "meta.tag.punctuation.tag-open.xml";
    public static var XML_TAG_CLOSE:String      = "meta.tag.punctuation.tag-close.xml";
    public static var XML_ATTRIBUTE_NAME:String = "entity.other.attribute-name.xml";
    
    public function getQNameFromCursorPosition(row:int, column:int):QName {
        var token:Object;
        var line:String;
        var type:String;
        var value:String;
        var found:Boolean;
        var qname:QName;
    
        for (; row > -1; row--) {
            line = ace.getLine(row);
            column = line.length;
    
            for (; column>-1; column--) {
                token = ace.getTokenAt(row, column);
                type = token ? token.type : "";
    
                if (type==XML_TAG_NAME) {
                    value = token.value;
                    found = true;
                }
            }
    
            if (found) break;
        }
    
        if (found) {
            qname = new QName("", value);
        }
    
        return qname;
    }
    

    getQNameFromCursorPosition() 方法很脆弱,我正在研究一种使用jumpToMatching() 方法的新方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2015-03-20
      相关资源
      最近更新 更多