sIMple51

身も心も文系エンジニアの徒然。ときどき技術、よくよくガジェット。

サクラエディタで行を入れ替えるマクロを書いた

日頃、IDEとエディタを行き来することが多く、IDEで使い慣れたショートカットがエディタ側になくて
戸惑うことが多かったので、他の方が投稿していたマクロを参考に書いてみました。


Macro/投稿/200 - SakuraEditorWiki

# ここに投稿されてたものが、範囲選択には対応していなかったり、
# ファイルの先頭や末尾で実行した時の挙動がアヤしかったので。。


上に移動させるほう

/*
 * @file   line-up.js
 * @brief  選択範囲のある複数行、もしくはカーソル行を下の行と入れ替える
 * @author nori_51
 * 
 * ・eclipseの[Alt+↑]と同等の動きになるよう作成。
 * 
 */

// ------------------------------------------------------------------------------------
// ファイル編集モード取得
// ------------------------------------------------------------------------------------
function getOpenMode(){
	return Editor.ExpandParameter("${R?r$:$:$}");
}

// ------------------------------------------------------------------------------------
// カーソル位置情報取得
//  現在のカーソル位置を、開始行/開始桁/終了行/終了桁の順の配列で返す。
//  非選択状態の場合は、開始行 = 終了行、開始桁 = 終了桁 となる。
// ------------------------------------------------------------------------------------
function getCursorPosition(){
	if(Editor.IsTextSelected() != 0){
		return [Editor.GetSelectLineFrom(), Editor.GetSelectColmFrom(),
			 Editor.GetSelectLineTo(), Editor.GetSelectColmTo()];

	}else{
		Editor.BeginSelect(0);
		var ret = [Editor.GetSelectLineFrom(), Editor.GetSelectColmFrom(),
			 Editor.GetSelectLineTo(), Editor.GetSelectColmTo()];
		Editor.CancelMode(0);
		return ret;
	}
}

// ------------------------------------------------------------------------------------
// 行入れ替え(上)
// ------------------------------------------------------------------------------------
function moveUp(cursorPosition){

	// 入れ替えを受ける行の内容を取得
	Editor.MoveCursorLayout(cursorPosition[0]-1,1,0);
	var str1 = Editor.GetLineStr(0);

	// 入れ替えを試みる側の内容を取得。選択中の場合は選択範囲が含まれる全行が対象
	Editor.MoveCursorLayout(cursorPosition[0],1,0);
	Editor.BeginSelect();
	for (var i=-1 ; i<cursorPosition[2]-cursorPosition[0] ; i++){
		Editor.Down();
	}
	var str2 = Editor.GetSelectedString(0);

	// カーソルを入れ替え先に移動
	Editor.MoveCursorLayout(cursorPosition[0]-1,1,0);
	
	// 入れ替え先、入れ替え内容ともに選択
	Editor.MoveCursorLayout(cursorPosition[2]+1,1,1);
	
	// 入れ替えた文字列を挿入
	Editor.InsText(str2+str1);
}

// ------------------------------------------------------------------------------------
// カーソル/選択状態の復旧
// ------------------------------------------------------------------------------------
function repair(cursorPosition){
	Editor.MoveCursorLayout(cursorPosition[0],cursorPosition[1],0);
	
	if((cursorPosition[0]!=cursorPosition[2])||(cursorPosition[1]!=cursorPosition[3])){
		Editor.MoveCursorLayout(cursorPosition[2],cursorPosition[3],1);
	}
}
// ------------------------------------------------------------------------------------
// main
// ------------------------------------------------------------------------------------
(function(){

	// 読み取り専用の場合は動作しない
	if (getOpenMode() == "r") return;
	
	// カーソル位置情報
	var cursorPosition = getCursorPosition();
	Editor.SetDrawSwitch(0);
	
	// 選択範囲が最初の行を含んでいる場合、動作しない
	if (cursorPosition[0] <= 1) return;
	moveUp(cursorPosition);

	// cursorPositionの行番号を置換後の値に更新
	cursorPosition[0] = cursorPosition[0]-1;
	cursorPosition[2] = cursorPosition[2]-1;
	
	repair(cursorPosition);
	Editor.SetDrawSwitch(1);
	Editor.ReDraw();
})();

