Scintillaとmrubyでテキストエディタを作る(5) : 単純な検索と置換機能

ScintillaとmrubyでEmacsライクなテキストエディタ(mrbmacs)を作成している。

Scintillaにはテキストエディタに必要な様々な機能が用意されているので、自作エディタになにかしらの機能を追加する手順は、

  1. 実装したい機能を考える
  2. Scintillaのドキュメントから使えそうな機能を探す
  3. 幾つかの機能を組み合わせて実験して、作っていく

という感じ。

検索と置換に関しては、”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 ) というファイルで実装した。