複数行コメント,ユーザー定義と言語指定No.33790
LIBE さん 14/12/20 09:13
 
複数行コメント定義について,ユーザ定義で普段使っているのですが,C言語の #if
#else などのプリプロセッサディレクティブの定義がうまくできません.
そこで,#if などの部分に関しては言語指定から引っ張り,その他の部分は自分の定
義した色指定を適用したいと考えています.

#ifdef などを指定するフォームで保存,保存したファイルをユーザー定義で読み込
もうとするとエラーが発生し,「何も読み込まれませんでした.hiligitファイルに
「読み込む対象」のデータが含まれている必要があります」と表示されました.保存
したファイル名を検索したところ保存されたファイルはPC上に存在していないようで
す.

どのように操作すればよいでしょうか,教えていただけると嬉しいです.

[ ]
RE:33790 複数行コメント,ユーザー定義とNo.33792
秀丸担当 さん 14/12/22 10:40
 

複数行コメントの「C言語/Java」の「#ifdef等のカラー表示」をONにしたときに
「保存...」して、それを複数行コメントの「ユーザー定義」で「読込み...」し
ようとしたときのことかと思います。

hilightファイルには幾つかの形式をまとめてセットで保存/読込みできますが、
#ifdef等のカラー表示だけを保存したhilightファイルを、複数行コメントの
ユーザー定義として読み込もうとしても、自動的に複数行コメントの形式には変
換はされないです。
#ifdef等のカラー表示は、入れ子になったり#elseの判定など、けっこう複雑に
なっていて、複数行コメントのユーザー定義では、似た感じにはできても完全な
再現は難しいと思います。

hilightファイルの存在は、保存/読込みの一覧に出ているのであれば、どこかに
存在するはずだと思います。
保存/読込みのダイアログボックスの下部に「設定ファイル用のフォルダ」とし
てパスが書かれているので、そのパスを直接エクスプローラのアドレスバーに入
力すると見つけられると思います。
または、[その他]→[動作環境]→[環境]で「設定ファイル用のフォルダ」をマイ
ドキュメント配下など、あらかじめわかりやすい場所に指定されておくことをお
勧めします。

[ ]
RE:33792 複数行コメント,ユーザー定義とNo.33793
LIBE さん 14/12/22 11:09
 
ありがとうございます.それでは,ユーザー定義で

「#if 1〜#else が開始文字列,終了文字列が #endif(ただし#if 1〜の途中で #end
if が見つかった場合は色付けしない)」

のような範囲で色付けをすることは可能でしょうか?

[ ]
RE:33793 複数行コメント,ユーザー定義とNo.33794
秀丸担当 さん 14/12/22 12:12
 

ユーザー定義で開始文字列そのものを複数行にして指定することはできないので、
なんとかするとしたら、自動的なものとはちょっと異なりますが、マクロを使っ
てカラーマーカーを付ける方法も考えられると思います。

例えば、条件そのままだとしたら、以下のようなマクロで任意の色を付けること
ができます。

setcompatiblemode 0x20000;
disabledraw;
#x=x;
#y=y;
$layer="ifdefcolor";
deletecolormarkerall $layer;
gofiletop;
while(1){
  searchdown2 "^\\s*#if 1\\n",regular;
  if(result==false){
    break;
  }
  moveto2 0,ytolineno(0,foundtopy)+1;
  searchdown2 "^\\s*(#endif|#else)",regular;
  if(result==false){
    continue;
  }
  if(strstr(gettext(foundtopx,foundtopy,foundendx,foundendy),"#else")
     < 0 ) {
    continue;
  }
  moveto2 0,ytolineno(0,foundtopy)+1;
  beginsel;
  searchdown2 "^\\s*#endif",regular;
  moveto foundtopx,foundtopy;
  endsel;
  colormarker 0xff00ff,-1,11,0,0,$layer;//紫色
}
escape;
moveto #x,#y;


[マクロ]→[マクロ登録]→[自動起動]でファイルを開いた直後や、編集した後に
任意のタイミングで実行したりすると、無理矢理ですが、なんとかユーザー定義
と両立もできると思います。
ただ入れ子などを考えるともうちょっと凝ったマクロにする必要があるかもしれ
ません。

[ ]
RE:33794 複数行コメント,ユーザー定義とNo.33795
LIBE さん 14/12/22 17:25
 
ふーむ,そうですか.ありがとうございました。

[ ]
RE:33795 複数行コメント,ユーザー定義とNo.33796
秀丸担当 さん 14/12/22 17:46
 

マクロはそのままでは完全ではなかったので、もうちょっと考えたマクロにして
みました。
このまま実行すると、ファイルタイプ別の設定で設定された#ifdef等のカラー表
示で色付けします。

$layer="ifdefcolor"; //レイヤー名
#color=0xff00ff;     //色

