scinterm 1.9のビルドエラー

Scintilla 3.7.5に対応したscinterm 1.9がリリースされていたが、ビルドするとエラー発生。

コンパイラのバージョンなどを変えてみたり、コンパイルオプションを変えてみたりしたが改善せず。

以下の変更で、エラーは取れた。 後で、もうちょっと真面目に調査する。

diff -ru scinterm_1.9-org/ScintillaTerm.cxx scinterm_1.9/ScintillaTerm.cxx
--- scinterm_1.9-org/ScintillaTerm.cxx  2017-06-26 05:25:19.000000000 +0900
+++ scinterm_1.9/ScintillaTerm.cxx      2017-08-04 20:46:51.000000000 +0900
@@ -15,10 +15,13 @@
 #include <string>
 #include <vector>
 #include <map>
+#include <new>
 #include <algorithm>
+#include <memory>

 #include "Platform.h"

+#include "UniqueString.h"
 #include "Scintilla.h"
 #include "ILexer.h"
 #include "Position.h"
@@ -1284,7 +1287,7 @@
           int offset = ry - ny - 1; // -1 ignores list box border
           if (offset == 0 &&
               time - autoCompleteLastClickTime < Platform::DoubleClickTime()) {
-            ListBoxImpl* listbox = reinterpret_cast<ListBoxImpl *>(ac.lb);
+            ListBoxImpl* listbox = reinterpret_cast<ListBoxImpl *>(ac.lb.get());
             if (listbox->doubleClickAction != NULL)
               listbox->doubleClickAction(listbox->doubleClickActionData);
           } else ac.lb->Select(n + offset);

nokogiriとかのインストールにてこずる

久々に、使いたいrubyのライブラリがあり、動かしたらnokogiriが無いと言われた。

gemでインストールしようとしたらエラー。

いろいろ試行錯誤した結果、

nokogiriが(また)インストールできない - \ay diary

を見付けて、回避策(a)「一時的にbrew unlink xzする」を選択。

ついでにemacsskkが動かなくなっていたので、 再インストール。 こちらは、まだ問題が残っているので、後で調査する。

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

Scintillaを使ったテキストエディタのその後。

masahino123.hatenablog.com

mruby-gtk3を使うのを断念して、GTK関係の処理はC言語で書くようにした。

f:id:masahino123:20170313231120p:plain

せっかくなので、curses版とは少し見た目を変えてみた。

テキストエディタを作っていると、いくらでも作り続けられるので、 ネタに困らなくて良い。

最低限の編集と保存ができれば、作成中のエディタを使って、 編集していれば、なにかしら直すところが見つかるので、 それを直すという作業をひたすら繰り返すことになる。

飽きてくれば、少し高度なことに挑戦すれば良いし、 実装のお手本は、沢山ある。

ScintillaのAutocompletionの調査

Scintillaの機能で、Autocompletionというものがある。自動補完である。

次のスクリーンショットのような感じで使う。

f:id:masahino123:20170210220824p:plain

SCI_AUTOSHOWというコマンドを、入力した文字列数と候補の文字列を引数にして実行すると、 ぺろんと候補一覧が表示される。

候補が表示されている状態では、キー入力において、候補の選択が優先される。

今回のサンプルでは、rubyの編集の例なので、irb/completionを参考に作っている。

若干、表示が遅くなったように感じるので、少しチューニングが必要かもしれない。

ScintillaのAnnotationを試す

ScintillaのAnnotationを試してみる。

公式ドキュメントの例では、コンパイルエラーやワーニングを表示している。 Scintermでは、メッセージに枠は付かないので、背景色を変えて 目立たせないと、編集ドキュメントと区別が付かなくなってしまう。

f:id:masahino123:20170208223416p:plain

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行ちょっとのプログラムだが、マウスによる折り畳みまで実装しており、 非常に参考になる。