「Eclipse風コメントアウト」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Ks (トーク | 投稿記録)
Eclipse風コメントアウト
 
MSY-07 (トーク | 投稿記録)
セミコロンの追加
 
(2人の利用者による、間の12版が非表示)
1行目: 1行目:
== 概要 ==
Eclipse風なコメントアウト <=> コメントの除去を行います。
Eclipse風なコメントアウト <=> コメントの除去を行います。


<source lang="javascript">
== 変更履歴 ==
* 1.0.1 (2013-08-31)
** 編集モードによるコメント文字変更追加
* 1.0.0 (2012-08-30)
** 初版
 
== ソースコード ==
<syntaxhighlight lang="javascript" copy>
#title = "選択行コメントアウト"
 
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// Eclipse風なコメントアウト
// Eclipse風なコメントアウト
// 複数行一括コメントアウト、復帰マクロ
// 1) 対象は行全体(行途中の選択も行全体とみなす)
// 1) 対象は行全体(行途中の選択も行全体とみなす)
// 2) 空白行はコメントアウトしない
// 2) 空白行はコメントアウトしない
// 3) インデントは選択行の範囲で一番左(タブ幅単位)に合わせる
// 3) インデントは選択行の範囲で一番左(タブ幅単位)に合わせる
// 4) 選択範囲全体がコメントアウトされている場合は復帰
// 4) 選択範囲全体がコメントアウトされている場合は復帰
// ※空白とは半角スペースとタブのみを指す(全角スペースなどは含まない)
//
//
// Copyright (c) ks. All Rights Reserved.
// Copyright (c) ks. All Rights Reserved.
14行目: 24行目:
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------


var COM = "//";       // 単一行コメント
var COM = "//";     // 単一行コメント
 
switch (Document.Mode.toLowerCase()) {
case "bat":
  COM = "::";
  break;
case "visualbasic":
case "vbscript":
  COM = "'";
  break;
case "python":
case "ini":
  COM = "#";
  break;
}
 
var meGetLineLogical = 0;
 
var reg = new RegExp("^[ \\t]*" + COM);
var reg = new RegExp("^[ \\t]*" + COM);
var scrollY = window.ScrollY;
var scrollY = window.ScrollY;
var doc = editor.ActiveDocument;
var doc = editor.ActiveDocument;
var sel = doc.Selection;
var sel = doc.Selection;
24行目: 50行目:
var t = "";
var t = "";
var tab = GetTabSpace();
var tab = GetTabSpace();
sel.SetActivePoint(mePosLogical, document.GetLine(ed, meGetLineLogical).length+1, ed);
sel.SetAnchorPoint(mePosLogical, 1, st);
var lines = sel.Text.split("\n");
sel.Untabify();
var linesWithoutTab = sel.Text.split("\n");
doc.Undo();


// インデント取得
// インデント取得
var indent = -1;
var indent = -1;
var existNotCommentLine = false;   // 空白・コメント行でない行が存在するか
var existNotCommentLine = false; // 空白・コメント行でない行が存在するか
for (var i=st; i<=ed; i++) {
for (var i=0, len=linesWithoutTab.length; i<len; i++) {
    var s = doc.GetLine(i);
  var s = linesWithoutTab[i];
    var left = tab2space(s, tab).search(/[^ ]/);
  var left = s.search(/[^ ]/);
    if (left >= 0 && (indent < 0 || left < indent)) {
  if (left >= 0 && (indent < 0 || left < indent)) {
        // インデントはタブ幅単位(左寄せ)
    // インデントはタブ幅単位(左寄せ)
        indent = Math.floor(left/tab)*tab;
    indent = Math.floor(left / tab) * tab;
    }
  }
    if (left >= 0) {
  if (left >= 0) {
        // コメント行判定
    // コメント行判定
        if (!existNotCommentLine && s.search(reg) == -1) {
    if (!existNotCommentLine && s.search(reg) == -1) {
            existNotCommentLine = true;
      existNotCommentLine = true;
        }
     }
     }
  }
}
}