Label_Main: {
  setcompatiblemode 0x20000;
  if((filetype!=".c")
   &&(filetype!=".cpp")
   &&(filetype!=".h")
   ){
    endmacro;
  }
  loaddll "HmJre.dll";
  disabledraw;
  deletecolormarkerall $layer;
  #x=x;
  #y=y;
  call Label_LoadReg;
  gofiletop;
  #cNest=0;//#aValid[]//#aLineNo[]
  while(1){
    title "#ifdef等のカラー表示適用中:"+str(lineno);
    searchdown2
      "^\\s*(#(ifdef|ifndef|if|else|endif)\\s*)\\C(?\\1)"
      ,regular;
    if(result==false){
      if(#cNest==0) break;
      $found="#endif";
    } else {
      $found=gettext(foundtopx,foundtopy,foundendx,foundendy);
      moveto foundendx,foundendy;
    }
    if(strstr($found,"#ifdef")>=0){
      #derective=1;
      #iftype=0x00;
      #not=0;
    } else if(strstr($found,"#ifndef")>=0){
      #derective=1;
      #iftype=0x00;
      #not=1;
    } else if(strstr($found,"#else")>=0){
      #derective=2;
    } else if(strstr($found,"#endif")>=0){
      #derective=3;
    } else {//#if
      #derective=1;
      #iftype=0x02;
      #not=0;
    }
    if(#derective==1){
      $strWord=gettext2(column,lineno,linelen2,lineno);
      $strWord=dllfuncstr("ReplaceRegular","\\s",$strWord,0,"",2);
      $strWord=dllfuncstr("ReplaceRegular","//.*",$strWord,0,"",2);
      $strWord=dllfuncstr("ReplaceRegular","/\\*.*",$strWord,0,"",2);
      call Label_IsValid $strWord, #iftype;
      #valid=##return;
      if(#not!=0){
        if(#valid==1){
          #valid=2;
        } else if(#valid==2){
          #valid=1;
        }
      }
      #aValid[#cNest]=#valid;
      #aLineNo[#cNest]=lineno+1;
      #cNest=#cNest+1;
     
    } else if(#derective==2){
      if(#cNest>0){
        if(#aValid[#cNest-1]==1){
          #aValid[#cNest-1]=2;
          #aLineNo[#cNest-1]=lineno + 1;
        }else if(#aValid[#cNest-1]==2){
          colormarker #color,-1,11,0,0,$layer,
            #aLineNo[#cNest - 1], 0,
            lineno, 0;
          #aValid[#cNest-1]=1;
        }
      }
    } else if(#derective==3){
      if(#cNest>0){
        #cNest=#cNest-1;
        if(#aValid[#cNest]==2){
          colormarker #color,-1,11,0,0,$layer,
            #aLineNo[#cNest], 0,
            lineno, 0;
        }
      }
    }
    moveto2 0,lineno+1;
  }
  moveto #x,#y;
  endmacro;
}

Label_LoadReg: {
  openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\"
    +filetype;
  $$config=getregstr("");
  closereg;
 
  if( $$config!=""){
    $$configset="Config\\"+$$config;
  } else {
    $$configset="Default";
  }
  openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\"
    +$$configset;
  call Label_GetBinary "Defines",0x00;
  call Label_GetBinary "DefinesInvalid",0x01;
  call Label_GetBinary "Ifvalue",0x02;
  call Label_GetBinary "IfvalueInvalid",0x03;
  closereg;
  return;
}

Label_GetBinary: {
  ##cb=0;
  $$ab="";
  while(1){
    $$abRead=getregbinary($$1,##cb,1000);
    if($$abRead=="") break;
    $$ab=$$ab+$$abRead;
    ##cb=##cb+strlen($$abRead)/2;
  }
  if($$ab=="") return;
  ##cKeyword=0;
  ##i=0;
  while(1){
    $$strKeyword="";
    while(1){
      $$strByte=midstr($$ab,##i,2);
      if($$strByte==""||$$strByte=="00"){
        ##i=##i+2;
        break;
      }
      $$strChar=char(val("0x"+$$strByte));
      if($$strChar!=" "){
        $$strKeyword=$$strKeyword+$$strChar;
      }
      ##i=##i+2;
    }
    if($$strKeyword!=""){
      $astrKeyword[##2][##cKeyword]=$$strKeyword;
      ##cKeyword=##cKeyword+1;
    }
    if($$strByte=="") break;
  }
  #acKeyword[##2]=##cKeyword;
  return;
}

Label_IsValid: {
  ##i=0;
  ##iftypeValid=##2;
  ##iftypeInvalid=##iftypeValid+1;
  if( ##iftypeValid == 0x02 ) {
    if($$1=="1") return 1;
    if($$1=="0") return 2;
  }
  if($astrKeyword[##iftypeValid][0]=="//all"){
    return 1;
  } if($astrKeyword[##iftypeInvalid][0]=="//all"){
    return 2;
  }
  while(##i<#acKeyword[##iftypeValid]){
    if($astrKeyword[##iftypeValid][##i]==$$1){
      return 1;
    }
    ##i=##i+1;
  }
  ##i=0;
  while(##i<#acKeyword[##iftypeInvalid]){
    if($astrKeyword[##iftypeInvalid][##i]==$$1){
      return 2;
    }
    ##i=##i+1;
  }
  return 0;
}

[ ]