カッコで囲う2

提供:MeryWiki
ナビゲーションに移動 検索に移動

選択範囲(複数選択可)の各行を、ポップアップメニューから選択したアイテム(カッコ)で囲います。
Mery ver 3.0.0 以降のマルチカーソル/複数選択範囲に対応 。

機能[編集]

  • 複数行選択や複数選択(またはマルチカーソル状態)を行に分けたそれぞれの部分をカッコで囲います。
  • 選択範囲がないときはカーソル位置(マルチカーソル可)それぞれにカッコを挿入します。
  • 選択範囲がひとつのとき、選択範囲のさいごの改行は無視します。

制限事項[編集]

  • このマクロは Mery ver 2.x では使用できません。
  • 複数行の選択範囲全体を一組のカッコで囲うことはできません。
  • 矩形選択範囲は複数選択範囲に分解します(選択範囲を行に分ける)。
  • クリップボードを経由しての「マルチカーソル貼り付け」処理をおこなうので、外部アプリのクリップボード監視ソフトが常駐している場合は正常に機能しないかもしれません。

カッコの登録[編集]

ソースコード内の設定項目の配列でカッコの種類を定義します。
カッコで挟みこまれる部分を ... で置きかえた "「...」" が基本形式となります。
... がないアイテムはメニューに表示されません。
... を行頭に付加させることはできません。
  • 各行の前後を囲う "カッコ"
カッコや HTML タグ、任意の記号、文字列を "「...」""<pre>...</pre>" のように記述して登録します。
  • 各行の先頭にのみ記号や文字列を付加する場合
>..." のように ... の後ろに文字列をつけずに登録します。
箇条書きのビュレットや行頭のコメントマーク、引用符などの挿入に利用できます。
  • 各行の末尾にのみ記号や文字列を付加する場合
"...!?" のように ... の前に文字列をつけずに登録します。
  • ポップアップメニュー先頭の 「任意の文字列...」コマンド を利用すれば、定義配列に登録していないカッコやタグ、記号など任意の文字列を指定することができます。

ソースコード[編集]

#title = "カッコで囲う2"
#tooltip = "選択範囲の各行をカッコで囲う"
#icon = "Mery用 マテリアルデザインっぽいアイコン.icl",256

/**
 * ---------------------------------------------------------
 * 「カッコで囲う2」マクロ
 * sukemaru, 2020/06/05
 * ---------------------------------------------------------
 * Mery ver 3.0 以降のマルチカーソル(複数選択範囲)に対応
 * ・Mery ver 2.x では使用できません。
 */

