2016-10-13 79 views
0

我想自定義自動完成功能到Codemirror。如何自定義CodeMirror的自動完成功能

所以我建立這個代碼:

CodeMirror.commands.autocomplete = function (cm) { 
    var arrayTabNONDefault = new Array(); 
    var stringaCampi = null; 
    var arrayTabellaCampo = null; 
    var textVal = cm.getValue(); 
    textVal = textVal.toUpperCase(); 

    var res = textVal.match("SELECT(.*)FROM"); 
    if (res != null) { 
    stringaCampi = res[1]; 
    arrayTabellaCampo = stringaCampi.split(","); 
    var nomeTab = null; 
    for (var i = 0; i < arrayTabellaCampo.length; i++) { 
     nomeTab = (arrayTabellaCampo[i].split(".")[0]).trim(); 
     if (hintTables[nomeTab] == null) 
     hintTables[nomeTab] = new Array(); 
    } //FINE FOR 
    } //FINE IF 

    CodeMirror.showHint(cm, CodeMirror.hint.sql, { 
    tables: hintTables 
    }); 

    cm.on("beforeChange", function (cm, change) { 
    var before = cm.getRange({ line: 0, ch: 0 }, change.from); 
    var text = cm.getRange(change.from, change.to); 
    var after = cm.getRange(change.to, { line: cm.lineCount() + 1, ch: 0 }); 
    if (before.indexOf("FROM") !== -1) 
    //       alert("Ho scritto FROM"); 
     console.log("before change", before, text, after); 
    }); 

    cm.on("change", function (cm, change) { 
    var from = change.from; 
    var text = change.text.join("\n"); 
    var removed = change.removed.join("\n"); 
    var to = cm.posFromIndex(cm.indexFromPos(from) + text.length); 

    var before = cm.getRange({ line: 0, ch: 0 }, from); 
    var after = cm.getRange(to, { line: cm.lineCount() + 1, ch: 0 }); 

    if (before.indexOf("FROM") !== -1) 
     console.log("after change", before, removed, text, after); 
    }); 


} //FINE ESTENSIONE 

這是

var hintTables = { "#T_TF_FilesList": ["FilesListHeaderID", "NumRecord", "FileTypeID", "FileID", "FilesListHeaderID", "NumRecord"], 
      "#T_TF_SelectedItems": ["EventHeaderID", "ItemType", "ItemID1", "ItemID2", "EventHeaderID", "ItemType", "ItemID1", "ItemID2"], 
      "#T_TFT_CacheSearchCriteriaHeaders": ["ID", "SyncDate", "FileTypeID", "CriteriaExpressionString", "CriteriaExpressionHash", "PageRecordsNumber", "PageNumber", "NumFiles"] 
     }; 

所以我想,該系統應該提出這個表的名單我寫信後,或hintTables的內容在我寫EXECUTE之後,系統應該提出一個存儲過程列表。

可以這樣做嗎?

回答

0

您是否嘗試自定義SQL提示插件?如果是這樣,你應該在sql-hint.js(在codemirror/addon/hint下)進行更改。

基本上你應該做的是:

1.In您app.js(你的主邏輯無論js文件)調用editor.showHint({hint: CodeMirror.hint.sql)"change"事件;

2.內部sql-hint.js,返回{list: hintTables, from: somePos, to: somePos}當用戶鍵入FROM或EXECUTE可以通過正則表達式檢測或檢查該行的標記。我提出了供您參考代碼:

var cursor = editor.getCursor(); 
var tokenAtCursor = editor.getTokenAt(cursor); 
if (tokenAtCursor.type == "FROM-and-EXECUTE") 
    return {list: hintTables, 
      from: CodeMirror.Pos(cur.line, tokenAtCursor.start), 
      to: CodeMirror.Pos(cur.line, tokenAtCursor.end)}; 

如果我誤解你的問題,這個答案是沒有幫助的,請告訴我,我會刪除它。