「字下げ・字上げ」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
sukemaru版を追加
MSY-07 (トーク | 投稿記録)
SyntaxHighlightにcopyの追加
 
(3人の利用者による、間の27版が非表示)
1行目: 1行目:
論理行単位で字下げ・字上げします。<br>
== 概要 ==
論理行単位で字下げ・字上げします。
 
インデントには任意の文字列を設定できます。※初期設定は半角空白2個です。
インデントには任意の文字列を設定できます。※初期設定は半角空白2個です。


[[ファイル:Indent-Unindent.png]]
[[ファイル:Indent-Unindent.png]]


= masme 版 =
== 変更履歴 ==
==更新履歴==
* 1.0.3 (2019-06-01)
* 2015/02/14
** 字下げ・字上げした次の行に変更行の印がつかないようにした
** (字上げ) 「インデントの定義」に正規表現の特殊文字があると誤動作する不具合を修正。
*** 末尾の改行(次の行頭)を範囲に含めず書き換えるように変更
** 矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正。
** with 文を使用せず変数化した(他の自作マクロに合わせた)
* 2014/02/09
* 1.0.2 (2019-04-12)
** 初版公開。
** (字下げ) Quit() → break ラベル文に変更
* 1.0.1 (2015-02-14)
** (字上げ) 「インデントの定義」に正規表現の特殊文字があると誤動作する不具合を修正
** 矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正
* 1.0.0 (2014-02-09)
** 初版公開


==字下げ (インデント)==
== 字下げ (インデント) ==
* 複数行選択時 (選択範囲が2行以上) は、字下げします。<br>単一行選択時 (選択範囲が1行以内) または非選択時は、タブ文字を挿入します。<br><span style="color:#c00;">※選択範囲の行数は、ステータスバーの「xx文字 (xx行) 選択」の部分で判断してください。</span>
* 複数行選択時 (選択範囲が2行以上) は字下げします。<br>単一行選択時 (選択範囲が1行以内) または非選択時はタブ文字を挿入します。<br><b style="color:#c00;">※選択範囲の行数はステータスバーの「xx文字 (xx行) 選択」の部分で判断してください。</b>
* 空行 (改行のみの行) は字下げされません。
* 空行 (改行のみの行) は初期状態では字下げしません。
* 「Tab」キーなどに割り当ててご利用ください。
* 「Tab」キーなどに割り当ててご利用ください。


<source lang="javascript">
=== ソースコード ===
<syntaxhighlight lang="javascript" copy>
//■字下げ(インデント)
//■字下げ(インデント)
// 2014/02/09-2015/02/14
// 2014-02-09 - 2019-06-01
//・論理行単位で字下げする。空行は字下げしない。非選択時/単行選択時はタブ挿入。
//・論理行単位で字下げする。空行は字下げしない。非選択時/単行選択時はタブ挿入。


//■インデントの定義 ●初期値="  " (半角空白2個)
//■インデントの定義 ●初期値="  "
var $indent = "  ";
var INDENT = "  ";


with (Document.Selection) {
quit: {
  //非選択時/単行選択時はタブ挿入して終了
var Sel = Document.Selection;
  if (GetTopPointY(mePosView)==GetBottomPointY(mePosView)) {Text="\t"; Quit();}
if (Sel.GetTopPointY(mePosView)===Sel.GetBottomPointY(mePosView)) {
 
  Sel.Text = "\t"; break 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);
}
}
</source>
var ty = Sel.GetTopPointY(mePosLogical);
var by = Sel.GetBottomPointY(mePosLogical);
var bx = Sel.GetBottomPointX(mePosLogical);
var nn =(Sel.Text.match(/\n/g)||[]).length;
if (bx===1 && nn<=by-ty && nn) by--; //末尾改行対策
Sel.SetActivePoint(mePosLogical, 1, by);
Sel.EndOfLine(false, mePosLogical);
Sel.SetAnchorPoint(mePosLogical, 1, ty);
Sel.Text = Sel.Text.replace(/^(?!$)/gm,INDENT);
Sel.SetActivePoint(mePosLogical, 1, by+1);
Sel.SetAnchorPoint(mePosLogical, 1, ty);
}
</syntaxhighlight>


==字上げ (アンインデント)==
== 字上げ (アンインデント) ==
* 単一行選択時 (選択範囲が1行以内) または非選択時でも、字上げします。
* 単一行選択時 (選択範囲が1行以内) または非選択時でも字上げします。
* 「Shift + Tab」キーなどに割り当ててご利用ください。
* 「Shift + Tab」キーなどに割り当ててご利用ください。


