それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

行番号ごとコピーするマクロ

ブログにソースコード貼るとき、行番号も合わせて取得したいなと思ってた。なのでマクロかいてみた。行番号をコピーできると、バグ報告にも便利かなぁ。

/**
 * 行番号をつけて、選択範囲をクリップボードにコピーする
 * ブログなどにソースコードを貼り付ける場合に便利。 

 * 行番号つきでソースをブログ投稿や、バグ報告に便利です。
 * 機能としては以下のオプションが選べます。
 * [1]行番号を保持したままコピーと1始まりでコピーの2通りが出来る
 * [2]行番号を0などの任意文字で埋めることが可能です。 

 * @version 1.0
 * @author takuya
 * @see http://d.hatena.ne.jp/takuya_1st/20080208/1202470801
 * @lastmodified 2008/02/08 20:24
 */




//行番号つきでコピー
//ブログなどにソースを貼り付けるときに行番号
//つきでコピーできるように
//選択行の行番号を保持したままコピーと
//1 origin でコピーの二通り


//選択されていなければ何もしない
if(document.selection.IsEmpty){
  Quit();
}
///////////////////////////////////////////////
//クリップボードにコピーする行番号書式設定
///////////////////////////////////////////////
//"0" 行番号をゼロで埋める      ex) 000999
//"#" 行番号を#で埋める         ex) ###999
//" " 行番号をスペースで埋める  ex)    999
//""  行番号の整形をしない      ex) 999
var pad_char = " ";
///////////////////////////////////////////////
///////////////////////////////////////////////


///////////////////////////////////////////////
//クリップボードにコピーする行番号設定
///////////////////////////////////////////////
//行番号を0始まりにする:true
//行番号をそのまま保持する:false
var is_zero_origin = true;
///////////////////////////////////////////////
///////////////////////////////////////////////




///////////////////////////////////////////////
//マクロ開始
///////////////////////////////////////////////
var positions = {};
var src_txt = [];
var formatted_str = "";
//選択範囲の行番号を改行抜きで取得する
positions = SelectionPoint();
//選択範囲の文字を取得
for( var i =positions.start;i<=positions.end;i++){
  src_txt[src_txt.length++] =
    document.GetLine( i ,eeGetLineWithNewLines );
}
//選択範囲の行数の表示桁を計算
line_num = 1+positions.end - positions.start;
line_start = (is_zero_origin) ? 1 : 
positions.start;
line_digit = (is_zero_origin) ?
  line_num.toString().length : 
positions.end.toString().length;

for( i in src_txt ){
  formatted_str +=
    formatNum( line_start++, line_digit, 
pad_char )
    + ":"+src_txt[i];
}
//クリップボードにテキストをセット
clipboardData.setData( "Text", formatted_str );
//終了


////////////////////////////////
//数値をフォーマット
//num 数値
//digit 桁数
//pad 埋める文字
////////////////////////////////
function formatNum( num, digit, pad ){
  var str="";
  num = num.toString();
  for( var i=0;i<  digit-num.length; i++ ){
    str+=pad;
  }
  return str+num;
}
////////////////////////////////
//選択範囲の位置を計算して改行のみの選択を除外する
////////////////////////////////
function SelectionPoint(){
  //選択範囲の行番号を取得
  start = document.selection.GetTopPointY( 
eePosLogical );
  end   = document.selection.GetBottomPointY( 
eePosLogical );
  //上から下へカーソルが行頭にある場合
  //行頭の行番号を含めない
  end = ( 
document.selection.GetBottomPointX(eePosLogical) 
== 1 )
        ? end-1 : end;
  //下から上へ選択していてカーソルが行末にある場合
  //行末の行番号を含めない
  start = ( 
document.selection.GetTopPointX(eePosLogical)-1
           == document.GetLine(start).length )
          ? start+1 : start;
  return { "start":start, "end":end };
}