CodeMirrorの使い方
JavaScript でコードエディタを作る際に便利なコードミラーの使い方やメモをまとめていきます。
対象バージョン : CodeMirror 5.40.0
利用方法
CodeMirror からファイルをダウンロードし、適当に展開します。GitHub の方からダウンロードすると、必要ファイルが含まれていなかったため、先のサイトのダウンロードから直接ダウンロードするのがおすすめです。
次に、展開したファイルのうち、lib と mode フォルダを利用先のフォルダにコピーし、対象のファイルから以下のような感じで参照します。
mode フォルダからは、コードのハイライトやコード補完に使用したい言語のもの選んで参照します。
次に、コードエディタを HTML に配置します。配置したい位置に <textarea> タグを設置します。そして、JavaScript 側で CodeMirror のオブジェクトを生成します。
初期化時に、パラメータを渡すと、スタイルを変更できます。以下のような感じです。(詳細はこちら)
よく使いそうなものは以下のとおりです。
mode (string) | 書式のモード |
lineNumbers (boolean) | 行番号の表示 |
lineWrapping (boolean) | 行を折り返す |
サイズ変更
CodeMirror のエディタの大きさは、setSize メソッドで設定可能です。数値のほか、% などでの指定も可能なようです。
CodeMirror から textarea へ
CodeMirror で編集したテキストを textarea へ反映させるには、save メソッドを呼びます。
CodeMirror へテキストを設定
CodeMirror にテキストを設定するには、以下のようにします。
独自のモードを作成 (SimpleMode)
AddOn にある SimpleMode を利用すると簡単にモードを作成できます。まず、addon の SimpleMode を読み込みます(addon フォルダもコピーしておきます)。
次に、モードを定義します。大枠は以下のような感じです。
詳細は、こちらを参照してください。
SimpleMode を使わない方法は、こちらで紹介しています。
ハイライトの色・スタイルを変更
「lib/codemirror.css」の
.cm-s-default .cm-????のスタイルを変更します。例えば、コメント (comment) であれば以下のような感じです。おそらく正規のやり方ではない ...?
文字列の検索 / 置換
検索系の AddOn を追加します。詳細は、デモの Search/Replace を参考にしています。
AddOn 用のスタイルシートとコードを読み込めば、最低限の実装は完了です。
フォーカスを当てる
cm.focus()を使います。
カーソルの移動とスクロール
カーソル位置の取得は、
doc.getCursor(?start: string) → {line, ch}で可能です。
doc.setCursor(pos: {line, ch}|number, ?ch: number, ?options: object)を使います。カーソルが画面外の場合、自動的に画面内なるようにスクロールします。
行等を基準として表示位置を移動する(スクロールさせる)場合は、
cm.scrollIntoView(what: {line, ch}|{left, top, right, bottom}|{from, to}|null, ?margin: number)を使用します。
行数は、0 からカウントです。
選択範囲の設定
doc.setSelection(anchor: {line, ch}, ?head: {line, ch}, ?options: object)を使います。デフォルトで選択範囲が表示されるようにスクロールします。
テキストのマーキング
doc.markText(from: {line, ch}, to: {line, ch}, ?options: object) → TextMarker関数を使います。詳細はこちら。戻り値の TextMarker を操作すれば、更にマーカーの編集ができます。
マーカーを消したい場合は、TextMarker オブジェクトの
clear()メソッドを呼べば消えます。
マーカーの取得は、
doc.findMarks(from: {line, ch}, to: {line, ch}) → array<TextMarker>
doc.findMarksAt(pos: {line, ch}) → array<TextMarker>
doc.getAllMarks() → array<TextMarker>
などで可能です。すべてのマーカーを消す場合は、以下のようにします。
テキストの編集コマンド
文字列の挿入
カーソルの位置を取得し、
doc.replaceRange()を使って挿入します。
更新イベント
イベントは、
cm.onメソッドを使って設定します。
イベント名 | 動作 |
---|---|
change | 編集時に発火。第二引数に更新内容が渡される |
cursorActivity | カーソルの状態変更時に内容が渡されます。 |
コード表示として使う
読み取り専用設定
初期化時に、readOnly を設定します。
コードの高さに合わせる
表示がコードのサイズに合っていない場合は、以下のように手動計算します。自前で、行数とデフォルトのテキストの高さを取得し、少しマージンを足して高さを変更します。setSize は null を指定すると変更が起きないため、幅は null を渡してそのままにします。(本当は、もっと良い方法がありそうですが…)
画像を貼り付けたときの挙動を作る
CodeMirror にクリップボードから画像を貼り付けた際や、ドラッグ・アンド・ドロップした際の挙動を作ります。
ペースト時のイベントを設定
cm.onメソッドを使い、paste イベントを設定します。設定する関数の第一引数には、CodeMirror のオブジェクト、第二引数にはイベントオブジェクトが渡されます。設定した関数内で
preventDefaultを呼べば、それ以上の処理が止まります。こちらを参考にしました。
最上位の DOM オブジェクトを取得する
cm.getWrapperElement()で CodeMirror の最上位の HTMLElement が取得できます。そこに、クラスや ID を設定するとこで、CSS で個別にスタイルを変更することもできます。
問題点
日本語環境で使うと、いくらか問題がありました。
- PC の Firefox で Microsoft IME を使っている場合、変換ウィンドウが画面の左上にちらちらと表示される
- Chrome のデフォルトのフォントサイズが小さい
- モバイルでの入力に問題多数(詳しくはこちら)