// コメントアウト
// コメントアウト
if (existNotCommentLine) {
if (existNotCommentLine) {
    for (var i=st; i<=ed; i++) {
  for (var i=0, len=lines.length; i<len; i++) {
        var s = doc.GetLine(i, meGetLineWithNewLines);
    var s = lines[i] + "\n";
        // 空白行はコメントアウトしない
    // 空白行はコメントアウトしない
        if (s.search(/[^ \t\n]/) == -1) {
    if (s.search(/[^ \t\n]/) == -1) {
            t += s;       // この行を消すと空白行を空行に変換
      t += s;
            continue;
      continue;
        }
    }
       
        // 挿入位置をタブと空白を考慮して決定
    // 挿入位置をタブと空白を考慮して決定
        var index = 0, j;
    var index = 0, j;
        for (j=0; index<indent; j++) {
    for (j=0; index<indent; j++) {
            // indent の範囲には半角スペースかタブしかない
      // indent の範囲には半角スペースかタブしかない
            if (s.charAt(j) == " ") {
      if (s.charAt(j) == " ") {
                index += 1;
        index += 1;
            } else {
      } else {
                index += tab - (index % tab);
        index += tab - (index % tab);
            }
      }
        }
        t += s.substring(0, j) + COM + s.substring(j);
     }
     }
    t += s.substring(0, j) + COM + s.substring(j);
  }
}
}
// コメントから復帰
// コメントから復帰
else {
else {
    for (var i=st; i<=ed; i++) {
  for (var i=0, len=lines.length; i<len; i++) {
        var s = doc.GetLine(i, meGetLineWithNewLines);
    var s = lines[i] + "\n";
        if (s.match(reg)) {
    if (s.match(reg)) {
            t += s.replace(COM, "");   // 先頭のコメントのみ削除
      t += s.replace(COM, ""); // 先頭のコメントのみ削除
        } else {
    } else {
            t += s;
      t += s;
        }
     }
     }
  }
}
}


// コメントアウト部分を書き換えて,全体を選択
// コメントアウト部分を書き換えて、全体を選択
sel.SetActivePoint(mePosLogical, document.GetLine(ed).length+1, ed);
sel.SetActivePoint(mePosLogical, document.GetLine(ed, meGetLineLogical).length+1, ed);
sel.SetAnchorPoint(mePosLogical, 1, st);
sel.SetAnchorPoint(mePosLogical, 1, st);
sel.Text = t.substring(0, t.length-1);       // 最後の改行は除去
sel.Text = t.substring(0, t.length-1);     // 最後の改行は除去
sel.SetAnchorPoint(mePosLogical, 1, st);
sel.SetAnchorPoint(mePosLogical, 1, st);
window.ScrollY = scrollY;
window.ScrollY = scrollY;
91行目: 124行目:
// タブ幅を取得
// タブ幅を取得
function GetTabSpace() {
function GetTabSpace() {
    var doc = editor.ActiveDocument;
  var doc = editor.ActiveDocument;
    var sel = doc.Selection;
  var sel = doc.Selection;
    sel.EndOfDocument();
  sel.EndOfDocument();
    doc.Write("\n\t");
  doc.Write("\n\t");
    sel.SetAnchorPoint(mePosLogical, sel.GetActivePointX(mePosLogical)-1, sel.GetActivePointY(mePosLogical));
  sel.SetAnchorPoint(mePosLogical, sel.GetActivePointX(mePosLogical)-1, sel.GetActivePointY(mePosLogical));
    sel.Untabify();
  sel.Untabify();
    var n = sel.Text.length;
  var n = sel.Text.length;
    doc.Undo();
  doc.Undo(); doc.Undo();
    doc.Undo();
 
  return n;
    return n;
}
 
// 空白以外の文字が出現するまでのタブをスペースに変換
function tab2space(s, tab) {
    var len = s.search(/[^ \t]/);
    if (len < 0) {
        len = s.length;
    }
    var index = 0;
    var t = "";
    var space = "";
    for (var i=0; i<tab; i++) {
        space += " ";
    }
    for (var i=0; i<len; i++) {
        if( s.charAt(i) == " " ){
            t += " ";
            index++;
        } else {
            t += space.substring(index % tab);
            index += tab - (index % tab);
        }
    }
    return t + s.substring(len);
}
}
</source>
</syntaxhighlight>

2025年11月24日 (月) 16:24時点における最新版

概要[編集]

Eclipse風なコメントアウト <=> コメントの除去を行います。

