2014-03-04 17 views
5

完全是ace編輯器的新手,動態添加額外的規則到模式文件中進行語法高亮我正在做一個ajax調用,它設置了模式中可用的全局變量文件來處理。動態更新Ace編輯器的語法高亮模式規則

這裏是設置和初始Ajax調用:

var editor = ace.edit("editor"); 

$.ajax({ 
    url: "json-mode-rules.php", 
    dataType: "json" 
}).done(function(data) { 
    window.myModeRules=data; // ("foo","bar","etc") 
    editor.getSession().setMode("ace/mode/python"); 
}); 

模式文件修補下列要求:

// keywords has already been initialised as an array 
// e.g. var keywords = ("and|as|assert...etc") 
var extraRules=window.codebenderModeLibrary["myModeRules"].join("|"); 
keywords=(keywords[0]+"|"+ extraRules); 

當頁面加載initallly王牌編輯器獲取所有的關鍵字語法高亮。這很好。

問題是我們有規則在發生某些事件時發生變化,並希望ace編輯器刷新它的語法規則。

再次執行ajax調用並調用setMode什麼也不做 - 這是因爲要求js不重新加載文件。

我已經發布在GitHub上的問題沒有解決尚未:

https://github.com/ajaxorg/ace/issues/1835

「如果你真的想保持全局變量,你可以在一個功能包的一切 ,調用該函數獲取更新模式的構造函數,然後調用setMode(new Mode)。「 」

我不知道該怎麼做,任何幫助,將不勝感激。

任何人都有關於如何動態更新ace編輯器語法高亮規則的技巧?

回答

12

https://github.com/ajaxorg/ace/blob/9cbcfb35d3/lib/ace/edit_session.js#L888

setMode緩存模式,除非他們有選擇 所以你可以調用

session.setMode({ 
    path: "ace/mode/python", 
    v: Date.now() 
}) 

,迫使它創建一個新的模式。

另一種方式是做

var DynHighlightRules = function() { 
    // add function to change keywords 
    this.setKeywords = function(kwMap) { 
     this.keywordRule.onMatch = this.createKeywordMapper(kwMap, "identifier") 
    } 
    this.keywordRule = { 
     regex : "\\w+", 
     onMatch : function() {return "text"} 
    } 

    this.$rules = { 
     "start" : [ 
      { 
       token: "string", 
       start: '"', 
       end: '"', 
       next: [{ token : "language.escape", regex : /\\[tn"\\]/}] 
      }, 
      this.keywordRule 
     ] 
    }; 
    this.normalizeRules() 
}; 

,然後每當亮點規則的改變做

// update keywords 
editor.session.$mode.$highlightRules.setKeywords({"keyword": "foo|bar|baz"}) 
// force rehighlight whole document 
editor.session.bgTokenizer.start(0) 

看到http://jsbin.com/ojijeb/445/edit

+0

謝謝。我會盡快檢查兩種方法並報告。 – zaf

+0

在日期中添加選項。當我有更多時間時,我會檢查另一種方法。乾杯。 – zaf

+0

是否有可能使用此來更改ace/mode/javascript中的關鍵字? – techdog