Как выделить несколько слов с помощью редактора ace?

У меня есть поле формы textarea. Я бы хотел, чтобы редактор ace сразу выделял все вхождения определенных предопределенных слов. Передача их в такой массив не работает: editor.findAll("word1","word2","..."); Я думал об использовании регулярных выражений, фильтрующих отдельные слова. Это мой код:

<script type="text/javascript" src="/ace/src-min/ace.js" charset="utf-8"></script>
<script>
// Hook up ACE editor to all textareas with data-editor attribute
$(function () {
    $('textarea[data-editor]').each(function () {
        var textarea = $(this);
        var mode = textarea.data('editor');
        textarea.css('visibility', 'hidden');

        var editor = ace.edit(edit);
        editor.renderer.setShowGutter(false);
        editor.getSession().setValue(textarea.val());
        editor.getSession().setMode("ace/mode/" + mode);
        editor.getSession().setUseWrapMode(true); // adds vertical scrollbar


        var keywords = "word1|word2";
        keywords = new RegExp(keywords);

        editor.findAll(keywords,{
            //caseSensitive: false,
            //wholeWord: true,
            regExp: true
        });
    });
});
</script>

К сожалению, это ничего не делает. Может быть, я пропускаю какую-то библиотеку? Я получил регулярные выражения, работающие с codemirror (http://codemirror.net/), но хотел дать ace-editor пытаться. Видимо это как-то работает:

var highlightWords = "word1|word2|word3|phrase one|phrase number two|etc";
 var keywordMapper = this.createKeywordMapper({
     "highlightWords": highlightWords
}, "identifier", true);

Но, честно говоря, я не знаю, как собрать все эти кусочки вместе и заставить их работать. В основном я хочу передать список предопределенных слов ace, чтобы они были выделены. Если я не ошибаюсь, мне нужно настроить собственное правило подсветки для этого, а затем заставить их работать с ace-editor. Может быть, кто-то делал это раньше или мог бы привести простой пример? Я пробовал эту документацию (https://github.com/ajaxorg/ace/wiki/Creating-or-Extending-an-Edit-Mode), но не вижу в этом никакого смысла. Я даже не уверен, является ли это правильной отправной точкой.


person Jörg    schedule 19.11.2013    source источник
comment
Что произойдет, если вы используете var keywords = /word1|word2/g (без кавычек) или то же самое без g?   -  person OGHaza    schedule 22.11.2013
comment
@OGHaza Ты гений. var keywords = /word1|word2/g (без кавычек) работает просто отлично. Тем не менее, глобальный параметр соответствия g был решающим моментом. Без g правильно выделяется только первое совпадение /word1|.../g, все остальные совпадения одного и того же слова /word1|.../g выделяются менее отчетливо, тогда как все остальные слова /...|word2|etc./g вообще не выделяются. Но почему это не работает с кавычками (я думал, что new RegExp(keywords) позаботится об этом? В любом случае, большое спасибо за ваше предложение. Вы сэкономили мне много времени.   -  person Jörg    schedule 22.11.2013
comment
Нет проблем, не могли бы вы сделать мне одолжение и принять ответ, который я разместил. Что касается того, почему они не работают с кавычками, я думаю, что Javascript интерпретирует это как строковый литерал, даже если он находится внутри RegExp(..), хотя, честно говоря, я не слишком уверен.   -  person OGHaza    schedule 22.11.2013
comment
Сделаю. Таким образом, мне больше не нужен keywords = new RegExp(keywords);.   -  person Jörg    schedule 22.11.2013


Ответы (1)


Вы можете сделать следующее:

var keywords = /word1|word2/g

В Javascript регулярные выражения заключаются не в кавычки, а в разделитель (я использовал /) с флагами, появляющимися после второго разделителя.

g — это глобальный флаг, поэтому регулярное выражение будет совпадать несколько раз в вашем редакторе.

Вы также можете использовать переменную keywords из вопроса:

var keywords = new RegExp(keywords, 'g');
person OGHaza    schedule 22.11.2013
comment
Но как я могу назначить список слов: var word_list = "word1|word2|..." ключевым словам var как регулярное выражение? var keywords = "/"+word_list+"/g"; не работает, и var keywords = new RegExp(word_list); тоже не работает. - person Jörg; 23.11.2013
comment
Эй, чувак, оказывается, мой ответ был очень вводящим в заблуждение. Вы можете использовать var keywords = new RegExp(word_list, "g"); - person OGHaza; 23.11.2013