【发布时间】:2013-12-03 05:16:00
【问题描述】:
我有一个 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),但无法理解。我什至不确定这是否是正确的起点。
【问题讨论】:
-
如果您使用
var keywords = /word1|word2/g(不带引号)或不使用g,会发生什么情况? -
@OGHaza 你真是个天才。
var keywords = /word1|word2/g(不带引号)效果很好。不过,全局匹配参数g是关键。如果没有g,只有第一个匹配/word1|.../g被正确突出显示,相同单词/word1|.../g的所有其他匹配具有不太明显的突出显示,而所有其他单词/...|word2|etc./g根本没有任何突出显示。但为什么它不适用于引号(我认为new RegExp(keywords)会处理这个问题?无论如何,非常感谢您的建议。您为我节省了很多时间。 -
没问题,你能帮我一个忙并接受我发布的答案。至于为什么他们不使用引号,我猜 Javascript 将其解释为字符串文字,即使它在
RegExp(..)中,老实说我不太确定。 -
会的。这样我就不再需要
keywords = new RegExp(keywords);了。
标签: jquery regex highlight ace-editor