ソースのコメントを外すNo.04904
あつし さん 05/11/01 18:43
 
プログラムソースの現在行をコメントにするのに、誰かに作って貰った以下のマクロ
を使っていますが、元に戻す(コメントを外す)のは手作業でやっています。
疲れてきたので、誰かマクロを作ってくれないでしょうか?
出来れば、一つのマクロで、コメント行ならコメントを外し、そうでないならコメン
トにする、がよいのですが。
済みません、自分では未だマクロかけないです。

// 現在行をコメントアウト
golinetop;
while ( code == ' ' || code == '\t' ) {
  right ;
}
insert "# ";
golinetop;
down;

[ ]
RE:04904 ソースのコメントを外すNo.04905
あべのり さん 05/11/01 20:04
 
>プログラムソースの現在行をコメントにするのに、誰かに作って貰った以下のマク
>ロを使っていますが、元に戻す(コメントを外す)のは手作業でやっています。
>疲れてきたので、誰かマクロを作ってくれないでしょうか?
>出来れば、一つのマクロで、コメント行ならコメントを外し、そうでないならコメ
>ントにする、がよいのですが。
>済みません、自分では未だマクロかけないです。
>
IKKIさんのコメント操作マクロが使えないでしょうか?
http://www18.big.or.jp/~fujiwara/ikki/hidemaru/

[ ]
RE:04905 ソースのコメントを外すNo.04906
Kamonohasi さん 05/11/01 23:18
 
>IKKIさんのコメント操作マクロが使えないでしょうか?
>http://www18.big.or.jp/~fujiwara/ikki/hidemaru/
ここに書く事じゃないかも知れませんが、私も使っているのにインデント機能がある
のに気づいていませんでした(汗)

これだけじゃなんですので、
golinetop;
while( ( code == ' ' || code == '\t' ) && (code!=eof && code!='\n')){
  right ;
}
if(gettext2(column,lineno,column+2,lineno)=="# "){
 delete;delete;
}else{
 insert "# ";
}
golinetop;
down;
endmacro;

[ ]
RE:04905 ソースのコメントを外すNo.04907
あつし さん 05/11/01 23:25
 
>IKKIさんのコメント操作マクロが使えないでしょうか?
>http://www18.big.or.jp/~fujiwara/ikki/hidemaru/

有り難う御座います。これは優れものです。
で、ここで聞くのもなんなんですが、
最後の「これ」とあるようには出来ないでしょうか?
with=spaceにして、その場所をブロックで選択すれば出来るのですが、
面倒なので、行指定で最後のようになって欲しいのですが。

---------
  def foo()
    bar()
  end
--------- with=space
#   def foo()
#     bar()
#   end
--------- with=space,indent
  # def foo()
    # bar()
  # end
--------- これ
  # def foo()
  #   bar()
  # end
---------


[ ]
RE:04907 ソースのコメントを外すNo.04908
ENCODINGSHIFTJIS さん 05/11/02 14:52
 

>---------
>  def foo()
>    bar()
>  end
>---------
↑↓
>--------- これ
>  # def foo()
>  #   bar()
>  # end
>---------

#topy=seltopy; // 選択範囲の記憶
#endy=selendy;
 replaceall "^" , " #" , regular,inselect;
moveto 0,#topy; beginsel; // もう一度選択
moveto 0,#endy;
 replaceall "^ # #" , "" , regular,inselect;

みたいな、ものでしょうか

[ ]
RE:04907 ソースのコメントを外すNo.04909
あべのり さん 05/11/03 00:20
 
>有り難う御座います。これは優れものです。
>で、ここで聞くのもなんなんですが、
>最後の「これ」とあるようには出来ないでしょうか?
>with=spaceにして、その場所をブロックで選択すれば出来るのですが、
>面倒なので、行指定で最後のようになって欲しいのですが。

IKKIさんのところで本人から回答があったようですが,無理のようですね.
とりあえずはIKKIさん自身の回答のようににしてみはいかがでしょう.

ちなみに,秀丸を使い続けるならマクロをかけるようになることを強くお勧めします.

[ ]
RE:04909 ソースのコメントを外すNo.04913
あつし さん 05/11/04 17:55
 
自分好みに作ってみました。
movetoとmovetolinenoで、指定が0、1と違うし、まだバグがあるかも。お礼の意味
もこめてコードをアップします。

// 行の{アン}コメント(範囲選択しても、しなくても良い)
// 2005-11-02 元ネタを教えてもらう
//            http://www.maruo.co.jp/hidesoft/4/index.html
// 2005-11-04 文字の際左の位置から{アン}コメントする、行志向だぁ

if (selecting) {
  #topy=seltoplineno; // 選択範囲の記憶(行番号指定)
  #endy=selendlineno;
  // カーソルが先頭の場合は、その行は対象外とする
  if (x == 0) { #endy = #endy - 1; }
} else {
  #topy=lineno; // 現在カーソル位置
  #endy=lineno;
}

// message "#topy=" + str(#topy) + " #endy=" + str(#endy);

// 際左の位置を探す
movetolineno 0,#topy;
golinetop;
#start_x = 999;

// message "lineno " + str(lineno);
// message "#endy " + str(#endy);

while (lineno <= #endy) {
  // message "__w1__ 1 lineno=" + str(lineno) + " ,endy=" + str(#endy);
  while ( code == ' ' || code == '\t' ) { right; }
  if (x < #start_x) { #start_x = x; }
  golinetop;
  down;
}
// message "#start_x=" + str(#start_x);

// movetolinenoのために1足す
#start_x_line = #start_x + 1;

// 変換実行
movetolineno 0,#topy;
while (lineno <= #endy) {
  while ( code == ' ' || code == '\t' ) { right; }
  if (code == '#') {  // コメントをuncomment
    // message "un_comment at " + str(lineno);
    delete;
    if (code == ' ') { delete; }  // "# "の場合
  } else {
    // message "comment at " + str(lineno);
    movetolineno #start_x_line,lineno;  // コメントの開始位置
    insert "# ";
  }
  golinetop;
  down;
}

// 最初の位置へ
movetolineno 0,#topy;


[ ]
RE:04913 ソースのコメントを外すNo.04914
IKKI さん 05/11/05 01:16
 
IKKI です。こんにちは。

簡潔で良いマクロになりそうだと思います。気づいた点をいくつか…

・タブでインデントしている場合、変な結果になります。
 また、行が折り返している場合はどうでしょうか。
 x と column は必ずしも一致しないので、うまく使い分ける必要があります。

・golinetop; down; だと行が折り返してるとき変な結果になるので、
 movetolineno 1, lineno + 1; の方がいいかもしれません。

・範囲選択中のカーソル位置 (x, y) は範囲の始端かもしれません。
 if (x == 0) よりも if (selendcolumn == 0) の方がよさそうです。

[ ]