サクラエディタで行を入れ替えるマクロを書いた
日頃、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+↓」にそれぞれ割り当てて使っています。