<source lang="javascript">
=== ソースコード ===
<syntaxhighlight lang="javascript" copy>
//■字上げ(アンインデント)
//■字上げ(アンインデント)
// 2014/02/09-2015/02/14
// 2014-02-09 - 2019-06-01
//・論理行単位で字上げする。非選択時/単行選択時でも字上げする。
//・論理行単位で字上げする。非選択時/単行選択時でも字上げする。


//■インデントの定義 ●初期値="  " (半角空白2個)
//■インデントの定義 ●初期値="  "
var $indent = "  ";
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);
}
</source>
 
 
= sukemaru 版 =
<br>
ダウンロード: 「[[メディア:スペース×2_追加/削除.zip|スペース×2 追加/削除.zip]](アイコン入り)」
 
== 字下げ ==
スペース×2 追加.js
<br>
キャレットまたは選択範囲をふくむ論理行の各先頭に「半角スペース×2」を追加します。
* 選択範囲がなかった場合は「タブ文字」を追加、または「半角スペース×2」を行頭に追加します。
* 選択範囲があった場合は、つねに「半角スペース×2」を行頭に追加します。
* 行頭に「半角スペース×2」を追加する場合は、空行を無視します。
* 選択範囲が末尾に改行を含んでいた場合は、最後の改行を無視します。
 
<source lang="javascript">
#title = "スペース×2 追加"
#tooltip = "行頭に スペース×2 を追加する"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",247
 
// 選択範囲がなかった場合は「タブ文字」を追加、または「半角スペース×2」を行頭に追加する
// 選択範囲があった場合は、つねに「半角スペース×2」を行頭に追加する(空行は無視)
 
// ■選択範囲なしのときには「タブ文字×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";  Quit();
}


var sx = ScrollX,  sy = ScrollY;
var Sel = Document.Selection;
// 選択範囲を取得
var ty = Sel.GetTopPointY(mePosLogical);
var ty = s.GetTopPointY( mePosLogical );
var by = Sel.GetBottomPointY(mePosLogical);
var bx = s.GetBottomPointX( mePosLogical );
var bx = Sel.GetBottomPointX(mePosLogical);
var by = s.GetBottomPointY( mePosLogical );
var nn =(Sel.Text.match(/\n/g)||[]).length;
// 選択範囲を拡張
if (bx===1 && nn<=by-ty && nn) by--; //末尾改行対策
if ( by != ty && bx == 1 )
Sel.SetActivePoint(mePosLogical, 1, by);
  by -= 1;
Sel.EndOfLine(false, mePosLogical);
s.SetActivePoint( mePosLogical, 1, by );
Sel.SetAnchorPoint(mePosLogical, 1, ty);
s.EndOfLine( false, mePosLogical );
var pat = "^"+ INDENT.replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&");
s.SetAnchorPoint( mePosLogical, 1, ty );
Sel.Text = Sel.Text.replace(new RegExp(pat,"gm"),"");
 
Sel.SetActivePoint(mePosLogical, 1, by+1);
// 選択範囲の文字列を取得
Sel.SetAnchorPoint(mePosLogical, 1, ty);
var st = s.Text;
</syntaxhighlight>
 
// ■最初に選択範囲がなかった場合は、行頭に「タブ文字×1」を追加
if ( pos && tabEnable == 1 ) {
  var tab = "\t";
  s.Text = InsertSpace( s.Text, 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" );
}
</source>
 
 
== 字上げ ==
スペース×2 削除.js
<br>
キャレットまたは選択範囲をふくむ論理行の各先頭から「半角スペース×2」を削除します。
* 行頭の「空白文字」を削除、またはキャレット位置の前後にある「タブ文字」を削除します。
* 選択範囲があった場合は、つねに行頭の「空白文字」だけを削除します。
* 削除対象の行頭の「空白文字」には「半角スペース×2」以外の空白文字もふくめます。
: ''i.e.'' 「半角スペース×2」「半角スペース×1」「全角スペース×1」「タブ文字×1」
* 選択範囲が末尾に改行を含んでいた場合は、最後の改行を無視します。
 
<source lang="javascript">
#title = "スペース×2 削除"
#tooltip = "行頭の スペース×2 を削除する"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",249
 
// 行頭の「空白文字」を削除/またはキャレット位置の前後にある「タブ文字」を削除する
// 選択範囲があった場合は、つねに行頭の「空白文字」だけを削除する
 
// ■選択範囲なしのときに、キャレット位置の前後にある「タブ文字」を優先的に削除するか?
var nearestTab = true;
 
  // false にすると、つねに行頭の空白文字のみを削除
  // true にすると、キャレット付近の「タブ文字×1」を優先的に削除(タブ文字がなければ行頭の空白を削除)
 
// ■削除対象(削除の単位)にする行頭の空白文字の定義
var blank = new Array( "  " , " " , " " , "\t" );
 
  // 前に置いたもののほうが優先順位が高くなるので、行頭に半角スペースが3つある行で連続で実行した場合、
  // 1回目では「半角スペース×2」を削除し、2回目で「半角スペース×1」を削除する
 
 
var s = document.selection;
var pos = ( s.IsEmpty ) ? s.GetActivePos() : "";
 
// ■キャレット付近の「タブ文字×1」を優先的に削除
if ( pos && nearestTab ) {
  if ( document.Text.charAt( pos - 1 ) == "\t" ) {
    s.DeleteLeft();  Quit();
  }
  else if ( document.Text.charAt( pos ) == "\t" ) {
    s.Delete();  Quit();
  }
}
 
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" );
}
</source>