下に移動させるほう

/*
 * @file   line-down.js
 * @brief  選択範囲のある複数行、もしくはカーソル行を下の行と入れ替える
 * @author nori_51
 * 
 * ・eclipseの[Alt+↓]と同等の動きになるよう作成。
 * 
 */

// ------------------------------------------------------------------------------------
// ファイル編集モード取得
// ------------------------------------------------------------------------------------
function getOpenMode(){
	return Editor.ExpandParameter("${R?r$:$:$}");
}

// ------------------------------------------------------------------------------------
// カーソル位置情報取得
//  現在のカーソル位置を、開始行/開始桁/終了行/終了桁の順の配列で返す。
//  非選択状態の場合は、開始行 = 終了行、開始桁 = 終了桁 となる。
// ------------------------------------------------------------------------------------
function getCursorPosition(){
	if(Editor.IsTextSelected() != 0){
		return [Editor.GetSelectLineFrom(), Editor.GetSelectColmFrom(),
			 Editor.GetSelectLineTo(), Editor.GetSelectColmTo()];

	}else{
		Editor.BeginSelect(0);
		var ret = [Editor.GetSelectLineFrom(), Editor.GetSelectColmFrom(),
			 Editor.GetSelectLineTo(), Editor.GetSelectColmTo()];
		Editor.CancelMode(0);
		return ret;
	}
}

// ------------------------------------------------------------------------------------
// 行入れ替え(下)
// ------------------------------------------------------------------------------------
function moveDown(cursorPosition){

	// 入れ替えを受ける行の内容を取得
	Editor.MoveCursorLayout(cursorPosition[2]+1,1,0);
	var str1 = Editor.GetLineStr(0);

	// 入れ替えを試みる側の内容を取得。選択中の場合は選択範囲が含まれる全行が対象
	Editor.MoveCursorLayout(cursorPosition[0],1,0);
	Editor.BeginSelect();
	for (var i=-1 ; i<cursorPosition[2]-cursorPosition[0] ; i++){
		Editor.Down();
	}
	var str2 = Editor.GetSelectedString(0);

	// カーソルを入れ替え先に移動
	Editor.MoveCursorLayout(cursorPosition[0],1,0);
	
	// 入れ替え先、入れ替え内容ともに選択
	Editor.MoveCursorLayout(cursorPosition[2]+2,1,1);
	
	// 入れ替えた文字列を挿入
	Editor.InsText(str1+str2);
}

// ------------------------------------------------------------------------------------
// カーソル/選択状態の復旧
// ------------------------------------------------------------------------------------
function repair(cursorPosition){
	Editor.MoveCursorLayout(cursorPosition[0],cursorPosition[1],0);
	
	if((cursorPosition[0]!=cursorPosition[2])||(cursorPosition[1]!=cursorPosition[3])){
		Editor.MoveCursorLayout(cursorPosition[2],cursorPosition[3],1);
	}
}
// ------------------------------------------------------------------------------------
// main
// ------------------------------------------------------------------------------------
(function(){

	// 読み取り専用の場合は動作しない
	if (getOpenMode() == "r") return;
	
	// カーソル位置情報
	var cursorPosition = getCursorPosition();
	Editor.SetDrawSwitch(0);
	
	// 選択範囲が最後の行 or EOF行を含んでいる場合、動作しない
	if (cursorPosition[2] >= Editor.GetLineCount(0)) return;
	moveDown(cursorPosition);

	// cursorPositionの行番号を置換後の値に更新
	cursorPosition[0] = cursorPosition[0]+1;
	cursorPosition[2] = cursorPosition[2]+1;
	
	repair(cursorPosition);
	Editor.SetDrawSwitch(1);
	Editor.ReDraw();
})();

自分は、これを外部マクロのキー割り当てで「Alt+↑」「Alt+↓」にそれぞれ割り当てて使っています。