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 ) というファイルで実装した。

Scintillaとmrubyでテキストエディタを作る(4) : GTK版

curses版 のエディタは、そこそこ動くところまで作れたので、他のUIのものも用意できないか検討してみた。

そもそも、ScintillaWindowsMac OS XGTKに対応しているので、まずはその辺りから。 一番簡単そうな、GTKから着手。

curses版(mruby-bin-mrbmacs-curses)と同じように、

mrubyでのGTKバインディングは、mruby-gtk2とmruby-gtk3と2つあった。 どちらか選んで、scintillaもそれ用にビルドする。GTK3でコンパイルするには、GTK3を定義してmakeだ。 あたらしいほうが良いだろう。

で、こんな感じ。

f:id:masahino123:20160919092548p:plain

それっぽい見た目。ただし、まだ実用不可。 編集用のwindowは問題無く作れそうだが、ファイルのopen/saveや検索/置換のダイアログが出来ていない。

せっかくGTKなのだから、FileChooserDialogなど使おうとしたが、runしたところで、以下のエラー。

(<unknown>:27316): Gtk-CRITICAL **: gtk_dialog_run: assertion 'GTK_IS_DIALOG (dialog)' failed

やりかたが分らない・・・

一旦、あきらめて、FileSelectionを試してみる。 FileSelectionはGTK3には無いので、GTK2用にビルドし直し。

やってみると、 なぜか、メインのwindowを作成する前にFileSelection.newを書かないと、ファイル選択画面が出てこない。

そして、FileSelectionのok_buttonとcancel_buttonを取得する方法も分らない・・・

ここで、挫折。

GTKのウィンドウの描画やsignal_connect関係は、単純にC言語で書いたほうが悩みが少ないかも。 ただ、そうすると、mruby-scintilla-gtkはどう使う?

また、今度考えることにして、しばらくcurses版のみをがんばって作っていこう。

Scintillaとmrubyでテキストエディタを作る(3) : mruby-cli化

前回のさらに続き。

ビルド方法の検討

作成中のエディタScintillacurses等のライブラリに依存しまくっているので、ビルドが面倒であった。

また、複数のプラットフォームで利用できないか、検討した。

当初は、buildスクリプトを頑張って用意していたが、なかなか大変だったので、 mruby-cliを使ってマルチプラットフォーム化に取り組んだ。

まず、どっか新しいディレクトリで、

$ mruby-cli --setup mruby-bin-mrbmacs-curses

を実行して、必要なファイルを用意する。

作成された、Dockerfile、Rakefile、build_config.rb、docker-compose.ymlをガシガシ弄る。

x86_64-pc-linux-gnui386-pc-linux-gnux86_64-apple-darwin14、i386-apple-darwin14、i686-w64-mingw32、x86_64-w64-mingw32 で、コンパイルできるところまでは行き着いた。動くかどうかは、未確認なものもあり。

Dockerfileでは、ビルドに必要なcursesとiconvを用意する処理を追加している。

色々と悩んだ末に、WIndows環境ではPDCursesを使うようにしている。 また、mruby-requireを一時的に組込まないようにしている(確か、ビルドでエラーが出たため)。

Linux環境では、iconvはglibcに含まれているため、コンパイル時の-liconvが不要。 build_config.rbでは以下のような場当たり的な対処を施している。

  conf.gem :github => 'masahino/mruby-iconv', :branch => 'add_iconvlist' do |g|
    g.linker.libraries.delete 'iconv'
  end

ここで、実験的にmruby-iconvをフォークして、iconvlistを追加していたことを思い出した。

我ながら、色々と中途半端で良くない・・・

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

前回 の続き。

用意するmrbgem

mruby-curses

まずはこれが必要だろうと考えた。検討した段階でgithubには存在したので、それを利用した。 その後、幾つか欲しい機能が出てきたので、一旦fork。

GitHub - masahino/mruby-curses

後から考えると、scinterm越しに利用するので、使わない手もあったかもしれない。

mruby-termkey

入力にlibtermkeyを使うので、作った。

GitHub - masahino/mruby-termkey

mruby-scinterm

Scintillacurses向け実装であるscintermを使うため、作成。

GitHub - masahino/mruby-scinterm

mruby-scintilla-base

curses以外のUIにもそのうち対応させたいと思い、共通的な定義をこちらに移した。

GitHub - masahino/mruby-scintilla-base

mruby-bin-mrbmacs-curses

本体。

GitHub - masahino/mruby-bin-mrbmacs-curses: Scintilla base text editor written in mruby

mruby-mrbmacs-base

こちらもcurses以外のUIに対応できるように、共通的な機能を抜き出した。

GitHub - masahino/mruby-mrbmacs-base: Scintilla based text editor

その他のmrbgems
  • mruby-iconv
  • mruby-dir-glob
  • mruby-regexp-pcre
  • mruby-require

あと、これらが依存しているもの。

Scintillaとmrubyでテキストエディタを作る

しばらく前から、Scintilla (http://www.scintilla.org) というテキスト編集用のライブラリとmrubyを使ってテキストエディタを作成している。 検討結果の備忘録として、色々と記録しておきたいと思う。

概要

ScintillaWin32GTK+OS Xに対応しているが、terminalで使いたかったので、 curses実装であるScinterm(https://foicica.com/scinterm/)を主に利用している。

名称はmrbmacs (https://github.com/masahino/mruby-bin-mrbmacs-curses)。 名前から容易に推測できるようにEmacsライクなエディタである。 mrubyのmrbgemとして作成している。

現時点での見た目は、以下のような感じ。 f:id:masahino123:20160912232905p:plain

右側のスクロールバーがいまいちだ。

キー入力には、 libtermkey を使っている。

GR-SAKURAでGROVEの温湿度センサを使う

GR-SAKURAのローカルビルド環境を更新したので、GROVEの温湿度センサを使ってみる。

ベースシールドを取り付ける。

Seeed Studio Bazaar, Boost ideas, Extend the Reach

etherの口が干渉するので、マスキングテープでカバー。

温湿度センサは、これ。使われているのはDHT22。

https://www.seeedstudio.com/item_detail.html?p_id=838

参考になるサンプルを探したら、 そのものずばりのサンプルがあった。

http://japan.renesasrulz.com/gr_user_forum_japanese/m/mediagallery/18.aspx

サンプルではDHT11となっているが、そのまま動いた。

GR-SAKURAのビルド環境をアップデートしてみる

久々にGR-SAKURAで遊ぼうと思い、まずはローカルのビルド環境を更新している。

ソースはhttps://gcc-renesas.com/ja/からダウンロードできる。今回はv16.01をダウンロードした。

ビルド方法は、 https://gcc-renesas.com/wiki/index.php?title=How_to_build_the_RX_Toolchain_under_Ubuntu_14.04を参考に。

MacOS X上でエラーが発生したのは、

  • autoconfのバージョン

  • なぜか、展開したソースに含まれるスクリプト(configureとか)に実行権限が付いていない

といった点。

autoconfは2.64が必要だと言われ、Homebrewでautoconf264をインストールしても、autoconf264といったファイル名でインストールされるので、シンボリックリンクを張ることで回避。正しい方法は不明。

あと、gettext関係のツールのパスが見つからなかったので、brew linkをしたが、その際--forceオプションが必要だった。

newlibのビルドには時間がかかる・・・

gdbはとりあえず、後回し