ç·šéè ã®ã¡ã¢
ååã®èšäºã§ã¯ãVoximplantã³ã³ãããŒã«ããã«ã®ãªãªãŒã¹ã«ã€ããŠèª¬æããŸããããæŽæ°ãããIDEã«ã€ããŠèšåããããšãå¿ããŠããŸããã ä»æ¥ãç§ãã¡ã¯ãã®ããŒã«ã«å¥ã®ãã³ã°ã©ã€ããæ§ããŸã-ååã®Geloosaã¯ããã¯ãããžãŒã®éžæããã»ã¹ãšãã¿ãããªãŒãã³ã³ããªãŒããã«ã¹ã¿ã ã¹ã¿ã€ã«ã䜿çšããå®è£ ã®äž¡æ¹ãæ éã«èª¬æããŸããã ãã䟿å©ã«åº§ã£ãŠãæ®ãã®äºæãèã«çœ®ããŠãã¢ãã³ã®åæ°ã奜å¥å¿ãåŸ ã£ãŠããã¿ãã¯ã«ã«è¡ããŸã-æ»ããªãã§ããããããããŸã:)èªæžãã楜ãã¿ãã ããã

ã³ãŒããšãã£ã¿ãŒã«éžæããã©ã€ãã©ãªã¯ã©ãã§ããïŒ
Npmã¯ãã³ãŒããšãã£ã¿ãŒã«å¯ŸããŠ400以äžã®çµæãçæããŸãã ã»ãšãã©ã®å Žåããããã¯ç¹å®ã®ãã¬ãŒã ã¯ãŒã¯ãŸãã¯ãããžã§ã¯ãçšã«äœæãããããã€ãã®æã人æ°ã®ããã©ã€ãã©ãªã®UIã©ãããŒãåãã©ã€ãã©ãªã®ãã©ã°ã€ã³ãŸãã¯ãããèªèº«ã®å€æŽãå ãããã©ãŒã¯ã§ããããã©ãŠã¶ã§ã³ãŒããç·šéããããã§ã¯ãªããåã«ããŒã¯ãŒãã«ãã£ãŠåºåãããŸãã ãã®ããã幞ããªããšã«ãéžæè¢ã¯ã¯ããã«çããªããŸãã ããã€ãã®ã©ã€ãã©ãª-CodeFlask㯠ã軜éã§ããããŸãæ©èœçã§ã¯ãªããå°ããªã¹ãããããã€ã³ã¿ã©ã¯ãã£ããªãµã³ãã«çšã«èšèšãããŠããŸããããã¹ã¯ããããšãã£ã¿ãŒã§äœ¿çšãããŠããæ©èœãåããæ¬æ ŒçãªWeb IDEçšã§ã¯ãããŸããã
æçµçã«ã Ace ã CodeMirror ãããã³Monaco Editorããéžæã§ãã3ã€ã®ã©ã€ãã©ãªããããŸãã ãããã®åæã®CodeMirrorã¯ãBerlineer Marijn Haverbekeã«ããå人çãªã€ãã·ã¢ããã§ããããªã³ã©ã€ã³ãã¥ãŒããªã¢ã«Eloquent JavaScriptã§ãšã¯ãµãµã€ãºã³ãŒããšãã£ã¿ãŒãå¿ èŠã§ããã ãšãã£ã¿ãŒã®æåã®ããŒãžã§ã³ã¯2007幎ã«ãªãªãŒã¹ãããŸããã 2010幎ãAceã®æåã®ããŒãžã§ã³ãåããã«ãªã³ã®JSConf.euã§çºè¡šãããAjax.orgãã¯ã©ãŠãIDE Cloud9çšã«éçºããŸããïŒå®éãAceã¯Ajax.org Cloud9 Editorã®ç¥ã§ãïŒã 2016幎ãCloud9ã¯Amazonã«è²·åãããçŸåšã¯AWSã®äžéšã§ãã ææ°ã®Monaco Editorã¯VS Codeã®ã³ã³ããŒãã³ãã§ããã2015幎æ«ã«Microsoftã«ãã£ãŠå ¬éãããŸããã
åãšãã£ã¿ãŒã«ã¯é·æãšçæãããããããããè€æ°ã®å€§èŠæš¡ãããžã§ã¯ãã§äœ¿çšãããŸãã ããšãã°ãCodeMirrorã¯ãChromeããã³FirefoxéçºããŒã«ãBitbucketã®IDEãnpmã®RunKitã§äœ¿çšãããŸãã ãšãŒã¹-MODXãã«ãŒã³ã¢ã«ãããŒãã³ãŒãã¢ã«ãããŒã§ Monaco-GitLab IDEããã³CodeSandboxå ã 以äžã¯ããããžã§ã¯ãã«æé©ãªã©ã€ãã©ãªãéžæããã®ã«åœ¹ç«ã€æ¯èŒãã£ãŒãã§ãã
å³æžé€š | |||
ãšãŒã¹ | CodeMirror | ã¢ãã³ | |
éçºè | Cloud9 IDEïŒAjax.orgïŒã
çŸåšãAmazonMozillaã®äžéš | ãŸããã | ãã€ã¯ããœãã |
ãã©ãŠã¶ã®ãµããŒã | Firefox ^ 3.5
ã¯ãã Safari ^ 4.0 IE ^ 8.0 ãªãã©^ 11.5 | Firefox ^ 3.0
ã¯ãã Safari ^ 5.2 IE ^ 8.0 Opera ^ 9.2 | Firefox ^ 4.0
ã¯ãã ãµãã¡ãªïŒv-ïŒïŒ IE ^ 11.0 Opera ^ 15.0 |
èšèªãµããŒã
ïŒæ§æã®åŒ·èª¿è¡šç€ºïŒ | > 120 | > 100 | > 20 |
ã®æåæ°
ææ°ããŒãžã§ã³ cndjs.com | 366 608ïŒv1.4.3ïŒ | 394,269ïŒv5.44.0ïŒ | 2,064,949ïŒv0.16.2ïŒ |
ææ°ããŒãžã§ã³ã®ééã
gzip | 2.147 KB | 1.411 KB | 10.898 KB |
ã¬ã³ããªã³ã° | ãã | ãã | DOMããã³éšåçã«<canvas>
ïŒã¹ã¯ããŒã«ãšãããããçšïŒ |
ããã¥ã¡ã³ã | 10ç¹äž7ç¹ïŒæ€çŽ¢ãªããå¿
ãããæ確ã§ã¯ãªã
ã¡ãœãããè¿ããããçãããã å®å šæ§ãšé¢é£æ§ ïŒãã¹ãŠã®ãªã³ã¯ãããã¯ã§æ©èœããããã§ã¯ãããŸããïŒ | 10ã®ãã¡6ïŒãŠãŒã¶ãŒã¬ã€ããšçµ±åã
Ctrl + Fã§æ€çŽ¢ã å®å šæ§ã«çåããã | 10ç¹äž9ç¹ïŒçŸãããæ€çŽ¢ãã
çžäºåç § 説æäžè¶³ã®å Žåã¯-1ãã€ã³ã ãã®ã¢ããªã±ãŒã·ã§ã³ã®ããã€ãã®ãã©ã°ã« ååããã¯æããã§ã¯ãªã |
ã¯ã€ãã¯ã¹ã¿ãŒãã㢠| ããŠããŒ-ã³ãŒãäŸãå«ãããã¹ãããã¥ã¡ã³ãã
åå¥ã«ã³ãŒãäŸã®ãã¢ããããŸã ïŒæ¬åœããããã¯ç°ãªãããŒãžã«æ£ãã°ã£ãŠããã ãã¹ãŠã®äººãåããŠããããã§ã¯ãªããGoogleã§æãç°¡åã«æ€çŽ¢ãããŸãïŒ ããŸããŸãªæ©èœã«è§Šããããšãã§ãããã¢ããããŸãã ãã ããUIã³ã³ãããŒã«ã䜿çšããŠç®¡çããããšãææ¡ããŠããŸãã ã€ãŸããã¡ãœãããåå¥ã«æ€çŽ¢ããå¿ èŠããããŸã ããããæ¥ç¶ãã | ããŠããŒã¯æ¬åœã«è²§åŒ±ã§ã
åºæ¬çã«ãã¹ãŠãgithubã«æ£ãã°ã£ãŠããŸã ãšstackoverflowããäŸãšæ©èœã®ãã¢ããããŸã å®è£ ã®ããã®ã³ãŒã | éã³å Žã®åœ¢åŒã§çµã¿åãããïŒ
ã³ã¡ã³ããšå€æ°ã®ãã¢ã䜿çšããŠã³ãŒããäœæã§ããŸãã ããã«è©ŠããŠè©äŸ¡ãã å€ãã®å¯èœæ§ |
ã³ãã¥ããã£æŽ»å | å¹³å | é«ã | å¹³å |
éçºè ã®æŽ»å | å¹³å | å¹³å | é«ã |
ã©ã€ãã©ãªããµã€ãºã§æ¯èŒããããšã¯æå³ããããŸããããã¹ãŠç¹å®ã®ãããžã§ã¯ãã«æ¥ç¶ããæ¹æ³ãšæ¹æ³ã«äŸåããããã§ããå®æãããã¡ã€ã«ããã«ãã®1ã€ã§ããŒãããïŒãããããŸããŸã§ãïŒããäœããã®ã³ã¬ã¯ã¿ãŒãä»ããŠnpmããã±ãŒãžãå®è¡ããŸãã ãããŠæãéèŠãªã®ã¯ããšãã£ã¿ãŒã®äœ¿çšéã§ãããã¹ãŠã®ã¹ã¿ã€ã«ãšããŒããããŒãããããã©ããã䜿çšãããã¢ããªã³ãšãã©ã°ã€ã³ã®æ°ãšæ°ã§ãã ããšãã°ãCodeMirrorã§ã¯ãMonacoãšAceã§ããã«åäœããã»ãšãã©ã®æ©èœã¯ãã¢ããªã³ã§ã®ã¿äœ¿çšã§ããŸãã è¡šã«ã¯ãCDNã®æè¿ã®ããŒãžã§ã³ã®æåæ°ãšãã©ã®é åºãé¢ä¿ãããã«ã€ããŠã®äžè¬çãªèãã®ããã®å§çž®ãã¡ã€ã«ã®éã¿ã瀺ãããŠããŸãã
ãã¹ãŠã®ã©ã€ãã©ãªã«ã¯ãã»ãŒåãåºæ¬æ©èœã»ããããããŸãïŒã³ãŒãã®èªåæžåŒèšå®ãè¡ã®æãç³ã¿ãåãåã/ã³ããŒ/貌ãä»ãããããããŒã匷調衚瀺ãšããŒãã®æ°ããæ§æãè¿œå ããæ©èœãæ§æãã§ãã¯ïŒCodeMirror-ã¢ããªã³ã®ã¿ãAce-ãããŸã§ã¯JavaScriptã®ã¿ïŒ / CoffeeScript / CSS / XQueryïŒãããŒã«ããããšãªãŒãã³ã³ããªãŒãïŒCodeMirrorã§-ã¢ããªã³ã䜿çšïŒãã³ãŒãã«ããé«åºŠãªæ€çŽ¢ïŒCodeMirrorã§-ã¢ããªã³ã䜿çšïŒãã¿ããšåå²ã¢ãŒããdiffã¢ãŒããããŒãžããŒã«ã®å®è£ æ¹æ³ïŒCodeMirrorã§ïŒ -1ã€ã®ãŠã£ã³ããŠã«ãã©ã¹ãšãã€ãã¹ããŸãã¯ã¢ããªã³ãä»ãã2ã€ã®ããã«ã®ããããã ãšãŒã¹ - ã»ãã¬ãŒãã»ãªãŒãïŒã å€ããªã£ããããå€ãã®ã¢ããªã³ãCodeMirrorçšã«äœæãããŠããŸããããã®æ°ã¯ãšãã£ã¿ãŒã®ééãšé床ã®äž¡æ¹ã«åœ±é¿ããŸãã ã¢ãã³ã¯ãããã«äœ¿çšã§ããå€ãã®æ©èœãå®è¡ã§ããŸãããç§ã®æèŠã§ã¯ãAceãCodeMirrorãããåªããŠããŸãã
ã¢ãã³ã«æ»åšããçç±ã¯ããã€ããããŸãã
- ç§ãã¡ã®ãããžã§ã¯ãã«ãšã£ãŠéèŠãšèããããæãéçºãããããŒã«ïŒ
- IntelliSense-ãã³ããšãªãŒãã³ã³ããªãŒãã
- ã³ã³ããã¹ãã¡ãã¥ãŒããã³ãããããã«ããã¹ããŒãã³ãŒãããã²ãŒã·ã§ã³ã
- ããã«äœ¿ãã2ããã«diffã¢ãŒãã
- TypeScriptã§æžãããŠããŸãã ã³ã³ãããŒã«ããã«ã¯Vue + Typescriptã§èšè¿°ãããŠãããããTSãµããŒããéèŠã§ããã ãšããã§ãAceã¯æè¿TSããµããŒãããŠããŸãããå ã ã¯JSã§æžãããŠããŸããã CodeMirrorã®å Žåã DefinitelyTypedã«ã¯åããããŸã ã
- ããã¯æãç©æ¥µçã«éçºãããŠããïŒãããããããã»ã©åã«ãªãªãŒã¹ãããŠããªãããïŒããã°ã¯ããè¿ éã«ä¿®æ£ãããããŒã«ãªã¯ãšã¹ããåŠçãããŸãã æ¯èŒã®ããã«ãCodeMirrorã§ã¯ããã°ãäœå¹Žãä¿®æ£ããããæŸèæãæŸèæã«ä¹ããŠæŸèæãé転ãããšããæ²ããçµéšããããŸããã
- ã€ã³ã¿ãŒãã§ãŒã¹ãšã¡ãœããéã®çžäºåç §ãå«ã䟿å©ãªèªåçæïŒå®å šæ§ãžã®åžæãäžããïŒããã¥ã¡ã³ãã
- ç§ãã¡ã®å¥œã¿ã§ã¯ãæãçŸããUIïŒããããäœææéã«ãé¢é£ïŒãšç°¡æœãªAPIã§ãã
- ã©ã®ç·šéè ãæãé çã®çš®ãšãªã£ãã®ããéçºè ã®å人ã«å°ããåŸããšãŒã¹ãšCodeMirrorããªãŒããŒã§ããã
ãŸããä»äºã®ã¹ããŒãã«ã€ããŠãèšãå¿ èŠããããŸãã ã³ã¹ãã®ããã解æã¯ã䞊åã¯ãŒã«ãŒã¹ã¬ããã§è¡ãããŸãã ããã«ããã¹ãŠã®èšç®ã¯ãã¥ãŒããŒãã®ãµã€ãºã«ãã£ãŠå¶éãããŸãïŒãã¹ãŠã®ã¿ã€ããè²ãã¬ã³ããªã³ã°ã¯ã衚瀺ãããŠããã©ã€ã³ã«å¯ŸããŠã®ã¿èšç®ãããŸãïŒã ã³ãŒãã100,000è¡æªæºã®å Žåã«ã®ã¿ããã¬ãŒããããå§ããŸã-ããã³ããã¯æ°ç§éèšç®ã§ããŸãã ãŸããéãã³ã³ãã¥ãŒãã£ã³ã°ã«ã¯ãŒã«ãŒã䜿çšãããšãŒã¹ã¯ãããé«éã§ããããšãå€æããŸããïŒåãé·ãã®ã³ãŒãã§ã¯ãããã³ãããã»ãŒç¬æã«è¡šç€ºããã200,000è¡ã«ãã°ãã察å¿ããŸãïŒå ¬åŒWebãµã€ãã§ã¯ã400äžè¡ã§ãã£ãŠãåé¡ãªãã¯ãã§ãïŒããžãå éãããå ¥åãé ããªãå§ããããã³ããã100äžååŸã«æ¶ããŸããïŒã 䞊åèšç®ããªãCodeMirrorã§ã¯ããã®ãããªããªã¥ãŒã ãåŒãåºãããšã¯éåžžã«å°é£ã§ããããã¹ããšæ§æã®åŒ·èª¿è¡šç€ºã®äž¡æ¹ãã¡ãã€ãããšããããŸãã ãã¡ã€ã«å ã®100,000è¡ã¯çŸå®ã®äžçã§ã¯ãŸããªã®ã§ãããã«ç®ãã€ã¶ã£ãã 40ã5äžè¡ã®ã¢ãã³ã§ãããã°ãããä»äºãããŠããŸãã
Monacoã®æ¥ç¶ãšäž»ãªæ©èœã®äœ¿çšïŒVueãšã®çµ±åã®äŸïŒ
æ¥ç¶
ããã§ã¯ãvueã³ã³ããŒãã³ãã®ã³ãŒãäŸã瀺ããé©åãªçšèªã䜿çšããŸãã ãããããããã¯ãã¹ãŠä»ã®ãã¬ãŒã ã¯ãŒã¯ãŸãã¯çŽç²ãªJSã«ç°¡åã«ç§»æ€ã§ããŸãã
ã¢ãã³ã®ãœãŒã¹ã³ãŒãã¯å ¬åŒãŠã§ããµã€ãããããŠã³ããŒãããŠãããžã§ã¯ãã«å ¥ããããšãã§ããŸããCDNãããããæŸãäžããnpmçµç±ã§ãããžã§ã¯ãã«æ¥ç¶ã§ããŸãã 3çªç®ã®ãªãã·ã§ã³ã«ã€ããŠèª¬æããwebpackã䜿çšããŠãã«ãããŸãã
ã¢ãã³ãšãã£ã¿ãŒãšã¢ã»ã³ããªçšã®ãã©ã°ã€ã³ãé 眮ããŸãã
npm i -S monaco-editor npm i -D monaco-editor-webpack-plugin
webpackæ§æã§ã次ãè¿œå ããŸãã
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); module.exports = { // ... plugins: [ // ... new MonacoWebpackPlugin() ] };
Vueãšvue-cli-serviceã䜿çšããŠãã«ãããå Žåãvue.config.jsã«è¿œå ããŸãã
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); module.exports = { // ... configureWebpack: (config) => { // ... config.plugins.push(new MonacoWebpackPlugin()); } };
Monacoã®ãã¹ãŠã®èšèªãšæ©èœãå¿ èŠã§ãªãå Žåã¯ããã³ãã«ã®ãµã€ãºãå°ããããããã«ãèšå®ãæã€ãªããžã§ã¯ãã
MonacoWebpackPlugin
転éã§ããŸãã
new MonacoWebpackPlugin({ output: '', // , languages: ['markdown'], // , features: ['format', 'contextmenu'] // })
ãã©ã°ã€ã³ã®æ©èœãšèšèªã®å®å šãªãªã¹ãã¯ãã¡ãã§ãã
ãšãã£ã¿ãŒãäœæããŠã«ã¹ã¿ãã€ãºãã
editor
ãã€ã³ããŒããã
editor.create(el: HTMLElement, config?: IEditorConstructionOptions)
ãåŒã³åºããŠããšãã£ã¿ãŒãäœæããDOMèŠçŽ ãæåã®åŒæ°ãšããŠæž¡ããŸãã
ãšãã£ã¿ãŒã³ã³ããŒãã³ãã§ïŒ
<template> <div ref='editor' class='editor'></div> </template> <script> import {editor} from 'monaco-editor'; import {Component, Prop, Vue} from 'vue-property-decorator'; @Component() export default class Monaco extends Vue { private editor = null; mounted() { this.editor = editor.create(this.$refs.editor); } } </script> <style> .editor { margin: auto; width: 60vw; height: 200px; } </style>
ãšãã£ã¿ãŒã®ã³ã³ãããŒã¯ãé«ãããŒãã«ãªããªãããã«èšå®ããå¿ èŠããããŸãã 空ã®divïŒãŒãã®é«ã-K.O.ïŒã§ãšãã£ã¿ãŒãäœæãããšãMonacoã¯ãšãã£ã¿ãŒãŠã£ã³ããŠã§åãé«ããã€ã³ã©ã€ã³ã¹ã¿ã€ã«ã§æžã蟌ã¿ãŸãã
editor.create
ã®2çªç®ã®ãªãã·ã§ã³åŒæ°ã¯ããšãã£ã¿ãŒã®æ§æã§ãã 100ãè¶ ãããªãã·ã§ã³ããããŸããIEditorConstructionOptionsã€ã³ã¿ãŒãã§ã€ã¹ã®è©³çŽ°ãªèª¬æã¯ããã¥ã¡ã³ãã«ãããŸãã
äŸãšããŠãèšèªãããŒããåæããã¹ããèšå®ããè¡ã®æãè¿ããæå¹ã«ããŸãïŒããã©ã«ãã§ã¯æãè¿ãããŸããïŒã
const config = { value: `function hello() { alert('Hello world!'); }`, language: 'javascript', theme: 'vs-dark', wordWrap: 'on' }; this.editor = editor.create(this.$refs.editor, config);
editor.create
é¢æ°ã¯ã IStandaloneCodeEditorã€ã³ã¿ãŒãã§ã€ã¹ãæã€ãªããžã§ã¯ããè¿ããŸãã ããã«ãããåæèšå®ã®å€æŽãªã©ããšãã£ã¿ãŒã§çºçãããã¹ãŠãå¶åŸ¡ã§ããããã«ãªããŸããã
// read-only this.editor.updateOptions({wordWrap: 'off', readOnly: true});
çã¿ã®ããã«ïŒ
updateOptions
ã¯ã IEditorConstructionOptionsã§ã¯ãªãã IEditorOptionsã€ã³ã¿ãŒãã§ã€ã¹ãæã€ãªããžã§ã¯ããåãå ¥ããŸãã ãããã¯ãããã«ç°ãªããŸããIEditorConstructionOptionsã¯ããåºãããã®ãšãã£ã¿ãŒã€ã³ã¹ã¿ã³ã¹ãšããã€ãã®ã°ããŒãã«ã€ã³ã¹ã¿ã³ã¹ã®ããããã£ãå«ãŸããŸãã
updateOptions
ããããã£ã¯ã
updateOptions
ãã°ããŒãã«
editor
ã¡ãœãããä»ããŠå€æŽãããŸãã ãããã£ãŠãã°ããŒãã«ã«å€åãããã®ã¯ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§å€åããŸãã ãããã®ãªãã·ã§ã³ã®äžã«
theme
ãŸãã ããŒããç°ãªã2ã€ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã äž¡æ¹ã®yã¯ãæåŸã«æå®ãããã®ïŒããã§ã¯æãïŒã«ãªããŸãã ã°ããŒãã«ãª
editor.setTheme('vs')
ã¡ãœãããäž¡æ¹ââã®ä»¶åãå€æŽããŸãã ããã¯ãSPAã®å¥ã®ããŒãžã«ãããŠã£ã³ããŠã«ã圱é¿ããŸãã ãã®ãããªå Žæã¯ã»ãšãã©ãããŸãããããããã«åŸãå¿ èŠããããŸãã
<template> <div ref='editor1' class='editor'></div> <div ref='editor2' class='editor'></div> </template> <script> // ... this.editor1 = editor.create(this.$refs.editor1, {theme: 'vs'}); this.editor2 = editor.create(this.$refs.editor2, {theme: 'vs-dark'}); // ... </script>
ãšãã£ã¿ãŒãåé€
MonacoãŠã£ã³ããŠãç Žæ£ããå Žåã
dispose
ã¡ãœãããåŒã³åºãå¿ èŠããããŸããããããªããšããã¹ãŠã®ãªã¹ããŒãã¯ãªã¢ãããããã以éã«äœæããããŠã£ã³ããŠãæ£ããæ©èœãããããã€ãã®ã€ãã³ãã«æ°ååå¿ããŸãã
beforeDestroy() { this.editor && this.editor.dispose(); }
ã¿ã
ãã¡ã€ã«ãšãã£ã¿ã§éããã¿ãã¯ãåãMonacoãŠã£ã³ããŠã䜿çšããŸãã ããããåãæ¿ããã«ã¯ãIStandaloneCodeEditorã¡ãœããã䜿çšããŸã
setModel
ãä¿åãã
setModel
ããšãã£ã¿ãŒã¢ãã«ãæŽæ°ããŸãã ã¢ãã«ã«ã¯ãããã¹ããã«ãŒãœã«äœçœ®ãå ã«æ»ã/ããçŽãã®ã¢ã¯ã·ã§ã³å±¥æŽãä¿åãããŸãã æ°ãããã¡ã€ã«ã¢ãã«ãäœæããã«ã¯ãã°ããŒãã«ãª
editor.createModel(text: string, language: string)
ã¡ãœããã䜿çšãããŸãã ãã¡ã€ã«ã空ã®å Žåãã¢ãã«ãäœæããŠ
null
ã
setModel
æž¡ãããšã¯ã§ããŸããã
ã³ãŒãã衚瀺
<template> <div class='tabs'> <div class='tab' v-for="tab in tabs" :key'tab.id' @click='() => switchTab(tab.id)'> {{tab.name}} </div> </div> <div ref='editor' class='editor'></div> </template> <script> import {editor} from 'monaco-editor'; import {Component, Prop, Vue} from 'vue-property-decorator'; @Component() export default class Monaco extends Vue { private editor = null; private tabs: [ {id: 1, name: 'tab 1', text: 'const tab = 1;', model: null, active: true}, {id: 2, name: 'tab 2', text: 'const tab = 2;', model: null, active: false} ]; mounted() { this.editor = editor.create(this.$refs.editor); } private switchTab(id) { const activeTab = this.tabs.find(tab => tab.id === id); if (!activeTab.active) { // ( ) const model = !activeTab.model && activeTab.text ? editor.createModel(activeTab.text, 'javascript') : activeTab.model; // this.tabs = this.tabs.map(tab => ({ ...tab, model: tab.active ? this.editor.getModel() : tab.model, active: tab.id === id })); // this.editor.setModel(model); } } </script>
å·®åã¢ãŒã
å·®åã¢ãŒãã®å Žåããšãã£ã¿ãŒãŠã£ã³ããŠã®äœææã«å¥ã®
editor
ã¡ãœãã
createDiffEditor
ã䜿çšããå¿ èŠããããŸãã
<template> <div ref='diffEditor' class='editor'></div> </template> // ... mounted() { this.diffEditor = editor.createDiffEditor(this.$refs.diffEditor, config); } // ...
editor.create
ãšåããã©ã¡ãŒã¿ãŒãåãå ¥ããŸãããæ§æã«ã¯IDiffEditorConstructionOptionsã€ã³ã¿ãŒãã§ãŒã¹ãå¿ èŠã§ããããã¯éåžžã®ãšãã£ã¿ãŒæ§æãšã¯ãããã«ç°ãªããç¹ã«
value
æã¡ãŸããã æ¯èŒã®ããã®ããã¹ãã¯ã setModelãä»ããŠè¿ãããIStandaloneDiffEditorãäœæããåŸã«èšå®ãããŸã ã
this.diffEditor.setModel({ original: editor.createModel('const a = 1;', 'javascript'), modified: editor.createModel('const a = 2;', 'javascript') });
ã³ã³ããã¹ãã¡ãã¥ãŒãã³ãã³ããã¬ããããããããŒ
Monacoã¯ãã¹ããŒãããã²ãŒã·ã§ã³ããã¹ãŠã®ãªã«ã¬ã³ã¹ãå€æŽãããã«ãã«ãŒãœã«ãVSã³ãŒãïŒã³ãã³ããã¬ããïŒã®ãããªã³ãã³ããã¬ãããåããéãã©ãŠã¶ãŒã³ã³ããã¹ãã¡ãã¥ãŒã䜿çšããŠãã³ãŒãäœæãé«éåããå€æ°ã®äŸ¿å©ãªã³ãã³ããšãããããŒã䜿çšããŸãïŒ

ã¢ãã³ã®ã³ã³ããã¹ãã¡ãã¥ãŒ

ã¢ãã³ã³ãã³ããã¬ãã
ã³ã³ããã¹ãã¡ãã¥ãŒã¯ã
addAction
ã¡ãœããïŒ
IStandaloneCodeEditor
ãš
IStandaloneDiffEditor
äž¡æ¹ã§äœ¿çšå¯èœïŒãä»ããŠå±éããã IActionDescriptorãªããžã§ã¯ããåãå ¥ããŸãã
ã³ãŒãã衚瀺
// ... <div ref='diffEditor' :style='{display: isDiffOpened ? "block" : "none"}'></div> // ... // KeyCode KeyMod import {editor, KeyCode, KeyMod} from "monaco-editor"; // ... private editor = null; private diffEditor = null; private isDiffOpened = false; private get activeTab() { return this.tabs.find(tab => tab.active); } mounted() { this.diffEditor = editor.createDiffEditor(this.$refs.diffEditor); this.editor = editor.create(this.$refs.editor); this.editor.addAction({ // , . contextMenuGroupId: '1_modification', // : 1 - 'navigation', 2 - '1_modification', 3 - '9_cutcopypaste'; // contextMenuOrder: 3, // label: 'Show diff', id: 'showDiff', keybindings: [KeyMod.CtrlCmd + KeyMod.Shift + KeyCode.KEY_D], // // , // run: this.showDiffEditor }); } // private showDiffEditor() { this.diffEditor.setModel({ original: this.activeTab.initialText, modified: this.activeTab.editedText }); this.isDiffOpened = true; }
ã·ã§ãŒãã«ãããã¢ã¯ã·ã§ã³ã«è¡šç€ºããã«ã·ã§ãŒãã«ãããã¢ã¯ã·ã§ã³ã«ãã€ã³ãããã«ã¯ãåãã¡ãœããã䜿çšãããŸããã¢ã¯ã·ã§ã³ã®
contextMenuGroupId
ã®ã¿ãæå®ãããŠããŸããã
ã³ãŒãã衚瀺
// ... // private myActions = [ { contextMenuGroupId: '1_modification', contextMenuOrder: 3, label: <string>this.$t('scenarios.showDiff'), id: 'showDiff', keybindings: [KeyMod.CtrlCmd + KeyMod.Shift + KeyCode.KEY_D], run: this.showDiffEditor }, // , Ctrl + C + L { label: 'Get content length', id: 'getContentLength', keybindings: [KeyMod.CtrlCmd + KeyCode.Key_C + KeyCode.Key_L], run: () => this.editor && alert(this.editor.getValue().length) } ]; mounted() { this.editor = editor.create(this.$refs.editor); this.myActions.forEach(this.editor.addAction); // }
ã³ãã³ããã¬ããã«ã¯ãè¿œå ããããã¹ãŠã®ã¢ã¯ã·ã§ã³ãå«ãŸããŸãã
ãã³ããšãªãŒãã³ã³ããªãŒã
ãããã®ç®çã®ããã«ãMonacoã¯IntelliSenseã䜿çšããŸã ã ã¹ã¯ãªãŒã³ã·ã§ããã§ã圌ãã©ãã ãæçšãªæ å ±ã衚瀺ã§ããããšãããªã³ã¯ãèªãã§ç¢ºèªã§ããŸãã èšèªã«ãŸã ãªãŒãã³ã³ããªãŒãããªãå Žåã¯ã registerCompletionItemProviderã䜿çšããŠè¿œå ã§ããŸãã ãŸããJSãšTSã«ã¯ãããŒã«ããããšãªãŒãã³ã³ããªãŒãçšã®TypeScriptå®çŸ©ãããŒãã§ãã
addExtraLib
ã¡ãœãããæ¢ã«ãããŸãã
// ... import {languages} from "monaco-editor"; // ... // , private myAddedLib = null; mounted() { // languages Monaco this.myAddedLib = languages.typescript.javascriptDefaults.addExtraLib('interface MyType {prop: string}', 'myLib'); } beforeDestroy() { // , this.myAddedLib && this.myAddedLib.dispose(); }
æåã®ãã©ã¡ãŒã¿ãŒã§ã¯ãè¡ã¯å®çŸ©ãæž¡ãã2çªç®ã§ã¯ãªãã·ã§ã³ã§libã®ååãæž¡ããŸãã
ã«ã¹ã¿ã èšèªãšããŒã
Monacoã«ã¯ãèšèªã®æ§æã決å®ããããã®Monarchã¢ãžã¥ãŒã«ããããŸãã æ§æã¯éåžžã«æšæºçã«èšè¿°ãããŠããŸãããã®èšèªã«ç¹åŸŽçãªæ£èŠè¡šçŸãšããŒã¯ã³ã®å¯Ÿå¿ãèšå®ãããŠããŸãã
ã³ãŒãã衚瀺
// ... // , : private myLanguage = { defaultToken: 'text', // , brackets: [{ open: '(', close: ')', token: 'bracket.parenthesis' }], // , , keywords: [ 'autumn', 'winter', 'spring', 'summer' ], // tokenizer: { root: [{ regex: /\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}/, action: { token: 'date' } }, { regex: /(boy|girl|man|woman|person)(\s[A-Za-z]+)/, action: ['text', 'variable'] } ] } }; mounted() { // languages.register({ id: 'myLanguage' }); // languages.setMonarchTokensProvider('myLanguage', this.myLanguage); // ... }
ããŒã¯ã³ã®ããŒãïŒ IStandaloneThemeDataã€ã³ã¿ãŒãã§ã€ã¹ãæã€ãªããžã§ã¯ãïŒãäœæããŠãã°ããŒãã«
editor
ã€ã³ã¹ããŒã«ããããšãã§ããŸãã
// ... private myTheme = { base: 'vs', // , inherit: true, // rules: [ {token: 'date', foreground: '22aacc'}, {token: 'variable', foreground: 'ff6600'}, {token: 'text', foreground: 'd4d4d4'}, {token: 'bracket', foreground: 'd4d4d4'} ] }; mounted() { editor.defineTheme('myTheme', this.myTheme); // ... }
ããã§ãèšè¿°èšèªã®ããã¹ãã¯æ¬¡ã®ããã«ãªããŸãã

ååãªæ³ååãããã°ããã®æ©èœãé©çšã§ããŸãã ããšãã°ãéçºè åãã®ããã«ã«ã³ãŒã«ãã°ãã¥ãŒã¢ãäœæããŸããã å€ãã®å Žåããã°ã¯é·ããŠãããã«ããã§ãããæ§æã®åŒ·èª¿è¡šç€ºãã¹ããŒãæ€çŽ¢ãè¡ã®æãç³ã¿/å±éãå¿ èŠãªã³ãã³ãïŒããšãã°ãPrettify paramsïŒããã¹ãŠã®åŒã³åºãè¡ã®IDã«ãã匷調衚瀺ããŸãã¯ãã°å ã®æéãå¥ã®ã¿ã€ã ãŸãŒã³ã«è»¢éããŠè¡šç€ºãããã®äžã§ã¯ããã«ç°¡åã«ãªããŸãïŒã¹ã¯ãªãŒã³ã·ã§ããã¯ã¯ãªãã¯å¯èœã§ãïŒïŒ
ãããã«
èŠçŽãããšãã¢ãã³ã¯ç«äºã ãšèšããŸãã 圌ãšæ°ã¶æåããåŸãç§ã¯éåžžã«æ¥œããæãåºãæã£ãŠããŸãã ã³ãŒãã®ãšãã£ã¿ãŒãéžæããå Žåã¯ãå¿ ãPlaygroundã«ç§»åããŠã³ãŒããæäœããä»ã«äœãã§ãããã確èªããŠãã ããã ããããããã¯ãŸãã«ããªããæ¢ããŠãããã®ã§ãã