马会东的博客

马会东的博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
作者:Albert.Wen  添加时间:2022-10-05 00:34:16  修改时间:2023-04-27 09:49:52  分类:HTML/CSS/JS 编辑

ACE Editor 是一个开源的、独立的、基于浏览器的代码编辑器,可以嵌入到任何 web 页面或 JavaScript 应用程序中。ACE 支持超过 110 种语言语法高亮,并能够处理代码多达 400 万行的大型文档。ACE 开发团队称,ACE 在性能和功能上可以媲美本地代码编辑器(如 Sublime Text、TextMate 和 Vim 等)

1、拷贝所需的JS文件

我是把源码目录 src-min-noconflict 中的文件,拷贝到项目目录中,如:/static/ace-editor/js

2、引用JS文件

在一般情况下,我们需要引入的js库是两个:ace.jsext-language_tools.js

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<!DOCTYPE html>
 <html>
     <head>
         <title>Demo of ACE Editor</title>
         <!--导入js库-->
         <script src="/static/ace-editor/js/ace.js" type="text/javascript" charset="utf-8"></script>
         <script src="/static/ace-editor/js/ext-language_tools.js" type="text/javascript" charset="utf-8"></script>
     </head>
      
     <body>
         <!--【特别注意】代码输入框,务必设置高度,否则无法显示 -->
         <!--【特别注意】pre标签和textarea标签之间不要有空格或换行,这些元素都会当着编辑器内容的一部分,造成出现“开头多出一些空格字符”的怪现象!!!-->
         <pre id="code" class="ace_editor" style="min-height:400px"><textarea class="ace_text-input">
 #include <cstdio>
 int main(){
     int n,m;
     scanf("%d %d",&n,&m);
     printf("%d",n+m);
     return 0;
 }
         </textarea></pre>
  
         <script>
             //初始化对象
             editor = ace.edit("code");
              
             //设置风格和语言(更多风格和语言,请到github上相应目录查看)
             theme = "clouds"
             language = "c_cpp"
             editor.setTheme("ace/theme/" + theme);
             editor.session.setMode("ace/mode/" + language);
              
             //字体大小
             editor.setFontSize(18);
              
             //设置只读(true时只读,用于展示代码)
             editor.setReadOnly(false);
              
             //自动换行,设置为off关闭
             editor.setOption("wrap", "free")
              
             //启用提示菜单
             ace.require("ace/ext/language_tools");
             editor.setOptions({
                     enableBasicAutocompletion: true,
                     enableSnippets: true,
                     enableLiveAutocompletion: true
                 });
         </script>
  
     </body>
 </html>

效果图(纯本机测试,Notepad++ + Firefox):

3、基本用法

去除中间的竖线:

1
editor.renderer.setShowGutter(false);

去除行号:

1
editor.setShowPrintMargin(false);

设置并获取内容:

1
2
3
editor.setValue("the new text here");
editor.session.setValue("the new text here"); // set value and reset undo history
editor.getValue(); // or session.getValue

设置主题:

1
editor.setTheme("ace/theme/xcode");

设置语言模式:

1
editor.session.setMode("ace/mode/sql");

启用提示菜单: 

1
2
3
4
5
6
7
ace.require("ace/ext/language_tools");
 
editor.setOptions({
    enableBasicAutocompletion: true,
    enableSnippets: true,
    enableLiveAutocompletion: true
});

撤销:

1
editor.undo();

重做回退:

1
editor.redo();

光标跳转到指定行:

1
editor.gotoLine();

查找替换:

1
editor.execCommand('replace');

自动换行:

1
editor.setOption("wrap", "free"); //关闭时free换成off

 

 

参考:

  1. ACE Editor在线代码编辑器简介及使用引导
  2. Ace editor中文文档
  3. ACE编辑器ace-editor笔记

 


工作项目中的一次应用

模板文件:aceEditor.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<textarea id="hid_${inputId!}" name="${inputName!}" class="hidden">${defaultValue!}</textarea>
<!--【特别注意】代码输入框,务必设置高度,否则无法显示 -->
<!--【特别注意】pre标签和textarea标签之间不要有空格或换行,这些元素都会当着编辑器内容的一部分,造成出现“开头多出一些空格字符”的怪现象!!!-->
<pre id="${inputId!}" class="ace_editor ${cssClass!}" style="min-height:${height!}"><textarea class="ace_text-input">${defaultValue!}</textarea></pre>
<script>
    $(function() {
        // ACE-Editor代码编辑器
        ace.require("ace/ext/language_tools");
        let ${inputId!} = ace.edit("${inputId!}");
        ${inputId!}.setTheme("ace/theme/${theme!}");
        ${inputId!}.session.setMode("ace/mode/${language}");
        ${inputId!}.setOptions({
            enableBasicAutocompletion : true,
            enableSnippets : true,
            enableLiveAutocompletion : true
        });
         
        // 通过change事件,捕获编辑器的最新内容
        ${inputId!}.getSession().on('change', function(e) {
            $('#hid_${inputId!}').val(${inputId!}.getValue());
        });
    });
</script>

 

posted on 2023-04-27 10:28  马会东  阅读(2252)  评论(0编辑  收藏  举报