Scintillaとmrubyでテキストエディタを作る(6) : folding

Scintillaの豊富な機能のひとつにfoldingがある。”折り畳み”である。 プログラムを編集する際、クラスやメソッド単位で表示・非表示を切り替えるようなものである。

作成中のmrbmacsというエディタでの例だが、folding機能を有効にすると、以下のようにmoduleやclassの左に「-」マークが付く。

f:id:masahino123:20161012224735p:plain

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の存在に気付くのに時間がかかった。 これで、マウス操作での表示・非表示が実現できる。

折り畳んだ例は以下。

f:id:masahino123:20161012230350p:plain

ところで、Scintillaのterminal版実装であるscintermにはjinxというサンプルプログラムが付属している。 jinx.cは100行ちょっとのプログラムだが、マウスによる折り畳みまで実装しており、 非常に参考になる。