2017-04-16 231 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是上面显示的对象。