2017-04-16 221 views
0

使用ace編輯器,我想提供自動完成,因爲除了代碼片段完成之外,用戶還可以輸入。舉個例子,我有下面的代碼片段Ace編輯|自動代碼塊完成

\begin{${1:something}} 

\end{${1:something}} 

現在這個工作就像一個通用的片段。現在,隨着用戶類型

\begin{equation} 

和命中ENTER我想插入匹配的結束塊,如第一段中所示。有沒有比添加keyboardHandler並檢查前面的文本更好的方法?可能是一種顯示自定義「片段」的方式,其中包含$ {1}的值作爲自動完成功能?

回答

0

我現在已經通過在光標前面有一個命令時觸發自動完成來解決問題。這樣可以解決這兩個問題,因爲ENTER鍵插入當前選定的片段。

editor.commands.on("afterExec", function(e) { 
     if (e.command.name === "insertstring") { 
      if (getCommand(editor)) { 
       editor.execCommand("startAutocomplete"); 
      } 
     } 
}); 

getCommand基本上確定是否有光標後面的命令:我使用以下代碼觸發自動完成。現在,當有命令時觸發自動完成,需要自定義完成程序以從包含\ end標記的輸入命令動態構建片段。

identifierRegexps: [/[\\a-zA-Z0-9{}\[\]]/], 
getCompletions: function(editor, session, pos, prefix, callback) { 
    const command = getCommand(editor); 
    if (!command) { callback(null, []); return } 
    const completions = []; 

    let caption = command.cmd; 
    if (command.mods.length > 0) caption += `[${command.mods}]`; 
    if (command.args.length > 0) caption += `{${command.args}}`; 

    let snippet = command.cmd; 
    if (command.mods.length > 0) snippet += `[${command.mods}]`; 
    if (command.args.length > 0) snippet += `{${command.args}}`; 

    if (command.cmd === '\\begin') { 
     snippet += '\n\t${1}'; 
     snippet += `\n\\end{${command.args}}` 
    } 

    completions.push({ 
     caption: caption, 
     snippet: snippet, 
     meta: command.cmd === '\\begin' ? 'env' : 'cmd', 
    }); 

    callback(null, completions); 
} 

注意identifierRegexps,這是需要防止從編輯保持舊的命令,這對用戶觸發的自動完成之前輸入。它基本上匹配所有字母數字字符以及括號和反斜槓。然後,我通過執行以下操作將此代碼添加到編輯器中:

langTools.addCompleter(customCompleter); 

其中customCompleter是上面顯示的對象。