2013-10-08 118 views
7

我在代碼鏡像中遇到了一些難以自動完成的功能。我試圖做的是兩件事情(我都在努力):CodeMirror AutoComplete自定義列表

1)我想啓用自動完成的HTMLJavaScript。 目前我只能得到一個使用在同一時間工作例如: -

CodeMirror.commands.autocomplete = function (cm) { 
    CodeMirror.showHint(cm, CodeMirror.hint.html); 
}; 

我如何可以添加CodeMirror.hint.javascriptHTML一個列表?

2)(類更重要) - 我如何可以添加自定義變量提示列表從HTML該區域從一個Ajax調用檢索.....

即我想有下拉菜單顯示當前的HTML提示數據列表,但添加自定義條目,如##SomeCode1####SomeCode2##

我在這裏有兩個問題。首先,當我嘗試對'html-hint.js'文件中的值進行硬編碼時,所有值都會附加< ......這不是我想要的。

第二個問題,種,是我相信我必須寫一個新的'html-hint.js'文件正確嗎?我的意思是沒有辦法在上面的CodeMirror.hint.html的'options'參數中傳遞任何東西,從而實質上合併了兩個列表。

我的一個和兩個人都有同樣的想法...合併兩個自動完成值的列表。

我猜測框架裏已經沒有東西了,我必須編寫一個自定義的提示文件,對嗎?

任何指針,將不勝感激。示例代碼會很棒。

回答

15

如果不指定提示功能,展示,提示插件將在其完成情況的當地模式定義的提示輔助函數,所以這將是CodeMirror.hint.javascriptJavaScript代碼和HTML CodeMirror.hint.html

如果您需要添加自己的完成邏輯,您可以用自己的代碼簡單地覆蓋這些函數來替換(或包裝)這些函數。

這裏是粗例如黑客工具,始終將「博若」爲JavaScript完井:

var orig = CodeMirror.hint.javascript; 
CodeMirror.hint.javascript = function(cm) { 
    var inner = orig(cm) || {from: cm.getCursor(), to: cm.getCursor(), list: []}; 
    inner.list.push("bozo"); 
    return inner; 
}; 
+1

非常有幫助。也許你可以擴展你的答案如何使真正的自動完成,就像當我進入「博」時,只會建議「bozo」,而不是f.e. 「foobar」,並且它不會在「bo」後面添加「bozo」,而是用「bozo」替換「bo」。謝謝:) – MonkeyMonkey

+0

+1對於bozo你jabroni! –

+1

Marijn,上面的代碼不能按預期工作。 'bozo'這個詞確實被添加到列表中,但是當我鍵入'b-o-z ...'時,它不被選中。相反,如果我的頁面有一個名爲'猴子'的函數,當我鍵入'm-o-n ...'時,這個名字確實被選中。此外,單詞'bozo'總是*顯示,而不僅僅是當用戶輸入類似的單詞時。這不是自動完成的預期行爲。有沒有其他方法可以實現這一點? – shmim

5

感謝@Marjin的簡要說明,但由於它不包括過濾和很多人需要它,這是我遵循Marjin的回答在mongoclient中所做的。並部分從here

p.s.不要忘記更改與你的提示,因爲我使用JavaScript我已經改變了JavaScript提示。

CodeMirror.hint.javascript = function (editor) { 
     var list = Session.get(Template.strSessionDistinctFields) || []; 
     var cursor = editor.getCursor(); 
     var currentLine = editor.getLine(cursor.line); 
     var start = cursor.ch; 
     var end = start; 
     while (end < currentLine.length && /[\w$]+/.test(currentLine.charAt(end))) ++end; 
     while (start && /[\w$]+/.test(currentLine.charAt(start - 1))) --start; 
     var curWord = start != end && currentLine.slice(start, end); 
     var regex = new RegExp('^' + curWord, 'i'); 
     var result = { 
      list: (!curWord ? list : list.filter(function (item) { 
       return item.match(regex); 
      })).sort(), 
      from: CodeMirror.Pos(cursor.line, start), 
      to: CodeMirror.Pos(cursor.line, end) 
     }; 

     return result; 
    }; 
+0

是否可以將自定義提示列表僅添加到某個CodeMirror實例? – peterremec

+0

ofc,在這種情況下,您需要爲codemirror創建自己的模式,http://stackoverflow.com/questions/24433552/writing-a-custom-mode-for-codemirror-for-use-in-brackets –

+0

I'我不確定我們是否瞭解對方。在具有自動完成功能的頁面上,我有兩個CodeMirror「sql模式」實例。除了內置的sql關鍵字之外,我還需要添加一些自定義關鍵字。我不明白爲什麼我應該創建一個新的模式。此外,我正在尋找一種方法來動態地添加/刪除關鍵字從列表 – peterremec