2025年6月30日 (月) 00:09時点における最新版

概要[編集]

論理行単位で字下げ・字上げします。

インデントには任意の文字列を設定できます。※初期設定は半角空白2個です。

変更履歴[編集]

  • 1.0.3 (2019-06-01)
    • 字下げ・字上げした次の行に変更行の印がつかないようにした
      • 末尾の改行(次の行頭)を範囲に含めず書き換えるように変更
    • with 文を使用せず変数化した(他の自作マクロに合わせた)
  • 1.0.2 (2019-04-12)
    • (字下げ) Quit() → break ラベル文に変更
  • 1.0.1 (2015-02-14)
    • (字上げ) 「インデントの定義」に正規表現の特殊文字があると誤動作する不具合を修正
    • 矩形選択(始点or終点が左下かつ論理行頭)時、下端の行が範囲から漏れる不具合を修正
  • 1.0.0 (2014-02-09)
    • 初版公開

字下げ (インデント)[編集]

  • 複数行選択時 (選択範囲が2行以上) は字下げします。
    単一行選択時 (選択範囲が1行以内) または非選択時はタブ文字を挿入します。
    ※選択範囲の行数はステータスバーの「xx文字 (xx行) 選択」の部分で判断してください。
  • 空行 (改行のみの行) は初期状態では字下げしません。
  • 「Tab」キーなどに割り当ててご利用ください。

ソースコード[編集]

//■字下げ(インデント)
// 2014-02-09 - 2019-06-01
//・論理行単位で字下げする。空行は字下げしない。非選択時/単行選択時はタブ挿入。

//■インデントの定義 ●初期値="  "
var INDENT = "  ";

quit: {
var Sel = Document.Selection;
if (Sel.GetTopPointY(mePosView)===Sel.GetBottomPointY(mePosView)) {
  Sel.Text = "\t"; break quit; //非選択時/単行選択時はタブ挿入して終了
}
var ty = Sel.GetTopPointY(mePosLogical);
var by = Sel.GetBottomPointY(mePosLogical);
var bx = Sel.GetBottomPointX(mePosLogical);
var nn =(Sel.Text.match(/\n/g)||[]).length;
if (bx===1 && nn<=by-ty && nn) by--; //末尾改行対策
Sel.SetActivePoint(mePosLogical, 1, by);
Sel.EndOfLine(false, mePosLogical);
Sel.SetAnchorPoint(mePosLogical, 1, ty);
Sel.Text = Sel.Text.replace(/^(?!$)/gm,INDENT);
Sel.SetActivePoint(mePosLogical, 1, by+1);
Sel.SetAnchorPoint(mePosLogical, 1, ty);
}

字上げ (アンインデント)[編集]

  • 単一行選択時 (選択範囲が1行以内) または非選択時でも字上げします。
  • 「Shift + Tab」キーなどに割り当ててご利用ください。

ソースコード[編集]

//■字上げ(アンインデント)
// 2014-02-09 - 2019-06-01
//・論理行単位で字上げする。非選択時/単行選択時でも字上げする。

//■インデントの定義 ●初期値="  "
var INDENT = "  ";

var Sel = Document.Selection;
var ty = Sel.GetTopPointY(mePosLogical);
var by = Sel.GetBottomPointY(mePosLogical);
var bx = Sel.GetBottomPointX(mePosLogical);
var nn =(Sel.Text.match(/\n/g)||[]).length;
if (bx===1 && nn<=by-ty && nn) by--; //末尾改行対策
Sel.SetActivePoint(mePosLogical, 1, by);
Sel.EndOfLine(false, mePosLogical);
Sel.SetAnchorPoint(mePosLogical, 1, ty);
var pat = "^"+ INDENT.replace(/[$()*+.?\[\\\]^{|}]/g,"\\$&");
Sel.Text = Sel.Text.replace(new RegExp(pat,"gm"),"");
Sel.SetActivePoint(mePosLogical, 1, by+1);
Sel.SetAnchorPoint(mePosLogical, 1, ty);
スポンサーリンク