2017-04-16 1 views
0

En utilisant l'éditeur d'as je voudrais fournir la complétion automatique pendant que l'utilisateur tape en plus de l'achèvement d'extrait. Pour donner un exemple, j'ai l'extrait suivantÉditeur Ace | Achèvement automatique du bloc de code

\begin{${1:something}} 

\end{${1:something}} 

Maintenant, cela fonctionne comme un extrait d'usage général. Maintenant que l'utilisateur tape

\begin{equation} 

et frappe ENTER Je voudrais insérer un bloc de fin correspondant comme vu dans le premier extrait. Existe-t-il un meilleur moyen que d'ajouter un keyboardHandler et de vérifier le texte précédent? Peut-être un moyen d'afficher le "snippet" personnalisé qui inclut également la valeur de $ {1} comme autocomplétion?

Répondre

0

J'ai maintenant résolu le problème en déclenchant l'auto-complétion quand il y a une commande précédant le curseur. Cela corrige les deux problèmes puisque la touche ENTRÉE insère l'extrait sélectionné. Je autocomplétion en utilisant le déclenché code suivant:

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

getCommand détermine essentiellement si oui ou non il y a une commande derrière le curseur. Maintenant que la complétion automatique est déclenchée quand il y a une commande, un complément personnalisé est nécessaire pour générer de façon dynamique des extraits à partir de la commande entrée qui inclut la balise \ 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); 
} 

Notez les identifierRegexps, qui est nécessaire pour empêcher l'éditeur de garder l'ancienne commande que l'utilisateur est entré avant le déclenchement de la saisie semi-automatique. Il correspond fondamentalement à tous les caractères alphanumériques ainsi qu'aux crochets et aux barres obliques inverses. J'ai ensuite ajouté ce code à l'éditeur en exécutant la commande suivante:

langTools.addCompleter(customCompleter); 

Où customCompleter est l'objet ci-dessus.