Cプログラムの整形を行うマクロNo.11720
uni さん 02/04/15 19:22
 
はじめまして。
秀丸をCとVerilogHDLのプログラミング演習に使おうと思っています。
そこで、プログラムの整形を行うマクロを探しています。

すぐ見つかるであろうと思い、Google等で探してみた物の、
見つかりませんでした。

もしご存知でしたら教えてください。よろしくお願いします。

[ ]
RE:11720 Cプログラムの整形を行うマクロNo.11722
小西 さん 02/04/15 19:48
 
>はじめまして。
>秀丸をCとVerilogHDLのプログラミング演習に使おうと思っています。
>そこで、プログラムの整形を行うマクロを探しています。
>
>すぐ見つかるであろうと思い、Google等で探してみた物の、
>見つかりませんでした。
>
>もしご存知でしたら教えてください。よろしくお願いします。
どの程度の整形をお望みかわかりませんので、秀丸マクロライブラリの2大有名サイ
トを紹介します。

秀まるおのホームページ
   http://hidemaru.xaxon.co.jp/

Vector
   http://www.vector.co.jp/


[ ]
RE:11722 Cプログラムの整形を行うマクロNo.11723
uni さん 02/04/15 20:17
 
>どの程度の整形をお望みかわかりませんので、秀丸マクロライブラリの2大有名サ
>イトを紹介します。
>
>秀まるおのホームページ
>   http://hidemaru.xaxon.co.jp/
>
>Vector
>   http://www.vector.co.jp/
>

早速の返信有難うございます。

整形の件ですが、例を言いますと、
#include <stdio.h>
main()
{
int i;

i=0;
while(i < 20){
printf("i = %d\n", i);
i++;
}
}

↑このようなプログラムを
↓のように整形する。

#include <stdio.h>
main()
{
    int i;

    i=0;
    while(i < 20){
        printf("i = %d\n", i);
        i++;
    }
}

このような、マクロを探しています。

教えていただいたサイトも既に探してみたのですが、
それらしき物は見つかりませんでした。
(私の検索不十分なのかも知れませんが。。)
ありそうな機能だと思うんですが、いまだに見つけられません。

よろしくお願いします。


[ ]
RE:11723 Cプログラムの整形を行うマクロNo.11724
spacemoon さん 02/04/15 22:16
 
こんにちは、spacemoonです。

秀丸エディタの標準機能でできると思います。

インデントを入れたい範囲を範囲選択して、Tabキーでインデントされます。また、S
hift+Tabキーでインデントを解除できます。

秀丸エディタのヘルプで「インデント」で検索してみてください。

プログラムのコーディングの時などよく使います。
お試しください。

[ ]
RE:11723 Cプログラムの整形を行うマクロNo.11725
小西 さん 02/04/15 22:32
 
