◀Unicode版開発トップへ
  • 1118 pluginのOutLine仕様について
    • 1119 Re: pluginのOutLine仕様について(つづき)
      • 1121 Re2: pluginのOutLine仕様について(つづき)
    • 1120 Re:pluginのOutLine仕様について
      • 1122 Re2:pluginのOutLine仕様について
        • 1123 Re3:pluginのOutLine仕様について
          • 1125 Re4:pluginのOutLine仕様について
            • 1126 Re5:pluginのOutLine仕様について
  • [1118] pluginのOutLine仕様について もか 2010年02月20日 22:35

    WSH汎用プラグインができたと聞いて、よろこんでテスト中です。
    今使ってるのは Junk/48「プラグイン機能 」のsakuraW_pluginU6.zipです。
    非常に有用で将来を左右しそうだからきびしめに書きます。
    #要求だけ書いてコードを書いてないので申し訳ないです。
    まだアウトラインしかためしてないので内容はOutLineオブジェクトについてのみです。

    それで、私ですら普段使っていない下記のOUTLINE DLLをJScriptにいそいそと移植中です。
    http://www.geocities.jp/moca_skr/bin_other.html
    sdiff_2006-04-20myedit.tar.gz

     以下の案ではANSI移植を考えてありますが、ANSI移植はしないのでも別にかまわないので、どっちの予定なのか教えてもらえると助かります。
    ■2. OutLine.AddFuncInfo/2のレイアウト行
    OutLine.AddFuncInfo/2の第2引数なのですが、レイアウト行番号になってます。
    マクロからどうやって取得したらいいんでしょうか?
    RubyOutline/outline.jsでは、物理=レイアウトになってました。
    普通のEditor系マクロ関数にも実装されている覚えがないです。

    今考えた案:
    *1-A. 以下のようなマクロ関数を追加
    Editor.GetNativeLength(str:string) : integer
     文字列のnativeな長さを取得します。
     Unicode版ではJScriptのString.lengthと同じです。すなわちUTF-16のバイト数/2です。
     ANSI版ではShift_JISでのバイト数です。
     CRとLFも1文字として数えます。(おそらく)

    変換関数群は以下のような感じ
    1行80だとしてたとえば
    Editor.GetLayoutLineNumberByPhysical(1,95) => 2
    (おまけ)Editor.GetLayoutColmNumberByPhysical(1,95) => 15
    (おまけ)Editor.GetPhysicalLineNumberByLayout(2) => 1
    のように変換します。これで現状のAddFuncInfoの第2引数に指定できます。

    *1-B. AddFuncInfo/2の引数を行桁にする
    OutLine.AddFuncInfo( 論理行, 行頭からのオフセット, 文字列, 付加情報 )
    にして、レイアウト行はサクラ側が設定します。
    CFuncInfoのm_nFuncLineLAYOUTは、
    ・カーソル位置のアウトラインを選択
    ・PL/SQLのジャンプ
    ・リスト表示のときで行番号が折り返し単位のときの行番号表示
    でしか使っていないみたいなので、いっそCFuncInfoArr.AddFuncのときは-1とかにしておいて、使うときに後で計算して設定するようにしても良いかもしれません。
    ただし、ファイルが大きくて仮想メモリが使われていると、アウトライン解析プラグインが1行読むときにその行のレイアウトを取得したほうが、表示の時に取得するよりスワップが少なくて高速です。
    この場合もEditor.GetNativeLengthはANSI対応時はほしいです。
    • [1119] Re: pluginのOutLine仕様について(つづき) もか 2010年02月20日 22:38

      ■2. OutLine.AddFuncInfo/2で列指定したい
      XML解析では、行番号だけだと不便なときがあるので、列番号指定がほしいです。
      これはプラグインというよりサクラ側のOutLineの拡張ですが1-Bを採用すれば、サクラエディタ側が実装していなくてもプラグイン側からは同じに見えます。
      1-Aにすると、AddFuncInfoの引数が(論理行、論理オフセット、レイアウト行、レイアウトオフセット、文字列、付加情報)になります。

      ■3. OutLine.AddFuncInfoでもオプションを設定したい
      汎用ツリー解析で、クリップボード無視の処理が可能なので設定できるようにしてほしいです。
      現状はFUNCINFO_NOCLIPTEXTしかありませんが、たぶん使えます。

      ■4.SetListTypeの引数
      基本的に、解析機能を乗っ取ってアウトライン解析ダイアログに表示させているからだとは思うのですが、エディタの内部番号なので分かりにくいと思います。
      OUTLINE_BOOKMARKとか指定すると後でずれそうです。
      「xxxxで使ってる表示方法を指定する」より「Treeで表示する」とか「クラスツリーで表示する」というなら、必ず同じ数字になるほうが良いと思います。
      0,2,6,7,14,(15),(17以上) List表示
      1,13 TreeJava(true)表示
      3,9,10,11,12 Tree表示
      13 Tree(true)表示
      4,5, TreeJava(false)表示
      8 VB表示
      16 Bookmarkモード表示(ただし数字は変化します)
      では、説明にも困るし、たとえばC++の内蔵解析を更新して標準Treeを使うようにしたらC++を指定していたものがおかしくなります。
      面倒ですが別の値を設定して、切り分けたほうが懸命だと思います。

      ■5.プラグインIDの件
      プラグインIDがずれるとタイプ別設定での指定と一致しなくなり、違うアウトラインプラグインが使われる気がします。
      タイプ別設定の構造体を変える以外いい解決方法がうかばないけれど、なるべく何とかしたいです。
      タイプ別設定もインポートできるようにしたいと妄想しているので、一意に識別できるもののほうがうれしいです。
      • [1121] Re2: pluginのOutLine仕様について(つづき) syat 2010年02月21日 21:32

        ▼ もかさん
        > ■2. OutLine.AddFuncInfo/2で列指定したい
        同意です。

        > ■3. OutLine.AddFuncInfoでもオプションを設定したい
        サクラエディタのマクロ関数は引数を4個までしか受け取れず、これを変えるのはやや躊躇します。
        対応するなら第4引数に混ぜ込む形でどうにかしたいところ。
        すごく汎用的なツリー/リストを用意して、その第4引数を万能にしておくとか。

        > ■4.SetListTypeの引数
        > 基本的に、解析機能を乗っ取ってアウトライン解析ダイアログに表示させているからだとは思うのですが、エディタの内部番号なので分かりにくいと思います。
        > 面倒ですが別の値を設定して、切り分けたほうが懸命だと思います。
        課題ですね。

        > ■5.プラグインIDの件
        > プラグインIDがずれるとタイプ別設定での指定と一致しなくなり、違うアウトラインプラグインが使われる気がします。
        > タイプ別設定の構造体を変える以外いい解決方法がうかばないけれど、なるべく何とかしたいです。
        > タイプ別設定もインポートできるようにしたいと妄想しているので、一意に識別できるもののほうがうれしいです。
        パッチページでも議論していましたが、一意な識別子を入れようとすると修正が大変で。。。
        プラグインのバージョンアップであれば古いプラグインに上書きするだけで正常に動作するはずです。また、INIをまるごとコピーすれば設定の引き継ぎは問題ありません。しかし部分的なインポート/エクスポートは考えていませんでした。
        プラグイン設定タブを強化してプラグインIDを変更できるようにするとか、いっそプラグイン設定も一緒に(im|ex)portしてもらうとか。
    • [1120] Re:pluginのOutLine仕様について syat 2010年02月21日 20:11

      ▼ もかさん
      >WSH汎用プラグインができたと聞いて、よろこんでテスト中です。
      感謝です^^

      >以下の案ではANSI移植を考えてありますが、ANSI移植はしないのでも別にかまわないので、どっちの予定なのか教えてもらえると助かります。
      今のところANSI移植は考えていません。ただマクロIFオブジェクトの改造はANSIと差分が大きくなってしまったのでそこだけ移植するかもしれません。
      プラグイン機能は全く新しい機能なのでANSI版に入れるのは必須ではないと思っています。(Uの正式リリース時期にもよりますが…)

      > ■2. OutLine.AddFuncInfo/2のレイアウト行
      > OutLine.AddFuncInfo/2の第2引数なのですが、レイアウト行番号になってます。
      レイアウト行が実際にどのように使われているのかが見極められなかったため、とりあえず的に引数に含めました。(土管とも言います)
      もかさんの言うとおり現状レイアウト行を求める方法がないので謎な引数になっています。
      マクロ関数の引数4個制限のことを考えると、私は1-Bの案がよいかなと思います。

      > この場合もEditor.GetNativeLengthはANSI対応時はほしいです。
      これは、ANSIとUNICODEで論理桁($x)の数え方が変わっているため、プラグインを共通にするなら差分吸収のため必要ということですね。

      • [1122] Re2:pluginのOutLine仕様について もか 2010年02月25日 03:22

        Functionの引数が4つまでしか定義できないのは(関数定義見てたのに)忘れてました。
        今は1-Bあたりにして、拡張はあんまり要望集まらないけど、要望とかの様子を見ながらにしますか。

        *[共通設定]-[プラグイン]
        もしかしなくても「追加」したあと「OK」押すまで本物の設定には読み込まれなくて、一時的な状態なんですね。
        ここで、プラグインを削除して新しいのを追加すると、一覧の「プラグイン名」と説明が古いままなので一致しなくて混乱します。
        追加して稼動になったあとフォルダを改名か削除して設定画面で「削除」するとエディタがフリーズして全滅します。
        それからIDが同じでも複数読み込める?みたいで、その辺よく分かりません。

        *[タイプ別設定]-[スクリーン]-「アウトライン解析方法」標準ルール
        プラグインの順番とアウトラインの順番が一致しないというか毎回違うようです。
        実用上の問題はないけど不思議です。なんでだろう。

        wikiのほうに、XML+XHTML+HTMLモドキ+JS+CSSアウトライン解析をアップしました。
        ベータ版ですが重さとかの検証にどうぞ。コードはスパゲティーが進んでいるのでmini化してごまかしてあります。
        コードが悪いのもあって内蔵のアウトラインとくらべると若干待たされる感があります。
        しかしアウトライン解析のコードを弄繰り回したりするときの楽さはスクリプトが圧勝です。
        言語固有のコードを長く書いても、本体のソース・バイナリの肥大を気にしなくていいというのもうれしいです。
        デバッグはすこしノウハウが必要かもしれません。
        Editor.TraceOutに直接なげないでバッファリングしたりブラウザを使う等すると少し楽できます。
        • [1123] Re3:pluginのOutLine仕様について syat 2010年03月01日 02:04

          プラグインの追加/削除まわりを見直して、状態の表示を詳しくしてみました。テストバイナリをwikiに上げておきます。

          > 追加して稼動になったあとフォルダを改名か削除して設定画面で「削除」するとエディタがフリーズして全滅します。
          修正済みです。
          > それからIDが同じでも複数読み込める?みたいで、その辺よく分かりません。
          すみません;実装が中途半端だったので直しました。
          • [1125] Re4:pluginのOutLine仕様について もか 2010年03月03日 23:46

            新しいの昨日確認しました。落ちないし良いと思います。
            PatchUnicodeのほうにコメントしてあります。

            たった今気がついたのですが、Editor.Outline()が存在しているんですね。
            Editorは省略可能ということになっているので、Outlineと
            Outline.xxxと被るけれど、意図的でしょうか?
            プラグインをマクロで実行すると...とか0.3mmぐらい心配します。
            • [1126] Re5:pluginのOutLine仕様について syat 2010年03月18日 00:11

              すこし時間が空いてしまいましたが、アウトライン解析の桁追加を実装してみました。
              PatchUnicode:2971992
              レイアウト行/桁は論理行/桁から変換できたので、代わりに論理桁を指定できるようになりました。
              オフセットではなく桁番号なので1から始まることに注意。

              FUNCINFO_NOCLIPTEXTオプションは、AddFuncInfo2の第4引数(深さ)に足し算して指定できるようにしました。
              今のところ汎用ツリーのみに実装されていますが、リストのほうも同じく第4引数にANDすれば対応できます。

              Editor.Outline()とOutlineオブジェクトの被りは気付きませんでした。
              JScriptとVBScriptで試したかぎり、プラグインとしては問題なさそうですが、今後RubyとかPHPが入ってきたらどうなるかわかりません。言語実装依存になってしまうのがちょっと嫌なので「Funclistオブジェクト」とかに改名するのも一つの手ですが。あまり関数名とオブジェクト名にしばりを入れたくないなぁ。
              なおマクロで実行した場合はOutlineオブジェクトが見えないため混同はありません。
              ただし、プラグイン内部からEditor.Outline()を呼ぶと大変なことになったので、そこは再入できないよう制限を入れました。