「行を複製 (複数行可)」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
ソースコードを更新
Sukemaru (トーク | 投稿記録)
更新。ZIP をアップロード
5行目: 5行目:
* ルーラーの行番号のドラッグでの複数行選択やトリプルクリックでの行選択などで、選択範囲の末尾に改行が含まれているばあい、さいごの改行を無視します。
* ルーラーの行番号のドラッグでの複数行選択やトリプルクリックでの行選択などで、選択範囲の末尾に改行が含まれているばあい、さいごの改行を無視します。


== ダウンロード ==
「[[ファイル:行を複製.zip]]」(アイコン入り)


== ソースコード ==
== ソースコード ==
15行目: 18行目:


/**
/**
  * 2018/08/12 - 2019/03/28
  * 2018/08/12 - 2019/05/07
  *  
  *  
  * 選択範囲を拡張してカーソル行(論理行)を "複製" する (複数行可)
  * カーソル行、または選択範囲を含む行全体を "複製" する (論理行単位、複数行可)
  *
  *
  * 文書終端の空行 ( ^[EOF] ) を選択範囲の末尾にぶら下げての "複製" はできるが、
  * 文書終端の空行 ( ^[EOF] ) を選択範囲の末尾にぶら下げての "複製" はできるが、
25行目: 28行目:
  *  または "末尾 ( [EOF] マークの直前) にあるか" で判別する。
  *  または "末尾 ( [EOF] マークの直前) にあるか" で判別する。
  *
  *
  *  文字列または行番号をドラッグ(または "クリック & Shift+クリック" )して
  *  文字列または行番号をドラッグ(または"クリック & Shift+クリック")して
  *  選択範囲を確定するさいに
  *  選択範囲を確定するさいに
  *  ・上から下にむけて選択範囲をつくった場合 → 終端の空行 ( ^[EOF] ) を含める
  *  ・上から下にむけて選択範囲をつくった場合 → 終端の空行 ( ^[EOF] ) を含める
  *  ・下から上にむけて選択範囲をつくった場合 → 終端の空行 ( ^[EOF] ) を含めない
  *  ・下から上にむけて選択範囲をつくった場合 → 終端の空行 ( ^[EOF] ) を含めない
  *
  *
* ※ 文書終端の空行を含めているか否かで実行後のキャレットの位置をかえているのは、
*    連続で実行するさいに同じ範囲を選択状態にして複製するための仕様
*
* 1行だけの複製なら
* document.selection.DuplicateLine();
  */
  */


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


// ■ 複製先 ( 2018/12/26 追加 )
// ■複製後の選択範囲
var duplicateDown = true; // (下に:true 上に:false)
var duplicateDown = true; // (下の行:true 上の行:false)


// ■ 複数行選択のとき、ブックマークを維持するか?
var preferBookmark = true;
  // false ならブックマークは解除されるが、アンドゥしても選択範囲を維持する
  // true  ならアンドゥすると選択範囲が解除されるが、ブックマークを維持する
  // ※いずれの場合もブックマークは上の行に残す


var s = document.selection
// ---------- ▲ 設定項目 ▲ ----------