なるほど、確かにないような(@@?

ちょこっとかいて見るとこんな感じかな?
範囲指定効かないで、全文整形のみですけど(^^;;

// マクロの始まり
selectall;
replaceall "^( |\\t)+", "", regular;

$t = "";
gofiletop;

#posy = 0;
#cmt  = 0;
#tt   = 0;
while( #posy < linecount2 ){
  golinetop;
  if(( code == 0x7d )&&(#cmt==0)){
    #len = strlen($t)-1;
    if( #len > 0 )
      $t = leftstr( $t, #len );
    else
      $t = "";
    #tt = 1;
  }
  else
    #tt = 0;

  insert $t;
  golinetop;
  #posx = 0;
  #st   = 0;
  #ll = linelen2;
  while( #posx < #ll ){
    if( #cmt == 1 ){
      if( code == 0x2a ){
        #posx = #posx + 1;
        right;
if( #posx >= #ll ) break;
        if( code == 0x2f ) #cmt = 0;
      }
    }else if(( code == 0x2f )&&( #st == 0 )){
      #posx = #posx + 1;
      right;
   if( #posx >= #ll ) break;
      if( code == 0x2f ) break;
      if( code == 0x2a ){
        #cmt = 1;
      }
    }else if( code == 0x27 ){
  if( #st == 0 ){
        #st = 2;
      }else{
        #st = 0;
      }
    }else if( code == 0x22 ){
  if( #st == 0 ){
        #st = 1;
      }else{
        #st = 0;
      }
    }else if( #st > 0 ){
      if( code == 0x5c ){
        #posx = #posx + 1;
        right;
if( #posx >= #ll ) break;
      }
    }else if( code == 0x7b ){
      $t = $t + "\t";
      break;
    }else if( code == 0x7d ){
      if( #tt == 0 ){
        #len = strlen($t)-1;
        if( #len > 0 )
          $t = leftstr( $t, #len );
        else
          $t = "";
        break;
      }else{
        #tt = 0;
      }
    }
    #posx = #posx + 1;
    right;
  }
  #posy = #posy + 1;
  down;
}
// マクロの終わり

これで次のようなパターンもOK

#include <stdio.h>
main()
{
int i;

i=0;
while(i < 20){
printf("i = %d\n", i);
i++;
}
int c = 10;
while(c){
// {
int a = c;
//}
/* ループの説明 {
// {
int a; // テンポラリ

printf( "\"{%d", a );
printf( "}\"" );

--c;
// }
} 説明終わり*/
printf( "\"{%d", a );
printf( "}\"" );
--c;
/**/ }
}





#include <stdio.h>
main()
{
int i;

i=0;
while(i < 20){
printf("i = %d\n", i);
i++;
}
int c = 10;
while(c){
// {
int a = c;
//}
/* ループの説明 {
// {
int a; // テンポラリ

printf( "\"{%d", a );
printf( "}\"" );

--c;
// }
} 説明終わり*/
printf( "\"{%d", a );
printf( "}\"" );
--c;
/**/ }
}

こんな具合になります。
コメントと、文字列にはだいぶ配慮したつもりですが、脇の甘いと琴があるかもしれ
ません。
それにしても、汚いコードやなぁ_(..;;

[ ]
RE:11725 Cプログラムの整形を行うマクロNo.11726
小西 さん 02/04/15 22:34
 
投稿して気がついたこと、
タブって効かないのね。
整形出力のタブを4タブで出した結果を示します。

#include <stdio.h>
main()
{
  int i;
 
  i=0;
  while(i < 20){
    printf("i = %d\n", i);
    i++;
  }
  int c = 10;
  while(c){
    // {
    int a = c;
    //}
    /* ループの説明 {
    // {
    int a; // テンポラリ
   
    printf( "\"{%d", a );
    printf( "}\"" );
   
    --c;
    // }
    } 説明終わり*/
    printf( "\"{%d", a );
    printf( "}\"" );
    --c;
    /**/ }
}

[ ]
RE:11726 Cプログラムの整形を行うマクロNo.11727
uni さん 02/04/15 22:53
 
小西さん本当に有難うございます。
こんな短時間に、サッとマクロを作ってしまわれるなんて、
すごいですね。驚きました。

本当に有難うございます。

そうなんですよね、結構探してみたんですけど、
こういうマクロ、結構需要があると思うのに、ありそうでなかったんですよね。

迷惑ついでに、
多言語(Verilog等)にも対応した正規版のプログラム整形マクロを作ってくれませ
んか?
とかお願いしてみたり・・。

有難うございました。


[ ]
RE:11727 Cプログラムの整形を行うマクロNo.11729
encodingshiftjis さん 02/04/15 23:11
 
コメント・文字列の処理は入っていませんが、参考に

----------------------------------------
//indentC.mac1行処理、オートインデントon、TAB 字下げ

golinetop2; searchdown2 "^[ ]+",regular; // 行頭空白+TAB
if(result) delete; left;

// 直前行に { があるか
selectline; $line=gettext(seltopx,seltopy,selendx,selendy);
golineend2; delete; insertreturn;  // オートインデント
if( strstr($line,"{") >= 0) insert "\t";

// この行に } があるか
selectline; $line=gettext(seltopx,seltopy,selendx,selendy);
if( strstr($line,"}") >= 0){
if( code == '' ) delete; // TAB 字上げ 'TAB' です
 }

down;// 次行に下がる


[ ]
RE:11727 Cプログラムの整形を行うマクロNo.11735
小西 さん 02/04/16 21:21
 
>そうなんですよね、結構探してみたんですけど、
>こういうマクロ、結構需要があると思うのに、ありそうでなかったんですよね。
そうですね。

>迷惑ついでに、
>多言語(Verilog等)にも対応した正規版のプログラム整形マクロを作ってくれませ
>んか?
>とかお願いしてみたり・・。
うーん。仕様をまとめてみないとわからないですけど結構面倒かも、
特に、私が使う可能性のある、Pascal,Ruby,Perlあたりの構文は面倒です。
検討はして見ます。

ところで、Verilogは私にとって初耳なんですがどんな言語なんでしょうか?

[ ]
RE:11735 Cプログラムの整形を行うマクロNo.11736
uni さん 02/04/16 23:09
 
>うーん。仕様をまとめてみないとわからないですけど結構面倒かも、
>特に、私が使う可能性のある、Pascal,Ruby,Perlあたりの構文は面倒です。
>検討はして見ます。
>
>ところで、Verilogは私にとって初耳なんですがどんな言語なんでしょうか?

検討を考えていただき有難うございます。
VerilogHDLはハードウェア記述言語です。
どんな言語かというと、説明できるほどのスキルがないので、
恐縮ですが、Cと似ている部分もあります、例えば

Cなら
if(i>0){
  a=b+c;
  k++;
}

と中括弧{}で囲みますが、

Verilogでは
if(i>0)
 begin
  a=b+c;
  k++;
 end

とbegin-endでくくります。

「Verilog」で検索していただければ結構ヒットすると思います。
私も出来る事なら少なからずお手伝いしたい次第ですが、
なにぶん、これから勉強する言語ですので、力になれなくて申し訳ありません。
その他、何か力になれそうな事があれば、お申し付けください。
非力ながら、お手伝いさせて頂きます。

[ ]
RE:11724 Cプログラムの整形を行うマクロNo.11737
uni さん 02/04/16 23:18
 
>こんにちは、spacemoonです。
>
>秀丸エディタの標準機能でできると思います。
>
>インデントを入れたい範囲を範囲選択して、Tabキーでインデントされます。また、
>Shift+Tabキーでインデントを解除できます。
>
>秀丸エディタのヘルプで「インデント」で検索してみてください。
>
>プログラムのコーディングの時などよく使います。
>お試しください。

返信遅れまして申し訳ないです。
この方法で、整形ができるのですか?

検索してみたんですが、「C言語インデント」機能っていうのがあるんですか?
すいません、どのように使うのかよろしくお願いします。

[ ]
RE:11724 Cプログラムの整形を行うマクロNo.11738
さん 02/04/17 10:59
 
小西です。spacemoonさんこんにちは。

>秀丸エディタの標準機能でできると思います。
>
>インデントを入れたい範囲を範囲選択して、Tabキーでインデントされます。また、
>Shift+Tabキーでインデントを解除できます。
残念ながら、単に全ての行にTABを追加するだけの機能なんですよね。
たとえば、下の例で全選択をしてTABを押すと
int foo(){
  while(1){
for(;;)
{
printf("");
}
}
}



[TAB]int foo(){
[TAB]  while(1){
[TAB]printf("");
[TAB]}
[TAB]}

となります。

[ ]