以前はブラウザ上で動くテキストエディタとしてAceエディタを使ってみたが、自分が普段使うエディタはほぼVSCodeになってしまったので、ブラウザでも同じ方が自分にとって望ましい。 VSCodeはMonacoというオープンソースで公開されているので、使い方を調べてみた。
導入方法
Webpackを使用する場合
Webpackを使ってるプロジェクトに組み込むにはnpmモジュールの、
のどちらでもいけるっぽい。
1のプラグインじゃなくて2の素のMonaco Editorを組み込む場合にはsytle-loader
もdevDependenciesに追加し、
webpack.configやJavaScriptでのインポート後にあれこれ記述してやる:
// webpack.config.js |
// main.js |
- Webpack Loader Pluginがなにをやってくれるのか、素で使う場合と比べてなにが違うのかはよく理解してない…
- Webpackで組み込むと大量のファイルが生成されまたサイズも結構大きい(合計11メガバイトほど)のと、かなり時間もかかる(自分の環境では2分半ほど)
CDNを利用する場合
Webpackで組み込むのはいろいろ重いので、CDNも試してみた。 How to run the Monaco editor from a CDN like cdnjs? - Stack Overflow を参考に、
- https://cdnjs.com/libraries/monaco-editor から使いたいバージョンのloader.min.jsとeditor.main.min.cssを選んでhtmlから読み込む
- JavaScriptで
require
を使って本体を読み込む
で使用できる。
Webpackの場合import
ですぐmonaco
が使えるが、CDN経由の場合コールバックを待つ必要がある
(他の方法もいろいろ書いてある)。
API
自分が使った際に必要になった機能をいくつかメモ:
作成
const editor = monaco.editor.create(document.getElementById('editor'), { |
内容取得
指定の行を画面中央に表示されるようにする
テキスト選択
const range = new monaco.Range(err.sourceLineNo, err.colStart, err.sourceLineNo, err.colStart + err.tokenLength) |
プログラムから内容を書き換える
- 全体を変更するには、editor.setValue()
現在のカーソル位置にテキストを挿入するには:
editor.executeEdits('', [{ |
ショートカットキー
editor.addAction({ |
マウスクリックの位置
editor.onMouseDown((e) => { |
テキスト内容が変更されているかどうか判定する
参考
- Monaco Editor
- Tutorial: Using the Monaco Editor | CodeHS コマンドパレットとかオートコンプリートとか
- Monaco Editor 使い方事始め #JavaScript - Qiita いろいろ使い方が書かれている