// 選択範囲の各座標を取得
// var tx = s.GetTopPointX( mePosLogical );
var ty = s.GetTopPointY( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
var by = s.GetBottomPointY( mePosLogical );
var ey = document.GetLines( 0 ); // 文書終端行の Y


// 選択範囲の末尾が終端の空行 ( ^[EOF] ) にあるときの調整用
var d = editor.ActiveDocument;
var eof = ( ty < by && bx == 1 && ! document.Text.charAt( s.GetActivePos() ) )
var s = editor.ActiveDocument.selection;
              ? "\n" // カーソル位置に文字がないばあいを [EOF] と判定する
              : "";


// 選択範囲の末尾が行頭にあるときの調整
if ( d.ReadOnly ) {
if ( ty < by && bx == 1 ) {
   Status = " ドキュメントは書き換え禁止です。";
   by --;
}
}


// 選択範囲の拡張
else {
s.SetActivePoint( mePosLogical, 1, by );
  Redraw = false;
s.EndOfLine( false, mePosLogical );
s.SetAnchorPoint( mePosLogical, 1, ty );


// 選択範囲の文字列を取得
  // 選択範囲の各座標を取得
var st = s.Text;
  var ty = s.GetTopPointY( mePosLogical );
  var bx = s.GetBottomPointX( mePosLogical );
  var by = s.GetBottomPointY( mePosLogical );
  var ey = d.GetLines( 0 );
  // 選択範囲の末尾が終端の空行 ( ^[EOF] ) にあるときの調整用
  var eof = ( ty < by && bx == 1 && ! d.Text.charAt( s.GetActivePos() ) )
          ? "\n" // カーソル位置に文字がないばあいを [EOF] と判定する
          : "";
  // 選択範囲の末尾が行頭にあるときの調整
  if ( ty < by && bx == 1 ) {
    by --;
  }
  // 選択範囲の拡張
  s.SetActivePoint( mePosLogical, 1, by );
  s.EndOfLine( false, mePosLogical );
  s.SetAnchorPoint( mePosLogical, 1, ty );


// カーソル位置は複製した行の末尾
  // 選択範囲に改行を追加して複製
// s.Text = st + eof + "\n" + st; // ( 2019/03/28 コメントアウト )
  var st = s.Text;


  if ( preferBookmark ) {
    s.Collapse( meCollapseEnd );
    s.Text = eof + "\n" + st;
  }
  else {
    s.Text = st + eof + "\n" + st;
  }


// ■「下に複製」した行全体を範囲選択する
  // ■下に複製した行全体を範囲選択する
 
  // ※文書終端の空行を含めているか否かで実行後のキャレットの位置をかえているのは
if ( duplicateDown ) { // ( 2018/12/26 オプションフラグを追加 )
   //  連続で実行するさいに同じ範囲を選択状態にして複製させるための仕様
   s.Collapse( meCollapseEnd ); // ( 2019/03/28 追加 )
   if ( duplicateDown ) {
   s.Text = eof + "\n" + st; // ( 2019/03/28 追加 )
 
   if ( eof.length ) {
     // 終端の空行をふくめて複製した場合 → カーソル位置は選択範囲の末尾
     // 終端の空行をふくめて複製した場合 → カーソル位置は選択範囲の末尾
     s.SetActivePoint( mePosLogical, 1, by + 2 );
     if ( eof.length ) {
    s.EndOfDocument( true );
      s.SetActivePoint( mePosLogical, 1, by + 2 ); // (eof+"\n").length = 2
  }
      s.EndOfDocument( true );
  else {
    }
     // 通常の行の複製の場合 → カーソル位置は選択範囲の先頭
     // 通常の行の複製の場合 → カーソル位置は選択範囲の先頭
     s.SetAnchorPos( s.GetActivePos() + 1 );
     else {
    s.SetActivePoint( mePosLogical, 1, by + 1, true );
      s.SetAnchorPos( s.GetActivePos() + 1 );
      s.SetActivePoint( mePosLogical, 1, by + 1, true );
    }
   }
   }
}


 
   // ■上に複製した行全体を範囲選択する
// ■「上に複製」した行全体を範囲選択する ( 2018/12/26 追加 )
   else {
 
else {
   s.Collapse( meCollapseStart ); // ( 2019/03/28 追加 )
   s.Text = st + eof + "\n"; // ( 2019/03/28 追加 )
 
  if ( ty == ey && ! st.length ) {
     // 終端の空行だけを複製した場合 → 範囲選択なし
     // 終端の空行だけを複製した場合 → 範囲選択なし
     s.SetActivePos( s.GetActivePos() - 1 );
     if ( ty == ey && ! st.length ) {
  }
      s.SetActivePos( s.GetActivePos() - 1 );
  else {
    }
     // 通常の行の複製の場合 → カーソル位置は選択範囲の末尾
     // 通常の行の複製の場合 → カーソル位置は選択範囲の末尾
     s.SetAnchorPoint( mePosLogical, 1, ty );
     else {
    s.SetActivePoint( mePosLogical, 1, by + 1, true );
      s.SetAnchorPoint( mePosLogical, 1, ty );
    if ( eof.length ) {
      s.SetActivePoint( mePosLogical, 1, by + 1, true );
      // 終端の空行をふくめて複製した場合 → カーソル位置は選択範囲の末尾
      // 終端の空行をふくめて複製した場合
      s.SetActivePos( s.GetActivePos() + 1, true );
      if ( eof.length ) {
        s.SetActivePos( s.GetActivePos() + 1, true ); // eof.length = 1
      }
     }
     }
   }
   }
  Redraw = true;
}
}
</source>
</source>
122行目: 132行目:
: "上に複製" するためのオプションフラグを追加(デフォルトで "下に複製" )
: "上に複製" するためのオプションフラグを追加(デフォルトで "下に複製" )
: 以前のコードでは "ブックマークの位置がズレる" 問題があったので、動作仕様を変更
: 以前のコードでは "ブックマークの位置がズレる" 問題があったので、動作仕様を変更
* 2019/05/07 (sukemaru)
: 従来の「アンドゥしたら範囲選択状態が残る」ほうが良いという人もいるかもしれないので、項目設定にオプションを追加しました。「preferBookmark = false」が従来版の動作ですが、複数行で「複製」を実行した場合にはブックマーク設定がズレたり消えたりします。

2019年5月7日 (火) 23:13時点における版

選択範囲がないばあいはカーソル位置の論理行を、選択範囲があるばあいは選択範囲をふくむ論理行全体(複数行可)を、下または上に複製します。

  • 行の途中からべつの行の途中までのような大ざっぱな範囲選択状態から「行の複製」を実行することを想定しています。
  • ルーラーの行番号のドラッグでの複数行選択やトリプルクリックでの行選択などで、選択範囲の末尾に改行が含まれているばあい、さいごの改行を無視します。

ダウンロード

ファイル:行を複製.zip」(アイコン入り)

ソースコード

#title = "行を複製 (複数行可)"
#tooltip = "選択範囲(複数行可)の論理行を複製する"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",222
// 上向きの矢印のアイコンのインデックスは 223

/**
 * 2018/08/12 - 2019/05/07
 * 
 * カーソル行、または選択範囲を含む行全体を "複製" する (論理行単位、複数行可)
 *
 * 文書終端の空行 ( ^[EOF] ) を選択範囲の末尾にぶら下げての "複製" はできるが、
 * 可否について条件あり。
 *
 *   選択範囲の確定時点でのキャレットの位置が "選択範囲の先頭にあるか"
 *   または "末尾 ( [EOF] マークの直前) にあるか" で判別する。
 *
 *   文字列または行番号をドラッグ(または"クリック & Shift+クリック")して
 *   選択範囲を確定するさいに
 *   ・上から下にむけて選択範囲をつくった場合 → 終端の空行 ( ^[EOF] ) を含める
 *   ・下から上にむけて選択範囲をつくった場合 → 終端の空行 ( ^[EOF] ) を含めない
 *
 */

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

// ■複製後の選択範囲
var duplicateDown = true;	// (下の行:true / 上の行:false)

// ■ 複数行選択のとき、ブックマークを維持するか?
var preferBookmark = true;
  // false ならブックマークは解除されるが、アンドゥしても選択範囲を維持する
  // true  ならアンドゥすると選択範囲が解除されるが、ブックマークを維持する
  // ※いずれの場合もブックマークは上の行に残す

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


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

if ( d.ReadOnly ) {
  Status = " ドキュメントは書き換え禁止です。";
}

else {
  Redraw = false;

  // 選択範囲の各座標を取得
  var ty = s.GetTopPointY( mePosLogical );
  var bx = s.GetBottomPointX( mePosLogical );
  var by = s.GetBottomPointY( mePosLogical );
  var ey = d.GetLines( 0 );
  // 選択範囲の末尾が終端の空行 ( ^[EOF] ) にあるときの調整用
  var eof = ( ty < by && bx == 1 && ! d.Text.charAt( s.GetActivePos() ) )
          ? "\n"	// カーソル位置に文字がないばあいを [EOF] と判定する
          : "";
  // 選択範囲の末尾が行頭にあるときの調整
  if ( ty < by && bx == 1 ) {
    by --;
  }
  // 選択範囲の拡張
  s.SetActivePoint( mePosLogical, 1, by );
  s.EndOfLine( false, mePosLogical );
  s.SetAnchorPoint( mePosLogical, 1, ty );

  // 選択範囲に改行を追加して複製
  var st = s.Text;

  if ( preferBookmark ) {
    s.Collapse( meCollapseEnd );
    s.Text = eof + "\n" + st;
  }
  else {
    s.Text = st + eof + "\n" + st;
  }

  // ■下に複製した行全体を範囲選択する
  // ※文書終端の空行を含めているか否かで実行後のキャレットの位置をかえているのは
  //   連続で実行するさいに同じ範囲を選択状態にして複製させるための仕様
  if ( duplicateDown ) {
    // 終端の空行をふくめて複製した場合 → カーソル位置は選択範囲の末尾
    if ( eof.length ) {
      s.SetActivePoint( mePosLogical, 1, by + 2 );	// (eof+"\n").length = 2
      s.EndOfDocument( true );
    }
    // 通常の行の複製の場合 → カーソル位置は選択範囲の先頭
    else {
      s.SetAnchorPos( s.GetActivePos() + 1 );
      s.SetActivePoint( mePosLogical, 1, by + 1, true );
    }
  }

  // ■上に複製した行全体を範囲選択する
  else {
    // 終端の空行だけを複製した場合 → 範囲選択なし
    if ( ty == ey && ! st.length ) {
      s.SetActivePos( s.GetActivePos() - 1 );
    }
    // 通常の行の複製の場合  → カーソル位置は選択範囲の末尾
    else {
      s.SetAnchorPoint( mePosLogical, 1, ty );
      s.SetActivePoint( mePosLogical, 1, by + 1, true );
      // 終端の空行をふくめて複製した場合
      if ( eof.length ) {
        s.SetActivePos( s.GetActivePos() + 1, true );	// eof.length = 1
      }
    }
  }
  Redraw = true;
}


メモ

  • 文書終端の空行(EOF マークのみの行)を含めているかいないかで「行の複製」マクロ実行後のキャレット(入力カーソル)の位置をかえているのは、連続で「行の複製」を実行するさいに同じ範囲を選択状態にして複製させるための仕様です。
  • 2019/03/28 (sukemaru)
"上に複製" するためのオプションフラグを追加(デフォルトで "下に複製" )
以前のコードでは "ブックマークの位置がズレる" 問題があったので、動作仕様を変更
  • 2019/05/07 (sukemaru)
従来の「アンドゥしたら範囲選択状態が残る」ほうが良いという人もいるかもしれないので、項目設定にオプションを追加しました。「preferBookmark = false」が従来版の動作ですが、複数行で「複製」を実行した場合にはブックマーク設定がズレたり消えたりします。
スポンサーリンク