タブを複製する

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

機能[編集]


アクティブなタブを、新規の『無題』タブに複製します。

実体ファイルの別名コピーを作ってから追加で開いたり、[ファイル] メニューの「名前をつけて保存」コマンドで別名保存してクローンを作ってから元のファイルを開きなおしたり、という方法よりも簡単にテンプレート用ファイルや作業中の文書の「一時的なクローン」をつくることができます。

  • テキスト、選択範囲、スクロール位置、編集モード、ブックマークなどの状態がまるまる複製されますので、たんなる新規タブへのテキストのコピー&ペーストよりも「アウトライン」プラグインや「ブックマーク一覧ジャンプ」マクロなどとの連携がしやすくなります。
  • 現在のタブの再編集作業のまえに実行しておくと、再編集前後の状態の比較ができたりします。
比較に使用する場合は、複製したタブをエディタウインドウの外にドラッグ&ドロップしてから [ウインドウ] メニューの「左右に並べて表示」を利用すると使いやすいとおもいます。


注意事項[編集]


  • マルチカーソル・矩形選択に対応 していません。
現在アクティブなタブ上に矩形選択範囲やマルチカーソル複数選択範囲がある場合には、それらの選択範囲は解除され、複製先の『無題』タブ上の選択範囲の状態にも正確に反映されません。
⇒ 第2版(2020/06/22)で対応
  • アクティブなタブのスクロール位置が文書末尾で「オーバースクロール」している場合、複製したタブには正確に反映されません。


  • タブを複製した後での、編集操作による変更内容は同期しません。
    ※ 編集内容を同期させたい場合は、ウィンドウ メニューの「上下に分割」または「左右に分割」コマンドを利用してください。
  • 再編集作業前後の状態の比較に使用するのが主目的の場合は、設定項目の「書き換え禁止」を newTabReadOnly = true に設定してください。
    ※ もとのタブと複製したタブを間違えて編集作業をしてしまうと「わけが分からない」状態になったりします。
  • 複製先の『無題』タブは「未保存*」フラグを内部的に解除してありますので、なんらかの編集操作をくわえていない場合は、閉じるさいに「保存の確認」等のメッセージボックスが表示されません。
⇒ 第2版(2020/06/22)で設定項目 newTabSaved を追加


ソースコード[編集]


ダウンロード >> 「ファイル:タブを複製.zip」 (アイコン入り)


#title = "タブを複製"
#tooltip = "新規タブに複製して開く"
// #icon = "file_duplicate.ico"

/**
 * ---------------------------------------------------------
 * 「タブを複製」マクロ
 * sukemaru, 2020/06/01 - 2020/10/30
 * ---------------------------------------------------------
 * 2020/06/22:
 * ・設定項目を追加
 * ・マルチカーソル選択範囲も複製可(Mery ver 3.0.x ~)
 * ・複数ウインドウモード(SDI/タブ無効)に仮対応
 * 2020/10/30:
 * ・折り返し設定を同期(Mery ver 3.1.0a ~)
 */

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

// ■ 複製先の『無題』タブを「書き換え禁止」にする?
var newTabReadOnly = true;	// true する / false しない

  // true にすると、ステータスバー右下に「書禁」が表示され編集禁止状態になる
  // false にすると、複製先の『無題』タブも編集可能状態になる


// ■ 複製先の『無題』タブを「未変更」にする?(保存済みに偽装)
var newTabSaved = true;		// true する / false しない

  // true にすると、「変更を保存しますか?」の確認なしでタブを閉じられる
  // false にすると、「変更あり*」のフラグを付加する


// ■ 複製先の『無題』タブにテキストを貼り付けない?
var newTabBlank = false;	// true 貼り付けない / false 貼り付ける

  // true にすると、元のタブのテキストをクリップボードにコピー(書式設定のみ複製)
  // false にすると、タブの完全な複製

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


