【サクラエディタ/マクロ】選択した範囲を()で囲む


業務でsakuraエディタを使用しているのですが、統合開発環境によくある機能で、sakuraエディタにあったら便利かなということで、表題のマクロを作成しました。

共通の処理についてはファイル分割し、囲む文字を変えたマクロを簡単に追加できるようにしています。

sakuraエディタで自作したマクロを登録する方法については【サクラエディタ/マクロ】自作したマクロをキーに割り当てるをご覧ください。

目次

共通処理(文字の挿入)

共通処理の関数宣言を記載したファイルを用意します。

// 選択範囲を指定した文字で囲む
function _SurroundWith(beginChar, endChar) {
	// 範囲選択していない場合は初めの文字のみ挿入
	if (!IsTextSelected()) {
		InsText(beginChar);
		return;
	}

	var lineFrom = GetSelectLineFrom();
	var lineTo = GetSelectLineTo();
	var columnTo = GetSelectColmTo();

	Left();
	InsText(beginChar);
	var index = LineColumnToIndex(lineTo, columnTo)
		+ (lineFrom == lineTo ? beginChar.length : 0); // 挿入した文字数分だけindexを追加
	MoveCursor(lineTo, index, 0);
	InsText(endChar);
}

※GetSelectColm*** を使用してゴニョゴニョしたい場合は、MoveCursor(columnを文字数として認識)とMoveCursorLayout(columnをレイアウト座標として認識)の違いに注意が必要です。

囲む文字を指定する

共通処理を記載したファイルを読み込み、囲みたい文字を指定して呼び出します。

// 選択範囲を()で囲む
InsertParentheses = function() {
	// 共通関数を記載したファイルを読み込む
	var stream = new ActiveXObject("ADODB.Stream");
	stream.Charset = "UTF-8"; // 共通関数を記載したファイルの文字セット
	stream.open();

	var includeFile = ExpandParameter("$M").replace(/[^\\]+$/, "_SurroundWith.js");
	stream.LoadFromFile(includeFile);
	eval(stream.ReadText());
	stream.close();

	// 共通関数呼び出し
	_SurroundWith("(", ")");
}; InsertParentheses();

上記のファイルをマクロに登録して、キーに割り当てれば使用することができます。ファイル読み込みに”ADODB.Stream”を使用していますが、ここでの説明は割愛します。

共通関数の実引数を変えるだけで、囲む文字を変更することができます。

eval と Function について

ここでは、ファイルから読み込んだ関数宣言の文字列を eval に食わせて、共通処理の関数を呼び出せるようにしていますが、「何でもできちゃうし、セキュリティ上危ないから使うな」と非推奨になっているみたいです。代わりに Function の使用が推奨されています。

ただ、ローカルで使う分には eval に食わせる文字列が変えられる危険はないのと、Function を使うと引数名の依存が増えちゃうので、 eval を使用しています。

一応、Function を使用したバージョンも。

// @brief 選択範囲を指定した文字で囲む
// @note Functionオブジェクトで使用する想定
// 引数には、"beginChar" と "endChar" の指定が必須

// 範囲選択していない場合は初めの文字のみ挿入
if (!IsTextSelected()) {
	InsText(beginChar);
	return;
}

var lineFrom = GetSelectLineFrom();
var lineTo = GetSelectLineTo();
var columnTo = GetSelectColmTo();

Left();
InsText(beginChar);
var index = LineColumnToIndex(lineTo, columnTo)
		+ (lineFrom == lineTo ? beginChar.length : 0); // 挿入した文字数分だけ後ろに移動
MoveCursor(lineTo, index, 0);
InsText(endChar);
// 選択範囲を()で囲む
InsertParentheses = function() {
	// 共通関数を記載したファイルを読み込む
	var stream = new ActiveXObject("ADODB.Stream");
	stream.Charset = "UTF-8"; // 共通関数を記載したファイルの文字セット
	stream.open();

	var includeFile = ExpandParameter("$M").replace(/[^\\]+$/, "_SurroundWith.js");
	stream.LoadFromFile(includeFile);
	var surroundWith = new Function("beginChar", "endChar", stream.ReadText());
	stream.close();

	// 共通関数呼び出し
	surroundWith("(", ")");
}; InsertParentheses();

ぜひ活用してみてください。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です