Scintillaとmrubyでテキストエディタを作る(5) : 単純な検索と置換機能
ScintillaとmrubyでEmacsライクなテキストエディタ(mrbmacs)を作成している。
Scintillaにはテキストエディタに必要な様々な機能が用意されているので、自作エディタになにかしらの機能を追加する手順は、
- 実装したい機能を考える
- Scintillaのドキュメントから使えそうな機能を探す
- 幾つかの機能を組み合わせて実験して、作っていく
という感じ。
検索と置換に関しては、”Searching and replacing”というセクションに各種機能が用意されている。
Scintillaの機能は、SCI_SETxxxxx や SCI_GETxxxxx といった名前のメッセージを送ることで動く。 パラメータは最大2つ設定できる。 mrbmacsで使っているscintermの場合、
scintilla_send_message (sci, iMessage, wParam, lParam)
という関数を使うことで、機能を実行する。
検索
検索にはSCI_SEARCHINTARGET というメッセージが使えそうだ。 これは、あるtargetの範囲からパラメータで指定した文字列を検索するメッセージである。
mrbmacsでは、前方検索の機能をこれで実現し、
view_win.sci_set_target_start(start_pos) view_win.sci_set_target_end(end_pos)
としておき、
ret = view_win.sci_search_in_target(search_text.length, search_text) if ret != -1 view_win.sci_set_sel(view_win.sci_get_target_start, view_win.sci_get_target_end) end
という処理で検索結果を選択している。
後方検索の場合も、startとendの設定方法を変えれば簡単にできる。
置換
置換に関しては、SCI_REPLACETARGETというメッセージが使えそう。 これは、targetで指定された範囲を引数で指定した文字列で置換するメッセージ。
まず、SCI_SEARCHINTARGETで検索する。 検索結果がTARGETに指定されるので、SCI_REPLACETARGETで置換する。
replace.rb ( https://github.com/masahino/mruby-bin-mrbmacs-curses/blob/master/mrblib/replace.rb ) というファイルで実装した。