var meModeMulti;
if ( meModeMulti === 3 ) {

// ---------- ▼ 設定項目 ▼ ---------- //

  // ■ カッコ(タグ・記号等)の種類の定義
  // ※ 定義ではカッコ(タグ・記号等)の間にドット×3 "..." をはさんでおくこと
  // ※ "★..." なら前だけ、"...★" なら後ろだけに記号等をつけられる
  // ※ "" でポップアップメニュー内のセパレータ(横罫線)

  var pp = new Array( "",
    "(...)", "[...]", "[[...]]", "(\"...\")", "", 
    "\"...\"", " \"...\" ", "'...'", "", 
    "「...」", "『...』", "【...】", "(...)", "", 
    ">> ...", "> ...", "\/\/ ...", "...\t\/\/ ", "\/\* ... \*\/", "", 
    "※...", "・...", "■...", "◆...◆", "", 
    "''...''", "'''...'''", "<code>...</code>", 
  "" );

// ---------- ▲ 設定項目 ▲ ---------- //

  var a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".split( "" );
  var Conv = function( str ) {
    return str.replace( /[ ]/g, "\u2006_\u2006" )	// \u2423 ␣
              .replace( /\t/g, "\\t" )
              .replace( /\n/g, "\\n" );
  };

  var d = editor.ActiveDocument;
  var s = editor.ActiveDocument.selection;
  var st = s.Text;

  // ポップアップメニュー
  var menu = CreatePopupMenu();
  var flag = d.ReadOnly ? meMenuGrayed : 0;
  menu.Add( "任意の文字列 (&@) ...", 100000, flag );
  menu.Add( "----", 0, meMenuSeparator );
  for ( var i = j = 0, len = pp.length, p, p1, p2, label;
  i < len; i ++ ) {
    if ( ! pp[i] || pp[i].indexOf( "..." ) === -1 ) {
      menu.Add( "----", 0, meMenuSeparator );
      continue;
    }
    p = pp[i].split( "\.\.\." ), p1 = p[0], p2 = p[1];
    label = ( ! p1 ) ? Conv( p2 ) + " を末尾に付加"
          : ( ! p2 ) ? Conv( p1 ) + " を先頭に付加"
          :  Conv( p1 ) + " ・・・ " + Conv( p2 ) + " で前後を囲う";
    if ( ! a[j] ) { j = 0; }
    label += " (&" + a[ j ++ ] + ")";
    menu.Add( label, i, flag );
  }
  menu.Add( "キャンセル	& ", 0 );

  if ( flag ) { Status = " ドキュメントは書き換え禁止です。"; }
  main:
  if ( r = menu.Track( mePosMouse ) ) {
    var reg = /\n?$/,  n = st.match( reg );
    // 矩形選択範囲を行に分ける
    if ( s.Mode === meModeBox ) { s.Mode = meModeMulti; }

    // ダイアログのテキスト入力フィールドで文字列を指定
    if ( r === 100000 ) {
      // 前回使用した文字列があれば再利用
      var tagKey = "brackets2", str1 = str2 = "";
      if ( window.Tag.Exists( tagKey ) ) {
        str1 = window.Tag( tagKey ).str1;
        str2 = window.Tag( tagKey ).str2;
      }
      var p1 = Prompt(
        "前につける文字列:\t改行 = \\\\\\n ; タブ = \\\\\\t  (注:¥記号3つ)", str1
      ).replace( /\\\\\\n/g, "\n" ).replace( /\\\\\\t/g, "\t" );
      var p2 = Prompt(
        "後ろにつける文字列:\t改行 = \\\\\\n ; タブ = \\\\\\t  (注:¥記号3つ)", str2
      ).replace( /\\\\\\n/g, "\n" ).replace( /\\\\\\t/g, "\t" );
      if ( ! p1 && ! p2 ) { break main; }
      pp[100000] = p1 + "..." + p2;
      window.Tag( tagKey ) = { str1: p1,  str2: p2 };
    }

    // 選択範囲が1つで1行以内のとき
    if ( ! s.Count && st.indexOf( "\n" ) < 0 ) {
      s.Text = pp[r].replace( /\.\.\./, st.replace( reg, "" ) ) + n;
    }

    // 複数行または複数選択のとき
    else {
      // クリップボード履歴を退避
      var cb      = ClipboardData;
      var cbData  = cb.GetData();
      var cbArray = [];
      var cbData0 = cb.GetData( 0 );
      if ( cbData0 ) {
        for ( var i = 0; i < 16 ; i ++ ) {
          cbArray.push( cb.GetData( i ) || "" );
        }
      }
      var cbCount = cbArray.length;

      // 選択範囲の各行の文字列ににカッコを付加
      var tmp = st.replace( reg, "" ).split( "\n" );
      for ( var i = 0, len = tmp.length; i < len; i ++ ) {
        tmp[i] = pp[r].replace( /\.\.\./, tmp[i] );
      }
      // クリップボード経由で「貼り付け」
      cb.SetData( tmp.join( "\n" ) + n );
      s.Paste();

      // クリップボード履歴のデータを復帰
      cb.ClearData();
      for ( var i = 0; i < cbCount; i ++ ) {
        cb.SetData( cbArray[i], i );
      }
      cb.SetData( cbArray[0] );
    }
  }
}

メモ[編集]

  • (2020/06/06, sukemaru)
マルチカーソル選択範囲への任意の文字列挿入をマクロでおこなう方法としては「マルチカーソル貼り付け [1]」がもっとも簡単そうなので、このようなかたちにしてみました。
『クリップボード履歴』メニューのマクロ化」でのピン止めアイテム(スニペット)からの貼り付け用に考えた仕組みなので、そちらの次回更新バージョンにも取り入れる予定です。
スポンサーリンク