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 ) というファイルで実装した。
Scintillaとmrubyでテキストエディタを作る(4) : GTK版
curses版 のエディタは、そこそこ動くところまで作れたので、他のUIのものも用意できないか検討してみた。
そもそも、ScintillaはWindows、Mac OS X、GTKに対応しているので、まずはその辺りから。 一番簡単そうな、GTKから着手。
curses版(mruby-bin-mrbmacs-curses)と同じように、
mrubyでのGTKバインディングは、mruby-gtk2とmruby-gtk3と2つあった。 どちらか選んで、scintillaもそれ用にビルドする。GTK3でコンパイルするには、GTK3を定義してmakeだ。 あたらしいほうが良いだろう。
で、こんな感じ。
それっぽい見た目。ただし、まだ実用不可。 編集用の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化
前回のさらに続き。
ビルド方法の検討
作成中のエディタは Scintillaやcurses等のライブラリに依存しまくっているので、ビルドが面倒であった。
また、複数のプラットフォームで利用できないか、検討した。
当初は、buildスクリプトを頑張って用意していたが、なかなか大変だったので、 mruby-cliを使ってマルチプラットフォーム化に取り組んだ。
まず、どっか新しいディレクトリで、
$ mruby-cli --setup mruby-bin-mrbmacs-curses
を実行して、必要なファイルを用意する。
作成された、Dockerfile、Rakefile、build_config.rb、docker-compose.ymlをガシガシ弄る。
x86_64-pc-linux-gnu、i386-pc-linux-gnu、x86_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
Scintillaのcurses向け実装である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を使ってテキストエディタを作成している。 検討結果の備忘録として、色々と記録しておきたいと思う。
概要
ScintillaはWin32、GTK+、OS Xに対応しているが、terminalで使いたかったので、 curses実装であるScinterm(https://foicica.com/scinterm/)を主に利用している。
名称はmrbmacs (https://github.com/masahino/mruby-bin-mrbmacs-curses)。 名前から容易に推測できるようにEmacsライクなエディタである。 mrubyのmrbgemとして作成している。
現時点での見た目は、以下のような感じ。
右側のスクロールバーがいまいちだ。
キー入力には、 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はとりあえず、後回し