Scintillaとmrubyでテキストエディタを作る(6) : folding
Scintillaの豊富な機能のひとつにfoldingがある。”折り畳み”である。 プログラムを編集する際、クラスやメソッド単位で表示・非表示を切り替えるようなものである。
作成中のmrbmacsというエディタでの例だが、folding機能を有効にすると、以下のようにmoduleやclassの左に「-」マークが付く。
folding機能を有効にするには、fold
というpropertyを1
にする、という他とは違う処理が必要。
scintillaの内部構造を理解できていないので、おまじないの領域。
機能としてのfoldingは上記の処理で良いが、画面表示上は別の手順が必要となる。 「-」や「+」を表示する領域を用意するため、mrbmacsでは以下のような処理を行っている。
@view_win.sci_set_margin_widthn(1, 1) @view_win.sci_set_margin_typen(1, 0) @view_win.sci_set_margin_maskn(1, Scintilla::SC_MASK_FOLDERS)
これで、編集画面の左側にfoldingのためのマークが表示される。
マウスのクリックで表示・非表示を切り替えるための準備は、以下。
@view_win.sci_set_marginsensitiven(1, 1) @view_win.sci_set_automatic_fold(Scintilla::SC_AUTOMATICFOLD_CLICK)
sci_set_automatic_fold
というメッセージは簡単に見付かったが、sci_set_marginsensitiven
の存在に気付くのに時間がかかった。
これで、マウス操作での表示・非表示が実現できる。
折り畳んだ例は以下。
ところで、Scintillaのterminal版実装であるscintermにはjinxというサンプルプログラムが付属している。 jinx.cは100行ちょっとのプログラムだが、マウスによる折り畳みまで実装しており、 非常に参考になる。