マクロについてアドバイスお願いします

  1. どうもお世話になってます
    マクロについてアドバイスお願いします

    マクロは素人ですが
    いちいちまーくするのも面倒で
    行番号をクリックしての行選択コピーは
    他のソフトに貼り付けると改行してしまうので
    行選択のマクロを作りました
    自身で何とか作って
    右クリックメニューに登録し使ってますが
    2、3回実行しないと反応しない時があり困ってます

    実は昔gPad用に作ったもので
    gPadでは問題無く動いてます
    gPadのマクロはMeryでも動くようなので多数流用してますが
    以下のみ調子が悪いです

    行選択.js
    document.selection.SelectLine();
    document.selection.CharLeft(true);
    行選択(コピー).js
    document.selection.SelectLine();
    document.selection.CharLeft(true);
    document.selection.Copy();
    行選択(切り取り).js
    document.selection.SelectLine();
    document.selection.CharLeft(true);
    document.selection.Cut();

     |  kiyohiro  |  返信
  2. 私もいちばん最初に「自分で作ったコード」は、「複数行の論理行を範囲選択(末尾改行を含まない)」でした。 :)
    そのさい、CharRight() の動作に疑問があってこちらのフォーラムで質問したこともあります。
    https://www.haijin-boys.com/discussions/3740

    > 2、3回実行しないと反応しない時があり困ってます
    の原因については私にはわかりませんが、とりあえず、SelectLine() のあとの改行の切り捨てについては CharLeft( true ) ではなく、document.selection.SetActivePos( document.selection.GetActivePos()-1, true ) をおすすめします…。(ref. id.)

    範囲選択なし(トリプルクリックや行番号のクリックなし)の状態から、キャレットのある論理行だけを末尾改行なしで範囲選択するなら、SelectLine() のかわりに以下の2行のコードを使うこともできます。
    ref. https://www.haijin-boys.com/wiki/マテリアルデザインっぽいアイコンと『小マクロ集』#論理行を選択する_(改行を含まない)_※1行のみ

    // 行選択
    document.selection.StartOfLine( false, mePosLogical );
    document.selection.EndOfLine( true, mePosLogical );	// 改行を含まない
    
    // コピー または 切り取り の操作を追加
    document.selection.Copy();
    // document.selection.Cut();

    論理行(折り返しをふくめた行全体)を範囲選択するのが目的ですよね?
    行数は多くなりますが以下のようなコードを利用すると、行番号のドラッグなどでの複数行の範囲選択でも最後の改行を切り捨てることができるようになります(中途半端な範囲選択から行全体に拡張することもできます)。
    ※行番号を下から上にドラッグした場合も考慮すると CharLeft( true ) では都合がわるいので、どうしても長くなってしまいます。

    #title = "行選択"
    #tooltip = "論理行を選択する (改行を含まない)"
    // #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",134
    
    // 論理行を選択する(行末の改行を含まない) ※複数行可
    SelectLines();
    
    // コピー または 切り取り の操作を追加
    document.selection.Copy();
    // document.selection.Cut();
    
    /**
     * 関数 SelectLines()
     * 複数行選択(末尾改行をふくめない)
     */
    function SelectLines() {
      var s = document.selection;
      var ty = s.GetTopPointY( mePosLogical );		// 選択範囲の先頭行の Y
      var by = s.GetBottomPointY( mePosLogical );	// 選択範囲の最終行の Y
      var bx = s.GetBottomPointX( mePosLogical );	// 選択範囲の最終行の X
      if ( bx == 1 && ty != by ) { by -= 1; }	// 選択範囲の末尾が行頭 x = 1 にあるときの調整
      s.SetActivePoint( mePosLogical, 1, by );	// 選択範囲の最終行の行頭
      s.EndOfLine( false, mePosLogical );		// 選択範囲の最終行の行末(末尾改行を含まない)
      s.SetAnchorPoint( mePosLogical, 1, ty );	// あらためて選択範囲の先頭行まで選択
    }
    
    // または
    /**
     * 関数 SelectLines()
     * 複数行選択(末尾改行をふくめない)
     * 
     * masme 作成の「コメントマーク付け外し」マクロより
     * ※ 左下(行頭位置)から右上に矩形選択した場合も考慮したコード
     */
    function SelectLines() {
      var s = document.selection;
      var ty = s.GetTopPointY( mePosLogical );
      var by = s.GetBottomPointY( mePosLogical );
      var bx = s.GetBottomPointX( mePosLogical );
      var br = ( s.Text.match( /\n/g ) || [] ).length;
      if ( bx === 1 && by - ty === br && br ) { by --; }
      s.SetActivePoint( mePosLogical, 1, by + 1 );
      s.SetAnchorPoint( mePosLogical, 1, ty );
    }

    ref.1 https://www.haijin-boys.com/wiki/マテリアルデザインっぽいアイコンと『小マクロ集』#論理行を選択する_(改行を含まない)_※複数行可 (sukemaru)
    ref.2 https://www.haijin-boys.com/wiki/コメントマーク付け外し#ソースコード_2 (masme氏)
    ref.3 https://www.haijin-boys.com/wiki/マクロ覚え書き(開発者向け)#矩形選択の扱い (ks氏)

     |  sukemaru  |  返信
  3. 自己レスです。(関数コードの訂正)

    /**
     * 関数 SelectLines()
     * 複数行選択(末尾改行をふくめない)
     * 
     * masme 氏作成の「コメントマーク付け外し」マクロより 改変	//  ← ←
     * ※ 左下(行頭位置)から右上に矩形選択した場合も考慮したコード
     */ 
    function SelectLines() { 
      var s = document.selection;
      var ty = s.GetTopPointY( mePosLogical );
      var by = s.GetBottomPointY( mePosLogical );
      var bx = s.GetBottomPointX( mePosLogical );
      var br = ( s.Text.match( /\n/g ) || [] ).length;
      if ( bx === 1 && by - ty === br && br ) { by --; }
      s.SetActivePoint( mePosLogical, 1, by );	//  ←
      s.EndOfLine( false, mePosLogical );		//  ←
      s.SetAnchorPoint( mePosLogical, 1, ty );
    }
     |  sukemaru  |  返信
  4. sukemaruさんありがとうございます
    早速、差し替えて使わせていただきます

    右クリックメニューの動作ですが自己解決しました
    差し替えたsukemaruさんのマクロも同じ症状が出たので
    新しくMeryを用意してデフォルト状態で試すと大丈夫でした
    そこで右クリックメニューに登録したものを一旦全て削除して
    数も減らして再登録すると治りました
    入れ過ぎか何度も登録削除してたのでおかしくなってたのかな?
    もしくはマシンパワー不足?
    行選択.jsを登録してた辺りから下全部反応が悪くなってました

     |  kiyohiro  |  返信
  5. 解決おめでとうございます、でいいのかしら? 多少なりともお役に立てたのならよかったです。
    複数行可の論理行選択のコードは文字列操作系のマクロではお約束のようなものなので、役に立つ機会はいろいろとあるかとおもいます。
    そもそも kiyohiro さんのマクロのコードの内容自体に悪さをしそうな部分はありませんでしたので、なんだったんでしょうね?

    うちの Mery はマクロ×96、外部ツール44、編集モード×33 を登録していて、もうゼロからの再設定なんていう後戻りはできない状態ですので、Mery.ini や Mery.his のバックアップはマメにとるようにしています ( ← マテリアルデザインっぽいアイコンと『小マクロ集』を作っていたときは 150 以上のマクロを登録していました)。

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