Entry

行頭に論理行を付加してコピーを実行するEmEditorマクロ

テキストエディタEmEditorのマクロを作成。

CopyWithLogicalLineNumber

EmEditor上で、開いたテキストを選択した状態から本マクロを使用すると、クリップボードに論理行を付加してコピーされるという仕組み。以下にソースコード&例を示す。

実行前の状態

// 開始・終了位置
var startX = document.selection.GetTopPointX(eePosLogical);
var startY = document.selection.GetTopPointY(eePosLogical);
var endX   = document.selection.GetBottomPointX(eePosLogical);
var endY   = document.selection.GetBottomPointY(eePosLogical);

// 指定幅、指定文字で桁揃え
Object.prototype.pad = function(width, padChar) {
var strLength = this.toString().length;
if (strLength >= width || padChar == null) return this;

var outputStr = "";
var padLength = width - strLength;
for (var i = 0; i < padLength; i++){
outputStr += padChar;
}

return outputStr + this;
}



// 出力文字列
var outputText = "";

// 初期位置設定
document.selection.SetActivePoint(eePosLogical, startX, startY, true);
// 選択解除
document.selection.Collapse();

// 選択範囲を行ごとに処理
for (var i = startY; i <= endY; i++) {
var left = document.selection.StartOfLine(false, eeLineLogical);  // 1行選択範囲の左位置
var right = document.selection.EndOfLine(false, eeLineLogical); // 1行選択範囲の右位置

// 1行選択
document.selection.SelectLine();

// 選択開始行
if (i == startY) {
left = startX;
document.selection.SetAnchorPoint(eePosLogical, left, i);
}
// 選択終了行
if (i == endY) {
right = endX;
document.selection.SetActivePoint(eePosLogical, right, i, true);
// 最終行が空文字の場合処理を終了
if (document.selection.Text.length == 0) break;
}

// 出力テキスト設定
outputText +=
i.pad(PAD_WIDTH, PAD_CHAR) +
SEPARATE_CHAR +
document.selection.Text;

document.selection.Collapse();
}

// クリップボードにコピー
clipboardData.setData("Text", outputText);

実行後のクリップボード中身

  1 : // 開始・終了位置
2 : var startX = document.selection.GetTopPointX(eePosLogical);
3 : var startY = document.selection.GetTopPointY(eePosLogical);
4 : var endX   = document.selection.GetBottomPointX(eePosLogical);
5 : var endY   = document.selection.GetBottomPointY(eePosLogical);
6 :
7 : // 指定幅、指定文字で桁揃え
8 : Object.prototype.pad = function(width, padChar) {
9 : 	var strLength = this.toString().length;
10 : 	if (strLength >= width || padChar == null) return this;
11 :
12 : 	var outputStr = "";
13 : 	var padLength = width - strLength;
14 : 	for (var i = 0; i < padLength; i++){
15 : 		outputStr += padChar;
16 : 	}
17 :
18 : 	return outputStr + this;
19 : }
20 :
21 :
22 :
23 : // 出力文字列
24 : var outputText = "";
25 :
26 : // 初期位置設定
27 : document.selection.SetActivePoint(eePosLogical, startX, startY, true);
28 : // 選択解除
29 : document.selection.Collapse();
30 :
31 : // 選択範囲を行ごとに処理
32 : for (var i = startY; i <= endY; i++) {
33 : 	var left = document.selection.StartOfLine(false, eeLineLogical);  // 1行選択範囲の左位置
34 : 	var right = document.selection.EndOfLine(false, eeLineLogical); // 1行選択範囲の右位置
35 :
36 : 	// 1行選択
37 : 	document.selection.SelectLine();
38 :
39 : 	// 選択開始行
40 : 	if (i == startY) {
41 : 		left = startX;
42 : 		document.selection.SetAnchorPoint(eePosLogical, left, i);
43 : 	}
44 : 	// 選択終了行
45 : 	if (i == endY) {
46 : 		right = endX;
47 : 		document.selection.SetActivePoint(eePosLogical, right, i, true);
48 : 		// 最終行が空文字の場合処理を終了
49 : 		if (document.selection.Text.length == 0) break;
50 : 	}
51 :
52 : 	// 出力テキスト設定
53 : 	outputText +=
54 : 		i.pad(PAD_WIDTH, PAD_CHAR) +
55 : 		SEPARATE_CHAR +
56 : 		document.selection.Text;
57 :
58 : 	document.selection.Collapse();
59 : }
60 :
61 : // クリップボードにコピー
62 : clipboardData.setData("Text", outputText);

それだけ。EmEditorの標準機能にあるかと思ってたら、どうにも見あたらなかったので作ってしまった。簡単だと思ってたら、私の技術力では大変に時間がかかりました…。
ちなみに、表示行には未対応。だって使い道が無いんだもの。

なお、

var PAD_WIDTH     = 3;     // 行番号の最小桁数。
var PAD_CHAR      = " ";   // 最小桁以下の場合、行番号の先頭を埋める文字。
var SEPARATE_CHAR = " : "; // 行番号と内容の間に入れる文字。

この辺をいじると多少カスタマイズができる。

追記

Number"がNunber"になってた…馬鹿。

Melog: Works > Junk > EmEditor マクロ

こちらに移動。


Comments (0 件)

コメントを残す

メールアドレスが公開されることはありません。