在 AS3 中使用 Ace Editor 进行简单的自动完成?

Simple autocomplete with Ace Editor in AS3?

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

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

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

我希望自动完成显示 "width, height, x, y"。

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

我发现了类似的问题,但这些问题使用的是服务呼叫,还有一些已经过时了。如果它是重复的,我可能会删除这个问题。

AS3 的 Ace 编辑器 here

在我的例子中,对于 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() 方法的新方法。