変更履歴[編集]

  • 1.0.1 (2013-08-31)
    • 編集モードによるコメント文字変更追加
  • 1.0.0 (2012-08-30)
    • 初版

ソースコード[編集]

#title = "選択行コメントアウト"

// -----------------------------------------------------------------------------
// Eclipse風なコメントアウト
// 複数行一括コメントアウト、復帰マクロ
// 1) 対象は行全体(行途中の選択も行全体とみなす)
// 2) 空白行はコメントアウトしない
// 3) インデントは選択行の範囲で一番左(タブ幅単位)に合わせる
// 4) 選択範囲全体がコメントアウトされている場合は復帰
//
// Copyright (c) ks. All Rights Reserved.
// www:    http://merysmacro.seesaa.net/
// -----------------------------------------------------------------------------

var COM = "//";      // 単一行コメント

switch (Document.Mode.toLowerCase()) {
case "bat":
  COM = "::";
  break;
case "visualbasic":
case "vbscript":
  COM = "'";
  break;
case "python":
case "ini":
  COM = "#";
  break;
}

var meGetLineLogical = 0;

var reg = new RegExp("^[ \\t]*" + COM);
var scrollY = window.ScrollY;
var doc = editor.ActiveDocument;
var sel = doc.Selection;
var st = sel.GetTopPointY(mePosLogical);
var ed = sel.GetBottomPointY(mePosLogical);
var t = "";
var tab = GetTabSpace();

sel.SetActivePoint(mePosLogical, document.GetLine(ed, meGetLineLogical).length+1, ed);
sel.SetAnchorPoint(mePosLogical, 1, st);
var lines = sel.Text.split("\n");
sel.Untabify();
var linesWithoutTab = sel.Text.split("\n");
doc.Undo();

// インデント取得
var indent = -1;
var existNotCommentLine = false;  // 空白・コメント行でない行が存在するか
for (var i=0, len=linesWithoutTab.length; i<len; i++) {
  var s = linesWithoutTab[i];
  var left = s.search(/[^ ]/);
  if (left >= 0 && (indent < 0 || left < indent)) {
    // インデントはタブ幅単位(左寄せ)
    indent = Math.floor(left / tab) * tab;
  }
  if (left >= 0) {
    // コメント行判定
    if (!existNotCommentLine && s.search(reg) == -1) {
      existNotCommentLine = true;
    }
  }
}

// コメントアウト
if (existNotCommentLine) {
  for (var i=0, len=lines.length; i<len; i++) {
    var s = lines[i] + "\n";
    // 空白行はコメントアウトしない
    if (s.search(/[^ \t\n]/) == -1) {
      t += s;
      continue;
    }
 
    // 挿入位置をタブと空白を考慮して決定
    var index = 0, j;
    for (j=0; index<indent; j++) {
      // indent の範囲には半角スペースかタブしかない
      if (s.charAt(j) == " ") {
        index += 1;
      } else {
        index += tab - (index % tab);
      }
    }
    t += s.substring(0, j) + COM + s.substring(j);
  }
}
// コメントから復帰
else {
  for (var i=0, len=lines.length; i<len; i++) {
    var s = lines[i] + "\n";
    if (s.match(reg)) {
      t += s.replace(COM, "");  // 先頭のコメントのみ削除
    } else {
      t += s;
    }
  }
}

// コメントアウト部分を書き換えて、全体を選択
sel.SetActivePoint(mePosLogical, document.GetLine(ed, meGetLineLogical).length+1, ed);
sel.SetAnchorPoint(mePosLogical, 1, st);
sel.Text = t.substring(0, t.length-1);      // 最後の改行は除去
sel.SetAnchorPoint(mePosLogical, 1, st);
window.ScrollY = scrollY;


//========================================
// 関数
//========================================
// タブ幅を取得
function GetTabSpace() {
  var doc = editor.ActiveDocument;
  var sel = doc.Selection;
  sel.EndOfDocument();
  doc.Write("\n\t");
  sel.SetAnchorPoint(mePosLogical, sel.GetActivePointX(mePosLogical)-1, sel.GetActivePointY(mePosLogical));
  sel.Untabify();
  var n = sel.Text.length;
  doc.Undo(); doc.Undo();
 
  return n;
}
スポンサーリンク