アウトラインの要素内の範囲選択方法について

  1. お世話になります。
    アウトラインプラグインを使用して、例えば以下のような構造のテキストを
    作成したとして、#2の中のテキストのみを範囲選択するのに、スマートな
    方法はありませんでしょうか?
    要素の範囲内のみを全選択できるCTRL+Aのようなショートカットキーがあれば
    ベストなのですが見つけることができず、現在はマウスで選択していますが、
    キーボードのみでできるとありがたいです。
    よろしくお願いいたします。

    # 1
    あああああああああああああああああ。
    ああああああ。

    # 2
    いいいいいいいいいいいい。
    いいいいいい。

    # 3
    ううう。

     |  ngc  |  返信
  2. Mery をお試しいただきありがとうございます。

    アウトライン解析の部分はプラグインというかたちでのご提供となっておりますので、アウトラインプラグインの機能を本体側のショートカットキーで呼び出すことはできません。

    アウトラインプラグインを使用せずマクロを使うか、アウトラインプラグインのソースはオープンソースとなっていますのでそちらをもとにキー操作を可能とするプラグインを作成していただけばできないことはないと思いますが…。

    ご不便をおかけして申し訳ございませんがこちらについては改善が難しいため、何卒ご理解とご了承いただけましたら幸いです。

     |  Kuro  |  返信
  3. お忙しいところ、ご返信頂きありがとうございます。
    プラグインの仕様とのこと理解いたしました。
    マクロでうまいことできないか試してみます。
    ご対応ありがとうございました。

     |  ngc  |  返信
  4. 横から失礼します。お気持ち、よくわかります
    おそらく要素?1つ1つが1話なのではないでしょうか?
    違ってたらアレですけれども以下のようなマクロはどうでしょうか?

    //----------------------------------------------------------
    // 設定
    var wd="#";	// レベルの記号
    var flg=0;	// meFindReplaceRegExpなどフラグ
    //----------------------------------------------------------
    var s=Document.Selection;
    var sx=ScrollX,	sy=ScrollY;	// スクロール位置退避
    
    if(s.Find(wd,meFindPrevious|flg) == 1){
    	s.StartOfLine(); s.LineDown();	// 次行の行頭
    }else{
    	s.StartOfDocument();	// 文書の先頭
    }
    var ePos=s.GetActivePos();	// 選択範囲の終点
    
    if(s.Find(wd,meFindNext|flg) == 1){
    	s.StartOfLine();	// 行頭
    //s.LineUp(); s.EndOfLine();	// 前行の末尾
    }else{
    	s.EndOfDocument();	// 文書の末尾
    }
    var sPos=s.GetActivePos();	// 選択範囲の始点
    s.SetActivePos(sPos);	// 選択範囲の設定:始点
    s.SetAnchorPos(ePos);	// 選択範囲の設定:終点
    ScrollX=sx;	ScrollY=sy;	// スクロール位置復帰
    editor.ExecuteCommandByID(2139);	// 検索強調を解除

    要素内のどこかにキャレットがあればその要素全体を選択します
    本文中に#があるとうまく動作しません、正規表現を使えばいい感じになるかもですが、私は正規表現が苦手なので……
    というか、もうすでに解決されてるかもですね

     |  シリル  |  返信
  5. シリル様

    ご返信いただきありがとうございます。
    おっしゃる通り、各要素が1話で、その文字数を調べるための操作でした。
    そして、頂いたマクロがまさに求めていた機能そのものでした。
    本当に感謝いたします。ありがとうございました。

     |  ngc  |  返信
  6. > 本文中に#があるとうまく動作しません、正規表現を使えばいい感じになるかもですが、 …
    正規表現でよければ、以下のマクロで。

    // 設定 ----------------------------------------------------
    // ノードの検索用正規表現 (← 鬼雲の書式で。※ バックスラッシュは二重に)
    
    // 行頭が「# 」で始まり、全角数字または半角数字で終わる行
    var regStr = "^# ([0-9]|\\d)+$";
    // ---------------------------------------------------------
    var d = Editor.ActiveDocument,  s = d.Selection;
    var anc = s.GetAnchorPos(),  act = s.GetActivePos();
    var sx = ScrollX,  sy = ScrollY;
    var len = d.Text.length;
    
    // ➀ ノードの先頭を探す(なければ文書の先頭)
    var tp = s.Find( regStr, meFindPrevious + meFindReplaceRegExp )
           ? s.GetActivePos() : 0;
    
    // ➁ 次のノードの先頭を探す(なければ文書の末尾)
    // s.SetActivePos( act );
    var bp = s.Find( regStr, meFindNext + meFindReplaceRegExp )
           ? s.GetActivePos() : len;
    d.HighlightFind = false;
    
    // ノードを範囲選択(➀ ➁ がなければ範囲選択しない)
    if ( tp == 0 && bp == len ) {
      s.SetActivePos( anc );  s.SetActivePos( act, true );
    }
    else {
      s.SetActivePos( tp );  s.SetAnchorPos( bp );
    }
    ScrollX = sx;  ScrollY = sy;

    GetIniOption2() 関数を使えば、編集モード名 <Mode> から Mery.ini 内の [Outline\<Mode>] セクションの Match<n> キー の値や RegEx<n> キー の値を自動取得して、検索フラグを使い分けたりノードの階層を自動的にたどっていったりできそうですが…。

     |  sukemaru  |  返信
  7. 検索系のマクロを書いてゴリゴリやるよりも、エディタ側にフォーカスがある状態からなら、キーボード操作の

    F6 キー => アプリケーションキー => S キー

    でノードを範囲選択できるわけですから wshShell.SendKeys() のマクロでいけそうなのでは?

    …ともおもったのですが、SendKeys() メソッドだとアプリケーションキーを送信できないんですね。

    代用として Shift+F10 キーでコンテキストメニューを呼び出そうと以下のようなマクロにしてみましたが、うちの環境だと成功と失敗の割合が 50/50 でした…。

    #title="アウトラインのノードを範囲選択"
    // JavaScript マクロ本体
    
    var vbsFile = "SendKeys.vbs";	// JS ファイルと同じフォルダの VBS ファイル
    
    var macroDir = ScriptFullName.slice( 0, -ScriptName.length )
    var command  = "wscript.exe \"" + macroDir + vbsFile + "\"";
    var WshShell = new ActiveXObject( "WScript.Shell" );
    WshShell.Run( command );
    

    ' VBScript キーストローク送信用サブマクロ (SendKeys.vbs)
    set WshShell = WScript.CreateObject("WScript.Shell")

    ' キーストローク {F6}, Shift+{F10}, S
    WshShell.SendKeys "{F6}"
    WScript.Sleep 100
    WshShell.SendKeys "+{F10}"
    WScript.Sleep 100
    WshShell.SendKeys "S"

    ※ JavaScript マクロ内に SendKeys() を記述すると全然うまくいかなかったので、JS から VBS を呼び出すかたちにしてます。

    結局のところ、仮想キーストロークを登録できるマウスユーティリティに F6, APPS, S を送信するように設定してみたら、Mery のマクロからやるより簡単確実でした。
    (うちのは X-MouseButtonControll なので {F6}{VKC:93}S と登録して、成功率 100% でした)

     |  sukemaru  |  返信
スポンサーリンク