2016-10-13 2 views
0

자동 완성 기능을 Codemirror로 사용자 정의하고 싶습니다. 이것은 그래서 시스템이 내가 FROM 쓰기 후이 테이블의 목록을 제시, 또는해야 할CodeMirror의 자동 완성 기능을 사용자 정의하는 방법

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의 내용이

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 

입니다 :

그래서이 코드를 구축해야 EXECUTE을 작성한 후에 시스템은 저장 프로 시저 목록을 제안해야합니다.

가능합니까?

답변

0

SQL 힌트 애드온을 사용자 정의 하시겠습니까? 그렇다면 sql-hint.js (codemirror/addon/hint)에서 변경해야합니다.

은 기본적으로 당신이해야 할 것은 :

1.In 당신의 app.js (주 논리에 대한 어떤 JS 파일) "change" 이벤트에 editor.showHint({hint: CodeMirror.hint.sql) 전화;

2. 내부에서 사용자가 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)}; 

이, 제발 말해 내가 그것을 삭제합니다 : 나는 당신의 참고를위한 몇 가지 코드를했다.

관련 문제