( function DuplicateDocument() {
  Redraw = false;
  // 現在アクティブなタブ
  var d = editor.ActiveDocument,  s = d.selection;
  var dt = d.Text;
  // 折り返し設定を取得(Mery ver 3.1.0a ~)
  var wrapMode = ( ! "QueryStatusByID" in editor
  || typeof editor.QueryStatusByID( 2148 ) != "number" ) ? 0
               : editor.QueryStatusByID( 2146 ) === 3 ? 2146
               : editor.QueryStatusByID( 2147 ) === 3 ? 2147
               : editor.QueryStatusByID( 2148 ) === 3 ? 2148 : 0;
  // 選択範囲の座標を取得
  var sx = ScrollX,  sy = ScrollY;
  var act = s.GetActivePos(),  anc = s.GetAnchorPos();
  var sCount = s.Count || 0,  sMode = s.Mode || 0;
  if ( sCount ) {
    var Sel = [];
    for ( var i = 0; i < sCount; i ++ ) {
      Sel[i] = { act: s.GetActivePos( i ),  anc: s.GetAnchorPos( i ) };
    }
  }
  // ブックマーク設定を収集する
  var bmArray = [],  bmCount = 0;
  if ( d.GetLines() > 1 && ! newTabBlank ) {
    s.SetActivePoint( mePosLogical, 1, 2 );
    if ( s.PreviousBookmark() ) {
      bmArray[ bmCount ++ ] =  s.GetActivePointY( mePosLogical );
    }
    s.SetActivePos( 0 );
    while ( s.NextBookmark() ) {
      bmArray[ bmCount ++ ] =  s.GetActivePointY( mePosLogical );
    }
    // 選択範囲を復帰
    s.SetActivePos( anc );
    if ( sCount ) {
      for ( var i = 0; i < sCount; i ++ ) {
        s.AddPos( Sel[i].anc, Sel[i].act );
      }
    }
    else { s.SetActivePos( act, true ); }
    if ( sMode === 2 ) { s.Mode = meModeBox; }
    ScrollX = sx;  ScrollY = sy;
  }

  // 新規『無題』タブにテキストと属性を設定する
  if ( d.Name || dt || ! d.Saved ) {
    editor.NewFile();
    var ad = editor.ActiveDocument;
    if ( ad === d ) {
      var eCount = editors.Count;
      var ee,  ds,  dCount,  dd;
      for ( var i = eCount - 1; i >= 0; i -- ) {
        ee = editors.Item( i );  ds = ee.documents;
        dCount = ds.Count;  dd = ds.Item( ds.Count - 1 );
        if ( dd === ee.ActiveDocument && ! dd.Name && ! dd.Text ) {
          ad = dd;  break;
        }
      }
      if ( ad === d || ad.Name || ad.Text ) {
        Status = "新規『無題』タブを見つけられませんでした。";
        Redraw = true;  return;
      }
    }
    var as = ad.selection;
    ad.Mode = d.Mode;  ad.Encoding = d.Encoding;
    if ( "IndentSize" in d && d.IndentSize ) {
      ad.IndentSize = d.IndentSize;
      ad.IndentStyle = d.IndentStyle;
      ad.InsertFinalNewLine = d.InsertFinalNewLine;
      ad.TrimTrailingWhiteSpace = d.TrimTrailingWhiteSpace;
    }
    if ( wrapMode ) {	// Mery ver 3.1.0a 以降
      ad.MaxLineLength = d.MaxLineLength;
      editor.ExecuteCommandByID( wrapMode );
    }
    // newTabBlank → テキストを貼り付けず、クリップボードにコピー
    if ( newTabBlank ) { ClipboardData.SetData( dt ); }
    else {
      ad.Text = dt;  ad.Saved = true;
      // ブックマーク
      if ( bmCount = bmArray.length ) {
        for ( var i = 0; i < bmCount; i ++ ) {
          as.SetActivePoint( mePosLogical, 1, bmArray[i], false );
          as.SetBookmark();
        }
      }
      as.SetActivePos( anc );
      if ( sCount ) {
        for ( var i = 0; i < sCount; i ++ ) {
          as.AddPos( Sel[i].anc, Sel[i].act );
        }
      }
      else { as.SetActivePos( act, true ); }
      if ( sMode === 2 ) { as.Mode = meModeBox; }
    }
    ad.Saved = newTabSaved;
    ad.ReadOnly = newTabReadOnly;
    Redraw = true;  Sleep( 500 );
    ScrollX = sx;  ScrollY = sy;
  }
} )( newTabReadOnly, newTabSaved, newTabBlank );

メモ[編集]

  • 2020/06/01
このマクロは、「ファイルを読み直す・開きなおす」マクロや「コンパクトメニュー」マクロ用の独自コマンドとしてつくった機能を単独マクロとして切り出したものです。
単独版のマクロにするにあたり、ブックマーク設定の移植コードと EditorConfig 連携プロパティの同期用コードを追加してあります。
( EditorConfig 連携プロパティの同期用コードは、「読みなおし」マクロや「コンパクトメニュー」マクロにもフィードバックする予定)
  • 2020/06/22
・設定項目 newTabSaved newTabBlank を追加
・マルチカーソル選択範囲も複製可(Mery ver 3.0.x ~)
・複数ウインドウモード(SDI/タブ無効)に仮対応
  • 2020/10/30
・Mery ver 3.1.0a 以降で、文書ごとの折り返し設定を同期
スポンサーリンク