monaco-editor 常用方法与事件

一、自定义语言和主题:

(参考例子:https://microsoft.github.io/monaco-editor/playground.html#extending-language-services-custom-languages

(若需要自定义注释和关键字等高亮显示颜色,参考:https://microsoft.github.io/monaco-editor/monarch.html

<div id='div-editor' #editor class="monaco-editor"></div>

@ViewChild('editor') editorContent: ElementRef; // 编辑器Element

private editor: any; // 创建的编辑器

ngAfterViewInit() {

   amdRequire.config({'vs/nls': {availableLanguages: {'*':'zh-cn'}}}); // 设置中文菜单等

    amdRequire(['vs/editor/editor.main'], () => {

      monaco.languages.register({id:'mySpecialLanguage'});

        monaco.languages.setMonarchTokensProvider('mySpecialLanguage', {

                              tokenizer: {

                                     root: [

                                             [/\(.*调试.*/, '调试'],

                                      //其中逗号左侧为正则表达式 http://www.runoob.com/regexp/regexp-metachar.html,右侧为标识该匹配方式的名称

                                               [/\(.*通知.*/, '通知'],

                                               [/\(.*警告.*/, '警告'],

                                               [/\(.*错误.*/, '错误'],

                                               [/\(.*崩溃.*/, '崩溃'],

                                                [/\(.*信息.*/, '信息'],

                                      ] }

});

  monaco.editor.defineTheme('light', {

        base:'vs', // 定义浅色主题

         inherit:false,

         rules: [

                       {token:'调试', foreground:'666666'}, // 左侧对应上面定义的名称,右侧自定义颜色或者样式

                       {token:'通知', foreground:'00b4ff'},

                       {token:'警告', foreground:'ffb400'},

                         {token:'错误', foreground:'ff0000'},

                        {token:'崩溃', foreground:'c30209'},

                        {token:'信息', foreground:'222222'},

            ],

            colors: {

               'editor.background':'#f4f4f4',

                'editorLineNumber.foreground':'#222222',

                'editor.lineHighlightBackground':'#f4f4f4',

            }

});

 monaco.editor.defineTheme('dark', {

           base:'vs-dark', // 定义黑色主题

            inherit:false,

           rules: [

               {token:'调试', foreground:'959595'},

                {token:'通知', foreground:'00b4ff'},

                {token:'警告', foreground:'fff000'},

                {token:'错误', foreground:'ff0000'},

                {token:'崩溃', foreground:'c30209'},

                {token:'信息', foreground:'ffffff'},

            ],

            colors: {

                'editor.background':'#3b3b3b',

                'editorLineNumber.foreground':'#ffffff',

                'editor.lineHighlightBackground':'#3b3b3b',

            }

});

      // monaco.editor.setTheme(this.windowService.theme);

 this.editor = monaco.editor.create(this.editorContent.nativeElement, {

           language:'mySpecialLanguage',

            theme:this.windowService.theme,

            // mouseWheelZoom: true,

            automaticLayout:true,

            scrollBeyondLastLine:false,

            // lineNumbersMinChars: 5,

            lineHeight:24,

            hideCursorInOverviewRuler:true,

            scrollbar: {

               useShadows:false,

                vertical:'visible',

                horizontal:'visible',

                horizontalSliderSize:5,

                verticalSliderSize:5,

                horizontalScrollbarSize:15,

                verticalScrollbarSize:15,

            },

            quickSuggestions:false,

            overviewRulerBorder:false,

            fontFamily:'Microsoft YaHei',

            minimap: {

                    enabled:false

            },

            //  readOnly: false

        });

        this.windowService.themeChange.subscribe(() => {

                    monaco.editor.setTheme(this.windowService.theme);

        });

        localStorage.setItem('settings', JSON.stringify(this.settings));

    });

}


/**

* monaco添加当行内容方法 * @param text 内容

*/

private addContent(text: string): void {

        if (!this.editor) { return; }

        this.editor.updateOptions({ scrollbar: { horizontalHasArrows: false, horizontal: 'hidden', }, }); // 新增一条时横向滚动条设为不可见,否则可能占用编辑器位置,使得在横向滚动条位置新增内容出现undefined

        const count = this.editor.getModel().getLineCount() || 0;

        const range = new monaco.Range(count, 1, count, 1);

        if (count > this.maxLen) {

                this.editor.executeEdits('log-source', [{ identifier: 'event_id', range: new monaco.Range(1, 1, 2, 1), text: null, forceMoveMarkers:                   true }]); // 指定范围设定 text: null 可以等价于删除某行。

              // this.editor.setValue(this.editor.getModel().getValueInRange(new monaco.Range(count - this.maxLen + 1, 1, count, 1))); }

                this.editor.executeEdits('log-source', [{ identifier: 'event_id', range: range, text: text, forceMoveMarkers: true }]);

               if (this.settings.isWrap) { this.isOpenWrap(); }

}


/*** monaco自动换行*/                                                                                                                                                                                              isOpenWrap() {

  if (this.settings.isWrap) {

        this.editor.updateOptions({

               wordWrap:'on',

             // wordWrap: 'wordWrapColumn',

              // wordWrapColumn: 80,

            wrappingIndent:'indent',

            scrollbar: {

                  horizontalHasArrows:false,

                  horizontal:'hidden',

            },

            // mouseWheelZoom: true,

        });

    } else {

          this.editor.updateOptions({

                    wordWrap:'off',

        });

    }

}


private afterShowLog() {

             this.divHeight =this.editorContent.nativeElement.clientHeight; // 获取编辑器可视区高度

            if (!this.editor) {return;  }

           // 滚动到最后一行

              if (this.settings.isBottom) {

                     const count =this.editor.getModel().getLineCount() ||0;

                       this.editor.revealLine(count);

                }

           // 屏蔽自动滚动后,监测滚动条是否发生变化,如果拖动到底部,则打开自动滚动.

              if (!this.settings.isBottom) {

                    this.editor.onDidScrollChange((e) => {

                          if (e.scrollTop >0) {

                                 if (this.divHeight + e.scrollTop === e.scrollHeight) {

                                        this.settings.isBottom =true;

                                         const count =this.editor.getModel().getLineCount() ||0;

                                         this.editor.revealLine(count);

                                          this.isLast =true;

                                        this.isClickScroll =false;

                }  else {

                                     this.isLast =false;

                }

}

});

    }

//

    if (!this.isLast) {

                       this.editor.onMouseDown((e) => {

                              this.isLast =false;

                             if (this.settings.isBottom) {

                                         if (e.target.type.toString() ==='11' && e.target.element.scrollHeight ===12) {

                                                 this.settings.isBottom =true; // 点击横向滚动条时不改变自动滚动状态

                                           }else {

                                                    this.settings.isBottom =false;

                                                       if (e.target.type.toString() ==='11' && e.target.element.scrollHeight >12) {

                                                  this.isClickScroll =true;

                                               //  console.log('点击垂直滚动条');

                                       }else {

                                    this.isClickScroll =false;

                                      //  console.log('点击编辑区文字');

                                }

                }

          }

       });

     }

// 点击或拖动垂直滚动条 屏蔽自动滚动后三秒恢复自动滚动;点击文本区域,直接屏蔽自动滚动

    this.editor.onMouseUp(() => {

                 if (!this.isLast) {

                      if (!this.settings.isBottom) {

                             if (this.isClickScroll) {

                                       setTimeout(() => {

                                              // console.log('3秒打开自动滚动');

                                            this.settings.isBottom =true;

                                           const count =this.editor.getModel().getLineCount() ||0;

                                         this.editor.revealLine(count);

                                     }, 3000);

                          }

               }

          }

     });

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容