Ace是Ajax.org Cloud9 Editor的简称,是一款由JavaScript实现的代码编辑器。本文将提供Ace的官网地址及演示地址等,并介绍相关的各种使用方法。
官方地址:
http://ace.c9.io/
官方在线演示地址:
https://ace.c9.io/build/kitchen-sink.html
Github源码地址:
https://github.com/ajaxorg/ace
Ace的基本使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<script src="/js/lib/ace-1.13.0/src-min/ace.js" type="text/javascript" charset="utf-8"></script>
<div id="typingEditor"></div>
<div id="runEditor"></div>
<script>
var typingEditor = ace.edit("typingEditor");
var runEditor = ace.edit("runEditor");
typingEditor.setTheme("ace/theme/cloud9_day");
typingEditor.session.setMode("ace/mode/json");
typingEditor.setOptions({
fontFamily: "Consolas",
fontSize: "11pt"
});
typingEditor.setValue('{\n' +
' "name": "abc",\n' +
' "description": "def"\n' +
'}');
typingEditor.clearSelection();
typingEditor.getSession().on('change', function() {
inputChanged();
});
runEditor.setTheme("ace/theme/cloud9_day");
runEditor.session.setMode("ace/mode/golang");
runEditor.setOptions({
// fontFamily: "Consolas, \"Courier New\", monospace;",
// fontFamily: "tahoma",
fontSize: "11pt"
});
runEditor.session.setUseWorker(false);
runEditor.setShowPrintMargin(false);
// runEditor.setReadOnly(true);
</script>
|
Ace的基本操作
通过setTheme来设置主题
1
|
editor.setTheme("ace/theme/twilight");
|
通过setMode来设置编辑器对应的语言模式
1
|
editor.session.setMode("ace/mode/markdown");
|
通过setFontSize可以设置编辑器内文本字体的大小
1
|
editor.setFontSize(11);
|
通过setTabSize可以设置制表符的长度
1
|
editor.getSession().setTabSize(4);
|
同时可以通过setUseSoftTabs将制表符变成对应长度的空格
1
|
editor.session.setUseSoftTabs(true);
|
如果你不想编辑,可以通过setReadOnly可以将编辑器设置为只读模式
1
|
editor.setReadOnly(true);
|
默认情况下ace编辑器中会有一道竖线标识打印的边距,可以通过setShowPrintMargin来控制其是否显示
1
|
editor.setShowPrintMargin(false);
|
Ace的编辑操作
通过getValue可以获取到编辑器中的全部数据
1
|
editor.getSession().getValue()
|
如果编辑器内有部分数据被选中,则可以通过getSelectionRange来获取选中的部分内容
1
|
editor.session.getTextRange(editor.getSelectionRange())
|
通过setValue可以给编辑器初始化数据
1
2
3
4
|
editor.getSession().setValue('{\n' +
' "name": "tool.hiofd.com",\n' +
' "description": "def"\n' +
'}')
|
当你想往编辑器插入数据时,可以通过insert在光标处插入数据
1
|
editor.insert('tool.hiofd.com')
|
通过getLength可以获取到编辑器内数据的总行数
1
|
editor.session.getLength()
|
goLine则可以跳转到指定的行
通过getCursor可以获取到编辑器内光标的位置,输出结果为一个标识行和列的字典,像这样:{row:13,column:37}
1
|
editor.selection.getCursor()
|
Ace的搜索替换操作
通过find进行搜索
1
2
3
4
5
6
7
|
editor.find('ops-coffee', {
backwards: false,
wrap: false,
caseSensitive: false,
wholeWord: false,
regExp: false
});
|
find后边跟了两个参数, 第一个为要搜索的内容,第二个为搜索配置的字典, 字典内可以配置如下一些参数
backwards: 是否反向搜索,默认为false
wrap: 搜索到文档底部是否回到顶端,默认为false
caseSensitive: 是否匹配大小写搜索,默认为false
wholeWord: 是否匹配整个单词搜素,默认为false
range: 搜索范围,要搜素整个文档则设置为空
regExp: 搜索内容是否是正则表达式,默认为false
start: 搜索起始位置
skipCurrent: 是否不搜索当前行,默认为false
通过findAll可以高亮显示全部搜索到的内容
findNext则可以查找下一个搜索到的内容
findPrevious查找上一个匹配的内容
通过replace可以对当前find查找到的字符串进行替换
1
|
editor.replace('tech.hiofd.com');
|
而通过replaceAll则可以对find查找到的所有内容替换
1
|
editor.replaceAll('tech.hiofd.com');
|
Ace的事件监听
通过change可以监听到编辑器内容的变化
1
2
3
|
editor.getSession().on('change', function(e) {
console.log('内容有变化')
});
|
changeSelection则可以监听到选择内容的变化
1
2
3
|
editor.getSession().selection.on('changeSelection', function(e) {
console.log('选择内容有变化')
});
|
连光标的变化都可以通过changeCursor监听到
1
2
3
|
editor.getSession().selection.on('changeCursor', function(e) {
console.log('监听光标的变化')
});
|
Ace替换textarea案例
html中的textarea有缺点,就是连最基本的换行都无法实现,所以我通常都会用ace来代替form表单中的textarea,但submit无法自动获取pre标签的数据做提交,这该如何处理呢?
一种简单的方式就是将textarea隐藏,同时创建一个ace编辑器来取代他,然后检测编辑器内数据的变化自动给填充到textarea内,完整的例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<form class="form-horizontal" id="modalForm_Content" method="post" action="">
<div class="form-group">
<label class="col-md-2 control-label"> 内容</label>
<div class="col-md-9">
<textarea class="form-control" id="form_content" name="content" rows="20"></textarea>
<pre id="content" style="height:415px"></pre>
</div>
</div>
</form>
<script>
editorvar editor = ace.edit("content");
var textarea = $('textarea[name="content"]').hide();
editor.getSession().on('change', function(){
textarea.val(editor.getSession().getValue());
});
</script>
|