「字下げ・字上げ」の版間の差分
→sukemaru 版: ソースコードから Quit() メソッドを削除。ZIP を差し替え |
|||
| 74行目: | 74行目: | ||
= sukemaru 版 = | = sukemaru 版 = | ||
<br> | <br> | ||
ダウンロード: 「[[ファイル:字下げ/字上げ.zip]] | '''ダウンロード:''' 「[[ファイル:字下げ/字上げ.zip]](アイコン入り)」 最終更新: 2019/04/07 | ||
* [[#字下げ(スペース×2 追加)|スペース×2 追加]].js | |||
* [[#字上げ(スペース×2 削除)|スペース×2 削除]].js | |||
* [[#インデント|インデント]].js | |||
* [[#逆インデント|アンインデント]].js | |||
それぞれ専用の「マテリアルデザインっぽいアイコン」を同梱 | |||
== 字下げ(スペース×2 追加) == | == 字下げ(スペース×2 追加) == | ||
スペース×2 追加.js | ;スペース×2 追加.js | ||
<br> | <br> | ||
キャレットまたは選択範囲をふくむ論理行の各先頭に「半角スペース×2」を追加します。 | キャレットまたは選択範囲をふくむ論理行の各先頭に「半角スペース×2」を追加します。 | ||
| 87行目: | 91行目: | ||
* 選択範囲が末尾に改行を含んでいた場合は、最後の改行を無視します。 | * 選択範囲が末尾に改行を含んでいた場合は、最後の改行を無視します。 | ||
<source lang="javascript"> | <source lang="javascript" style="height:40em; overflow:auto;"> | ||
#title = "字下げ" | #title = "字下げ" | ||
#tooltip = "スペース×2 追加" | #tooltip = "スペース×2 追加" | ||
| 107行目: | 111行目: | ||
// "選択範囲なし" のフラグ | // "選択範囲なし" のフラグ | ||
var pos = | var pos = s.IsEmpty ? s.GetActivePos() : ""; | ||
// キャレット位置に「タブ文字×1」を挿入して終了するパターン | // キャレット位置に「タブ文字×1」を挿入して終了するパターン | ||
if ( pos && tabEnable > 1 ) { // tabEnable == 2 | if ( pos && tabEnable > 1 ) { // tabEnable == 2 | ||
s.Text = "\t" | s.Text = "\t"; | ||
} | } | ||
else { | |||
var sx = ScrollX, sy = ScrollY; | |||
// 選択範囲を取得 | |||
// 選択範囲を取得 | var ty = s.GetTopPointY( mePosLogical ); | ||
var ty = s.GetTopPointY( mePosLogical ); | var bx = s.GetBottomPointX( mePosLogical ); | ||
var bx = s.GetBottomPointX( mePosLogical ); | var by = s.GetBottomPointY( mePosLogical ); | ||
var by = s.GetBottomPointY( mePosLogical ); | // 選択範囲を拡張 | ||
// 選択範囲を拡張 | if ( by != ty && bx == 1 ) { | ||
if ( by != ty && bx == 1 ) | by -= 1; | ||
} | |||
s.SetActivePoint( mePosLogical, 1, by ); | s.SetActivePoint( mePosLogical, 1, by ); | ||
s.EndOfLine( false, mePosLogical ); | s.EndOfLine( false, mePosLogical ); | ||
s.SetAnchorPoint( mePosLogical, 1, ty ); | s.SetAnchorPoint( mePosLogical, 1, ty ); | ||
// 選択範囲の文字列を取得 | // 選択範囲の文字列を取得 | ||
var st = s.Text; | var st = s.Text; | ||
// 最初に選択範囲がなかった場合は、行頭に「タブ文字×1」を追加 | // 最初に選択範囲がなかった場合は、行頭に「タブ文字×1」を追加 | ||
if ( pos && tabEnable == 1 ) { | if ( pos && tabEnable == 1 ) { | ||
var tab = "\t"; | |||
s.Text = InsertSpace( st, tab ); | |||
s.SetActivePos( pos + tab.length ); // 範囲選択を残さない | |||
} | } | ||
// 選択範囲があった場合は、行頭に「半角スペース×2」を追加(空行は無視) | // 選択範囲があった場合は、行頭に「半角スペース×2」を追加(空行は無視) | ||
else { // ( ! pos || tabEnable == 0 ) | else { // ( ! pos || tabEnable == 0 ) | ||
var t = InsertSpace( st, blank ); | |||
if ( t != st ) { | |||
s.Text = t; | |||
} | |||
if ( pos ) { // 範囲選択を残さない | |||
s.SetActivePos( pos + ( t.length - st.length ) ); | |||
} | |||
else { // 範囲選択を残す | |||
s.SetActivePoint( mePosLogical, 1, by + 1 ); | |||
s.SetAnchorPoint( mePosLogical, 1, ty ); | |||
} | |||
} | } | ||
ScrollX = sx; ScrollY = sy; | |||
} | } | ||
// 「引用の追加」マクロより拝借 | // 「引用の追加」マクロより拝借 | ||
| 159行目: | 168行目: | ||
} | } | ||
</source> | </source> | ||
== 字上げ(スペース×2 削除) == | == 字上げ(スペース×2 削除) == | ||
スペース×2 削除.js | ;スペース×2 削除.js | ||
<br> | <br> | ||
キャレットまたは選択範囲をふくむ論理行の各先頭から「半角スペース×2」を削除します。 | キャレットまたは選択範囲をふくむ論理行の各先頭から「半角スペース×2」を削除します。 | ||
| 173行目: | 183行目: | ||
「字上げ」マクロなら、削除対象に「空白文字」以外の任意の "文字列" や "記号" なども追加できます。 | 「字上げ」マクロなら、削除対象に「空白文字」以外の任意の "文字列" や "記号" なども追加できます。 | ||
<source lang="javascript"> | <source lang="javascript" style="height:40em; overflow:auto;"> | ||
#title = "字上げ" | #title = "字上げ" | ||
#tooltip = "スペース×2 削除" | #tooltip = "スペース×2 削除" | ||
| 198行目: | 208行目: | ||
// "選択範囲なし" のフラグ | // "選択範囲なし" のフラグ | ||
var pos = | var pos = s.IsEmpty ? s.GetActivePos() : ""; | ||
// キャレット付近の「タブ文字×1」を優先的に削除するパターン | // キャレット付近の「タブ文字×1」を優先的に削除するパターン | ||
var isDone = false; | |||
if ( pos && nearestTab ) { | if ( pos && nearestTab ) { | ||
if ( document.Text.charAt( pos - 1 ) == "\t" ) { | if ( document.Text.charAt( pos - 1 ) == "\t" ) { | ||
s.DeleteLeft(); | s.DeleteLeft(); | ||
isDone = true; | |||
} | } | ||
else if ( document.Text.charAt( pos ) == "\t" ) { | else if ( document.Text.charAt( pos ) == "\t" ) { | ||
s.Delete(); | s.Delete(); | ||
isDone = true; | |||
} | } | ||
} | } | ||
if ( ! isDone ) { | |||
var sx = ScrollX, sy = ScrollY; | |||
var | // 選択範囲を取得 | ||
var ty = s.GetTopPointY( mePosLogical ); | |||
var by = s.GetBottomPointY( mePosLogical ); | |||
var bx = s.GetBottomPointX( mePosLogical ); | |||
// 選択範囲を拡張 | |||
if ( by != ty && bx == 1 ) { | |||
by -= 1; | |||
} | |||
s.SetActivePoint( mePosLogical, 1, by ); | |||
s.EndOfLine( false, mePosLogical ); | |||
s.SetAnchorPoint( mePosLogical, 1, ty ); | |||
// 選択範囲の文字列を取得 | |||
var st = s.Text; | |||
// | // 行頭の空白文字を削除 | ||
var | var t = DeleteSpace( st, blank ); | ||
if ( t != st ) { | |||
s.Text = t; | |||
} | |||
if ( | |||
s. | |||
if ( pos ) { // 範囲選択を残さない | |||
s.SetActivePos( pos - ( st.length - t.length ) ); | |||
} | |||
else { // 範囲選択を残す | |||
s.SetActivePoint( mePosLogical, 1, by + 1 ); | |||
if ( pos ) // 範囲選択を残さない | s.SetAnchorPoint( mePosLogical, 1, ty ); | ||
} | |||
else { // 範囲選択を残す | ScrollX = sx; ScrollY = sy; | ||
} | } | ||
// 「引用の追加」マクロより拝借 | // 「引用の追加」マクロより拝借 | ||
| 254行目: | 271行目: | ||
} | } | ||
</source> | </source> | ||
== インデント == | == インデント == | ||
インデント.js <br> | ;インデント.js <br> | ||
既存のツールバーアイコンのアイテム「インデント」から置きかえて使う目的のマクロで、<span style="color:#c00;">選択範囲がなくてもタブインデント</span>します。 <br> ソースコードの内容は「字上げ(スペース×2 追加)」マクロとほぼ同じですが、こちらの「インデント」マクロの場合は、挿入する空白は「タブ文字」のみで空白行にたいしてもインデントを追加します。 | 既存のツールバーアイコンのアイテム「インデント」から置きかえて使う目的のマクロで、<span style="color:#c00;">選択範囲がなくてもタブインデント</span>します。 <br> ソースコードの内容は「字上げ(スペース×2 追加)」マクロとほぼ同じですが、こちらの「インデント」マクロの場合は、挿入する空白は「タブ文字」のみで空白行にたいしてもインデントを追加します。 | ||
* 論理行全体をタブインデント(行頭)して範囲選択します。 <br> 選択範囲が1行内ならもとの選択範囲を維持し、複数行なら対象の論理行全体を範囲選択します。 | * 論理行全体をタブインデント(行頭)して範囲選択します。 <br> 選択範囲が1行内ならもとの選択範囲を維持し、複数行なら対象の論理行全体を範囲選択します。 | ||
| 265行目: | 283行目: | ||
【推奨設定】 Tab キーに割りあてるなら ''tabEnable = 2'' , ツールバーアイコンにするなら ''tabEnable = 0'' | 【推奨設定】 Tab キーに割りあてるなら ''tabEnable = 2'' , ツールバーアイコンにするなら ''tabEnable = 0'' | ||
<source lang="javascript"> | <source lang="javascript" style="height:40em; overflow:auto;"> | ||
#title = "インデント" | #title = "インデント" | ||
#tooltip = "選択範囲がなくてもインデント" | #tooltip = "選択範囲がなくてもインデント" | ||
| 300行目: | 318行目: | ||
// カーソル位置にタブを挿入して終了するパターン | // カーソル位置にタブを挿入して終了するパターン | ||
if ( ( s.IsEmpty && tabEnable == 1 ) || ( tabEnable == 2 && ty == by ) || tabEnable == 3 ) { | if ( ( s.IsEmpty && tabEnable == 1 ) || ( tabEnable == 2 && ty == by ) || tabEnable == 3 ) { | ||
s.Text = "\t" | s.Text = "\t"; | ||
} | } | ||
else { | |||
// 選択範囲を拡張 | |||
if ( ty != by && bx == 1 ) { | |||
y --; // 選択範囲の末尾が行頭 x = 1 にあるときの調整 | |||
} | |||
s.SetActivePoint( mePosLogical, 1, y ); | |||
s.EndOfLine( false, mePosLogical ); | |||
s.SetAnchorPoint( mePosLogical, 1, ty ); | |||
var st = s.Text; | |||
// | // インデント | ||
s.Text = st.replace( /^/gm , "\t" ); | |||
s. | |||
// | // 選択範囲を復元 | ||
s. | if ( ty == by ) { | ||
s.SetActivePos( act + 1 ); | |||
s.SetAnchorPos( anc + 1 ); | |||
} | |||
else { | |||
s.SetActivePos( s.GetActivePos() + 1 ); | |||
s.SetAnchorPoint( mePosLogical, 1, ty ); | |||
} | |||
} | |||
ScrollX = sx; ScrollY = sy; | ScrollX = sx; ScrollY = sy; | ||
</source> | </source> | ||
== 逆インデント == | == 逆インデント == | ||
アンインデント.js <br> | ;アンインデント.js <br> | ||
既存のツールバーアイコンのアイテム「逆インデント」から置きかえて使う目的のマクロで、<span style="color:#c00;">選択範囲がなくてもアンインデント</span>します。 <br> | 既存のツールバーアイコンのアイテム「逆インデント」から置きかえて使う目的のマクロで、<span style="color:#c00;">選択範囲がなくてもアンインデント</span>します。 <br> | ||
機能的には「字上げ(スペース×2 削除)」マクロとほぼ同じですが、削除できる「半角スペース×n」の最大数をかんたんに設定できるようにしてあります ( "␣␣␣␣", "␣␣␣", "␣␣", "␣" なら ''deleteSpace ='' '''''4''''' と指定するだけ)。 | 機能的には「字上げ(スペース×2 削除)」マクロとほぼ同じですが、削除できる「半角スペース×n」の最大数をかんたんに設定できるようにしてあります ( "␣␣␣␣", "␣␣␣", "␣␣", "␣" なら ''deleteSpace ='' '''''4''''' と指定するだけ)。 | ||
| 341行目: | 363行目: | ||
※ sukemaru 版の「逆インデント」と「字上げ(スペース×2 削除)」マクロを並存させるメリットは特にないとおもいますので、お好みで選んでください。 | ※ sukemaru 版の「逆インデント」と「字上げ(スペース×2 削除)」マクロを並存させるメリットは特にないとおもいますので、お好みで選んでください。 | ||
<source lang="javascript"> | <source lang="javascript" style="height:40em; overflow:auto;"> | ||
#title = "逆インデント" | #title = "逆インデント" | ||
#tooltip = "選択範囲がなくてもアンインデント" | #tooltip = "選択範囲がなくてもアンインデント" | ||
| 367行目: | 389行目: | ||
// "選択範囲なし" のフラグ | // "選択範囲なし" のフラグ | ||
var pos = s.IsEmpty ? s.GetActivePos() : ""; | |||
// カーソル付近の「タブ文字×1」を削除する場合(左側優先) | // カーソル付近の「タブ文字×1」を削除する場合(左側優先) | ||
var isDone = false; | |||
if ( pos && nearestTab ) { | if ( pos && nearestTab ) { | ||
if ( document.Text.charAt( pos - 1 ) == "\t" ) { | if ( document.Text.charAt( pos - 1 ) == "\t" ) { | ||
s.DeleteLeft(); | s.DeleteLeft(); | ||
isDone = true; | |||
} | } | ||
else if ( document.Text.charAt( pos ) == "\t" ) { | else if ( document.Text.charAt( pos ) == "\t" ) { | ||
s.Delete(); | s.Delete(); | ||
isDone = true; | |||
} | } | ||
} | } | ||
if ( ! isDone ) { | |||
// 選択範囲 | |||
var act = s.GetActivePos(); | |||
var anc = s.GetAnchorPos(); | |||
var ty = s.GetTopPointY( mePosLogical ); | |||
var bx = s.GetBottomPointX( mePosLogical ); | |||
var by = y = s.GetBottomPointY( mePosLogical ); | |||
// 選択範囲を拡張 | |||
if ( ty != by && bx == 1 ) { | |||
y --; // 選択範囲の末尾が行頭 x = 1 にあるときの調整 | |||
} | |||
s.SetActivePoint( mePosLogical, 1, y ); | |||
s.EndOfLine( false, mePosLogical ); | |||
s.SetAnchorPoint( mePosLogical, 1, ty ); | |||
var st = s.Text; | |||
// | // 逆インデント | ||
// ( deleteSpace >= 3 ) では、/^\t|^[ ]{1,n}|^[ ]{1,m}/gm の n に deleteSpace の値、m に n/2 を代入 ※toString().replace() で小数点以下を切り捨て | |||
// ■ m = n/2 の小数点以下を切り上げ(四捨五入)にするなら Math.round() 関数の行を使用する | |||
// ※必ず ( deleteSpace >= 3 ) の行のひとつをコメントアウト状態にしておくこと | |||
var | var indent = ( deleteSpace == 1 ) ? "^\\t|^[ ]{1,2}" | ||
: ( deleteSpace == 2 ) ? "^\\t|^[ ]{1,2}|^[ ]" | |||
: ( deleteSpace >= 3 ) ? "^\\t|^[ ]{1," + deleteSpace + "}|^[ ]{1," + ( deleteSpace / 2 ).toString().replace( /\.\d+$/ , "" ) + "}" | |||
// : ( deleteSpace >= 3 ) ? "^\\t|^[ ]{1," + deleteSpace + "}|^[ ]{1," + Math.round( deleteSpace / 2 ) + "}" | |||
/* else */ : "^\\t"; | |||
var u = st.replace( new RegExp( indent , "gm" ) , "" ); | |||
if ( u != s.Text ) { | |||
s.Text = u; | |||
} | |||
var u = st.replace( new RegExp( indent , "gm" ) , "" ); | |||
if ( u != s.Text ) | |||
// カーソル位置または選択範囲を復元 | // カーソル位置または選択範囲を復元 | ||
if ( ty == by ) { | if ( ty == by ) { | ||
s.SetActivePos( act - ( st.length - u.length ) ); | |||
s.SetAnchorPos( anc - ( st.length - u.length ) ); | |||
if ( s.GetTopPointY( mePosLogical ) != ty ) | |||
s.SetActivePoint( mePosLogical, 1, ty ); | |||
} | } | ||
else { | else { | ||
s.SetActivePos( s.GetActivePos() + 1 ); | |||
s.SetAnchorPoint( mePosLogical, 1, ty ); | |||
} | |||
} | } | ||
ScrollX = sx; ScrollY = sy; | ScrollX = sx; ScrollY = sy; | ||
</source> | </source> | ||
== メモ == | |||
*(2019/04/07 sukemaru) | |||
:ソースコードから Quit() メソッドを削除 | |||
2019年4月7日 (日) 10:30時点における版
論理行単位で字下げ・字上げします。
インデントには任意の文字列を設定できます。※初期設定は半角空白2個です。
masme 版
更新履歴
- 2015/02/14
- (字上げ) 「インデントの定義」に正規表現の特殊文字があると誤動作する不具合を修正。
- 矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正。
- 2014/02/09
- 初版公開。
字下げ (インデント)
- 複数行選択時 (選択範囲が2行以上) は、字下げします。
単一行選択時 (選択範囲が1行以内) または非選択時は、タブ文字を挿入します。
※選択範囲の行数は、ステータスバーの「xx文字 (xx行) 選択」の部分で判断してください。 - 空行 (改行のみの行) は字下げされません。
- 「Tab」キーなどに割り当ててご利用ください。
//■字下げ(インデント)
// 2014/02/09-2015/02/14
//・論理行単位で字下げする。空行は字下げしない。非選択時/単行選択時はタブ挿入。
//■インデントの定義 ●初期値=" " (半角空白2個)
var $indent = " ";
with (Document.Selection) {
//非選択時/単行選択時はタブ挿入して終了
if (GetTopPointY(mePosView)==GetBottomPointY(mePosView)) {Text="\t"; Quit();}
var ty = GetTopPointY(mePosLogical);
var by = GetBottomPointY(mePosLogical);
var bx = GetBottomPointX(mePosLogical);
var br =(Text.match(/\n/g)||[]).length;
if (bx==1 && by-ty==br && br) by--; //次行行頭を含めないよう対策
SetActivePoint(mePosLogical, 1, by+1);
SetAnchorPoint(mePosLogical, 1, ty);
Text = Text.replace(/^(?!$)/gm,$indent); //(空行を除く)行頭にインデントを付加
SetActivePoint(mePosLogical, 1, by+1);
SetAnchorPoint(mePosLogical, 1, ty);
}
字上げ (アンインデント)
- 単一行選択時 (選択範囲が1行以内) または非選択時でも、字上げします。
- 「Shift + Tab」キーなどに割り当ててご利用ください。
//■字上げ(アンインデント)
// 2014/02/09-2015/02/14
//・論理行単位で字上げする。非選択時/単行選択時でも字上げする。
//■インデントの定義 ●初期値=" " (半角空白2個)
var $indent = " ";
with (Document.Selection) {
//特殊文字をエスケープ
$indent = new RegExp("^"+$indent.replace(/([$()*+.?[\\\]^{|}])/g,"\\$1"),"gm");
var ty = GetTopPointY(mePosLogical);
var by = GetBottomPointY(mePosLogical);
var bx = GetBottomPointX(mePosLogical);
var br =(Text.match(/\n/g)||[]).length;
if (bx==1 && by-ty==br && br) by--; //次行行頭を含めないよう対策
SetActivePoint(mePosLogical, 1, by+1);
SetAnchorPoint(mePosLogical, 1, ty);
Text = Text.replace($indent,""); //行頭のインデントを削除
SetActivePoint(mePosLogical, 1, by+1);
SetAnchorPoint(mePosLogical, 1, ty);
}
sukemaru 版
ダウンロード: 「ファイル:字下げ/字上げ.zip(アイコン入り)」 最終更新: 2019/04/07
それぞれ専用の「マテリアルデザインっぽいアイコン」を同梱
字下げ(スペース×2 追加)
- スペース×2 追加.js
キャレットまたは選択範囲をふくむ論理行の各先頭に「半角スペース×2」を追加します。
- 選択範囲がなかった場合は「タブ文字」を追加、または「半角スペース×2」を行頭に追加します。
- 選択範囲があった場合は、つねに「半角スペース×2」を行頭に追加します。
- 行頭に「半角スペース×2」を追加する場合は、空行を無視します。
- 選択範囲が末尾に改行を含んでいた場合は、最後の改行を無視します。
#title = "字下げ"
#tooltip = "スペース×2 追加"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",247
// ※「引用の追加」マクロから行頭に文字列を追加するコードを拝借した
// ■選択範囲なしのときには「タブ文字×1」を追加するか?
var tabEnable = 0;
// 0 なら、「半角スペース×2」を行頭に追加する(空行は無視)
// 1 なら、選択範囲なしのときは「タブ文字×1」を行頭に追加する
// 2 なら、選択範囲なしのときは「タブ文字×1」をキャレット位置に追加する
// ■行頭に追加する空白文字の定義(初期値:「半角スペース×2 " "」)
var blank = " "; // 半角スペース×2
var s = document.selection;
// "選択範囲なし" のフラグ
var pos = s.IsEmpty ? s.GetActivePos() : "";
// キャレット位置に「タブ文字×1」を挿入して終了するパターン
if ( pos && tabEnable > 1 ) { // tabEnable == 2
s.Text = "\t";
}
else {
var sx = ScrollX, sy = ScrollY;
// 選択範囲を取得
var ty = s.GetTopPointY( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
var by = s.GetBottomPointY( mePosLogical );
// 選択範囲を拡張
if ( by != ty && bx == 1 ) {
by -= 1;
}
s.SetActivePoint( mePosLogical, 1, by );
s.EndOfLine( false, mePosLogical );
s.SetAnchorPoint( mePosLogical, 1, ty );
// 選択範囲の文字列を取得
var st = s.Text;
// 最初に選択範囲がなかった場合は、行頭に「タブ文字×1」を追加
if ( pos && tabEnable == 1 ) {
var tab = "\t";
s.Text = InsertSpace( st, tab );
s.SetActivePos( pos + tab.length ); // 範囲選択を残さない
}
// 選択範囲があった場合は、行頭に「半角スペース×2」を追加(空行は無視)
else { // ( ! pos || tabEnable == 0 )
var t = InsertSpace( st, blank );
if ( t != st ) {
s.Text = t;
}
if ( pos ) { // 範囲選択を残さない
s.SetActivePos( pos + ( t.length - st.length ) );
}
else { // 範囲選択を残す
s.SetActivePoint( mePosLogical, 1, by + 1 );
s.SetAnchorPoint( mePosLogical, 1, ty );
}
}
ScrollX = sx; ScrollY = sy;
}
// 「引用の追加」マクロより拝借
function InsertSpace( arg1, arg2 ) {
var a = arg1.split( "\n" );
for ( var i = 0; i < a.length; i ++ )
if ( a[i].length || arg2 == "\t" )
a[i] = arg2 + a[i];
return a.join( "\n" );
}
字上げ(スペース×2 削除)
- スペース×2 削除.js
キャレットまたは選択範囲をふくむ論理行の各先頭から「半角スペース×2」を削除します。
- 行頭の「空白文字」を削除、またはキャレット位置の前後にある「タブ文字」を削除します。
- 選択範囲があった場合は、つねに行頭の「空白文字」だけを削除します。
- 削除対象の行頭の「空白文字」には「半角スペース×2」以外の空白文字もふくめます。
- i.e. 「半角スペース×2」「半角スペース×1」「全角スペース×1」「タブ文字×1」
- 選択範囲が末尾に改行を含んでいた場合は、最後の改行を無視します。
※ sukemaru 版の「字上げ」と「逆インデント」マクロを並存させるメリットは少ないとおもいますので、お好みで選んでください。
「字上げ」マクロなら、削除対象に「空白文字」以外の任意の "文字列" や "記号" なども追加できます。
#title = "字上げ"
#tooltip = "スペース×2 削除"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",249
// ※「引用の追加」マクロから行頭の文字列を削除するコードを拝借した
// ■選択範囲なしのときに、キャレット位置の前後にある「タブ文字」を優先的に削除するか?
var nearestTab = true;
// false にすると、つねに行頭の空白文字のみを削除
// true にすると、キャレット付近の「タブ文字×1」を優先的に削除(タブ文字がなければ行頭の空白を削除)
// ■削除対象(削除の単位)にする行頭の空白文字の定義
var blank = new Array( " " , " " , " " , "\t" );
// 初期値: new Array( " " , " " , " " , "\t" )
// i.e. 「半角スペース×2 " "」「半角スペース×1 " "」「全角スペース×1 " " 」「タブ文字×1 "\t"」
// ※ 前に置いたもののほうが優先順位が高くなるので、行頭に半角スペースが3つある行で連続で実行した場合、
// 1回目では「半角スペース×2」を削除し、2回目で「半角スペース×1」を削除する
// ※ 空白文字以外の "文字列" を Array() のなかに追加するのも可
var s = document.selection;
// "選択範囲なし" のフラグ
var pos = s.IsEmpty ? s.GetActivePos() : "";
// キャレット付近の「タブ文字×1」を優先的に削除するパターン
var isDone = false;
if ( pos && nearestTab ) {
if ( document.Text.charAt( pos - 1 ) == "\t" ) {
s.DeleteLeft();
isDone = true;
}
else if ( document.Text.charAt( pos ) == "\t" ) {
s.Delete();
isDone = true;
}
}
if ( ! isDone ) {
var sx = ScrollX, sy = ScrollY;
// 選択範囲を取得
var ty = s.GetTopPointY( mePosLogical );
var by = s.GetBottomPointY( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
// 選択範囲を拡張
if ( by != ty && bx == 1 ) {
by -= 1;
}
s.SetActivePoint( mePosLogical, 1, by );
s.EndOfLine( false, mePosLogical );
s.SetAnchorPoint( mePosLogical, 1, ty );
// 選択範囲の文字列を取得
var st = s.Text;
// 行頭の空白文字を削除
var t = DeleteSpace( st, blank );
if ( t != st ) {
s.Text = t;
}
if ( pos ) { // 範囲選択を残さない
s.SetActivePos( pos - ( st.length - t.length ) );
}
else { // 範囲選択を残す
s.SetActivePoint( mePosLogical, 1, by + 1 );
s.SetAnchorPoint( mePosLogical, 1, ty );
}
ScrollX = sx; ScrollY = sy;
}
// 「引用の追加」マクロより拝借
function DeleteSpace( arg1, arg2 ) {
var a = arg1.split( "\n" );
for ( var i = 0; i < a.length; i ++ ) {
for ( var j = 0; j < arg2.length; j ++ ) {
if ( arg2[j].length == 0 )
continue;
if ( a[i].substr( 0, arg2[j].length ) == arg2[j] ) {
a[i] = a[i].substr( arg2[j].length );
break;
}
}
}
return a.join( "\n" );
}
インデント
- インデント.js
既存のツールバーアイコンのアイテム「インデント」から置きかえて使う目的のマクロで、選択範囲がなくてもタブインデントします。
ソースコードの内容は「字上げ(スペース×2 追加)」マクロとほぼ同じですが、こちらの「インデント」マクロの場合は、挿入する空白は「タブ文字」のみで空白行にたいしてもインデントを追加します。
- 論理行全体をタブインデント(行頭)して範囲選択します。
選択範囲が1行内ならもとの選択範囲を維持し、複数行なら対象の論理行全体を範囲選択します。 - またはカーソル位置にタブ文字を挿入します。
- 選択範囲が末尾に改行を含んでいた場合は、最後の改行を無視します。
【推奨設定】 Tab キーに割りあてるなら tabEnable = 2 , ツールバーアイコンにするなら tabEnable = 0
#title = "インデント"
#tooltip = "選択範囲がなくてもインデント"
#icon = "Mery用 マテリアルデザインっぽいアイコン.icl",260
// ■選択範囲があるときに、選択範囲を「タブ文字」にするか? 行全体をタブインデントするか?
var tabEnable = 0;
// 0 にすると、選択範囲がなくてもつねに行全体をタブインデント(行頭)
// 1 にすると、選択範囲があれば行全体をタブインデント(※ツールバーアイコンの「インデント」に似た動作)
// 2 にすると、選択範囲が1行内のときだけ選択範囲を「タブ文字」にする (※Tab キーの通常動作にちかい)
// 3 にすると、つねに選択範囲を「タブ文字」にする(※インデントしない)
// ※ 0 の場合、「タブ文字」を挿入することができないので、ツールバーアイコン向けの設定。
// ※ 1 の場合、選択範囲を「タブ文字」にすることができないので、Tab キーにマクロを割りあてると少し不便になるかも?
// 範囲選択 → 削除 (Delete / BackSpace) → 「インデント」マクロ (Tab)
// ※ 2 の場合に1行だけインデントさせるなら、行頭でクリックするか、行内でトリプルクリック
// または行番号のクリックで行全体を選択範囲にして「インデント」マクロ (末尾改行まで含める必要あり)。
// [EOF] マークのある(さいごに改行がない)文書末行だけの1行選択ではインデントできない。
// ⇔ Tab キーの通常動作では末尾改行を含める必要はない
// ※ 3 は、わざわざマクロでやる意味もないかと。
var sx = ScrollX, sy = ScrollY;
var s = document.selection;
// 選択範囲
var act = s.GetActivePos();
var anc = s.GetAnchorPos();
var ty = s.GetTopPointY( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
var by = y = s.GetBottomPointY( mePosLogical );
// カーソル位置にタブを挿入して終了するパターン
if ( ( s.IsEmpty && tabEnable == 1 ) || ( tabEnable == 2 && ty == by ) || tabEnable == 3 ) {
s.Text = "\t";
}
else {
// 選択範囲を拡張
if ( ty != by && bx == 1 ) {
y --; // 選択範囲の末尾が行頭 x = 1 にあるときの調整
}
s.SetActivePoint( mePosLogical, 1, y );
s.EndOfLine( false, mePosLogical );
s.SetAnchorPoint( mePosLogical, 1, ty );
var st = s.Text;
// インデント
s.Text = st.replace( /^/gm , "\t" );
// 選択範囲を復元
if ( ty == by ) {
s.SetActivePos( act + 1 );
s.SetAnchorPos( anc + 1 );
}
else {
s.SetActivePos( s.GetActivePos() + 1 );
s.SetAnchorPoint( mePosLogical, 1, ty );
}
}
ScrollX = sx; ScrollY = sy;
逆インデント
- アンインデント.js
既存のツールバーアイコンのアイテム「逆インデント」から置きかえて使う目的のマクロで、選択範囲がなくてもアンインデントします。
機能的には「字上げ(スペース×2 削除)」マクロとほぼ同じですが、削除できる「半角スペース×n」の最大数をかんたんに設定できるようにしてあります ( "␣␣␣␣", "␣␣␣", "␣␣", "␣" なら deleteSpace = 4 と指定するだけ)。
- 行頭またはカーソル付近の「タブ文字×1」か、行頭の「半角スペース×n」を削除します。
- 選択範囲なしならカーソル付近のタブを削除するか、またはカーソルのある1行をアンインデントして、カーソル位置を復帰します。
- 選択範囲ありなら論理行全体をアンインデント(行頭)して範囲選択します。
- 選択範囲が末尾に改行を含んでいた場合は、最後の改行を無視します。
【推奨設定】 「字上げ」マクロと並存させるなら deleteSpace = 0 , 「字上げ」マクロなしで Shift+Tab キーに割りあてるなら deleteSpace ≠ 0
- 設定用変数 deleteSpace = n で 3 以上の数値を指定するさいは、Mery のオプション設定の「タブの桁数」を目安にしてください(大きな数字や非整数値を入れての動作検証はしていません)。
※ sukemaru 版の「逆インデント」と「字上げ(スペース×2 削除)」マクロを並存させるメリットは特にないとおもいますので、お好みで選んでください。
#title = "逆インデント"
#tooltip = "選択範囲がなくてもアンインデント"
#icon = "Mery用 マテリアルデザインっぽいアイコン.icl",261
// ■選択範囲なしのときに、カーソル位置の前後にある「タブ文字」を優先的に削除するか?
var nearestTab = true;
// false にすると、つねに行頭の空白文字のみを削除
// true にすると、カーソル付近の「タブ文字×1」を優先的に削除(タブ文字がなければ行頭の空白を削除)
// ■行頭の「半角スペース」や「「全角スペース」も削除するか?
var deleteSpace = 1;
// ※ 正の整数値で指定してください
// 0 にすると、「タブ文字×1」だけを削除
// 1 にすると、行頭の「半角スペース×2」と「半角スペース×1」も削除
// 2 にすると、行頭の「半角スペース×2」と「半角スペース×1」と「全角スペース×1」も削除
// 3 以上にすると、1回の逆インデントで削除できる「半角スペース×n」の最大数が増加
// → 削除できる「全角スペース」の最大数は n / 2 (初期設定では小数点以下を切り捨て)
var sx = ScrollX, sy = ScrollY;
var s = document.selection;
// "選択範囲なし" のフラグ
var pos = s.IsEmpty ? s.GetActivePos() : "";
// カーソル付近の「タブ文字×1」を削除する場合(左側優先)
var isDone = false;
if ( pos && nearestTab ) {
if ( document.Text.charAt( pos - 1 ) == "\t" ) {
s.DeleteLeft();
isDone = true;
}
else if ( document.Text.charAt( pos ) == "\t" ) {
s.Delete();
isDone = true;
}
}
if ( ! isDone ) {
// 選択範囲
var act = s.GetActivePos();
var anc = s.GetAnchorPos();
var ty = s.GetTopPointY( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
var by = y = s.GetBottomPointY( mePosLogical );
// 選択範囲を拡張
if ( ty != by && bx == 1 ) {
y --; // 選択範囲の末尾が行頭 x = 1 にあるときの調整
}
s.SetActivePoint( mePosLogical, 1, y );
s.EndOfLine( false, mePosLogical );
s.SetAnchorPoint( mePosLogical, 1, ty );
var st = s.Text;
// 逆インデント
// ( deleteSpace >= 3 ) では、/^\t|^[ ]{1,n}|^[ ]{1,m}/gm の n に deleteSpace の値、m に n/2 を代入 ※toString().replace() で小数点以下を切り捨て
// ■ m = n/2 の小数点以下を切り上げ(四捨五入)にするなら Math.round() 関数の行を使用する
// ※必ず ( deleteSpace >= 3 ) の行のひとつをコメントアウト状態にしておくこと
var indent = ( deleteSpace == 1 ) ? "^\\t|^[ ]{1,2}"
: ( deleteSpace == 2 ) ? "^\\t|^[ ]{1,2}|^[ ]"
: ( deleteSpace >= 3 ) ? "^\\t|^[ ]{1," + deleteSpace + "}|^[ ]{1," + ( deleteSpace / 2 ).toString().replace( /\.\d+$/ , "" ) + "}"
// : ( deleteSpace >= 3 ) ? "^\\t|^[ ]{1," + deleteSpace + "}|^[ ]{1," + Math.round( deleteSpace / 2 ) + "}"
/* else */ : "^\\t";
var u = st.replace( new RegExp( indent , "gm" ) , "" );
if ( u != s.Text ) {
s.Text = u;
}
// カーソル位置または選択範囲を復元
if ( ty == by ) {
s.SetActivePos( act - ( st.length - u.length ) );
s.SetAnchorPos( anc - ( st.length - u.length ) );
if ( s.GetTopPointY( mePosLogical ) != ty )
s.SetActivePoint( mePosLogical, 1, ty );
}
else {
s.SetActivePos( s.GetActivePos() + 1 );
s.SetAnchorPoint( mePosLogical, 1, ty );
}
}
ScrollX = sx; ScrollY = sy;
メモ
- (2019/04/07 sukemaru)
- ソースコードから Quit() メソッドを削除
