◀一般トップへ
  • 3317 スマートインデントC/C++で半角スペースを入れたい
    • 3341 Re:スマートインデントC/C++で半角スペースを入れたい
      • 3342 Re2:スマートインデントC/C++で半角スペースを入れたい
        • 3343 Re3:スマートインデントC/C++で半角スペースを入れたい
          • 3344 Re4:スマートインデントC/C++で半角スペースを入れたい
            • 3405 Re5:スマートインデントC/C++で半角スペースを入れたい
              • 3422 Re6:スマートインデントC/C++で半角スペースを入れたい
  • [3317] スマートインデントC/C++で半角スペースを入れたい ジャム 2003年09月25日 19:23

    タイプ別設定の
    スマートインデント C/C++ を選択したときに
    半角スペースでインデントしたいのですが、
    必ずタブでインデントされてしまいます。

    タイプ別設定のレイアウトでSPACEの挿入をチェックしたときは
    半角スペースでインデントしてもらいたいと思うのですが
    仕様なのでしょうか?

    例:
    void main(){
    ^ int test;
    ↑ここに半角スペースを挿入したい。

    環境:
    SAKURA Ver.1.3.10.2
    Windows 2000 pro
    • [3341] Re:スマートインデントC/C++で半角スペースを入れたい ジャム 2003年10月03日 11:20


      マクロで、保存する前にタブをスペースに
      置き換えることでも解決しそうですが、
      スマートインデント C/C++ を使ったとき
      だけ動作が違うようですので、
      根本的にバグでしょう。
      直してもらった方が良さそうです。

      ユーザーの要望として

      「タイプ別設定のレイアウトでSPACEの挿入をチェック
      したときは、スマートインデント C/C++ を選択した
      ときも、タブでは無く SPACE でインデントする。」

      ように修正を願います。
      • [3342] Re2:スマートインデントC/C++で半角スペースを入れたい すい 2003年10月04日 04:07

        当分は直らないでしょう(汗)

        ↓詳しくはこの掲示板の過去ログこの辺、見てね
        2763番 2003/02/25
        2710番 2003/02/10
        1797番 2002/05/02

        スマートインデント C/C++ の箇所はソースが複雑に入り組んでいて。
        メモリリークなんかのバグもあるらしく。
        んで、動作仕様的に単純なスマートインデントじゃなくて
        「そこまでやられると却って余計なお世話」的な動作も含まれていて。
        「これ、1から作り直した方が良いんじゃ...」と言う声もあり、、、
        「誰か一から作り直してくれないかな~」と思いつつ、
        しかし、どのような動作仕様が良いのか仕様もまとまらず。
        常連衆は軒並み諦めモードでスマートインデント C/C++なんて使っておらず。。。

        な、感じです。まとめると。
        皆、「この機能を不満に思って直してくれる方」が現れるのを待っている状態です。
        • [3343] Re3:スマートインデントC/C++で半角スペースを入れたい ジャム 2003年10月06日 12:04

          すいさん、ご回答ありがとうございます。

          そのような背景があったとは。。。

          という訳で、
          試しにソースコードを見てみました。

          class: CEditView
          Method: SmartIndent_CPP( char cChar )

          のところですね。
          メソッドの中程に、タブコードを直接入れ混んでいる
          ところがありました。
          ここを直せばと思いますが、
          確かに、このアルゴリズムを理解した上で
          修正するのは苦しそうですね。

          SAKURAをプログラミングに使っているユーザーとして、
          ちゃんとしたスマートインデントは是非欲しい~
          と思いますが惜しいな。。。
          • [3344] Re4:スマートインデントC/C++で半角スペースを入れたい wmlhq 2003年10月06日 13:40

            無償サポート期間は終わったけど、惨めな奴が多すぎるので手伝ったろう。
            ここの処理のゴールは

            ReplaceData_CEditView
            MoveCursor
            m_pcOpeBlk, nCaretPos*を更新する

            だから、ReplaceData_CEditViewの引数見やがれ。pszData、nDataLenを置いてんだろ?

            pszData[nDataLen] = '\t';
            pszData[nDataLen + 1] = '\0';
            ++nDataLen;

            それから、ひとまず'('、')'に対するインデントをコメント化して無効にしとけ。
            • [3405] Re5:スマートインデントC/C++で半角スペースを入れたい wmlhq 2003年10月17日 15:07

              これでテストお願い。
              + int nTab = m_pcEditDoc->m_cLayoutMgr.GetTabSpace();
              ...

              // キャレットがタブストップ位置にあると仮定する。
              nDataLen = m;
              - pszData = new char[nDataLen + 2]; // strlen("\t\0") == 2
              + pszData = new char[nDataLen + nTab + 1];
              memcpy( pszData, pLine2, nDataLen );
              if( CR == cChar
              || '{' == cChar
              || '(' == cChar
              ){
              - pszData[nDataLen] = '\t';
              - pszData[nDataLen + 1] = '\0';
              + memset(pszData[nDataLen], ' ', nTab);
              + pszData[nDataLen + nTab + 1] = '\0';
              - ++nDataLen;
              + nDataLen += nTab;
              }else{
              pszData[nDataLen] = '\0';
              • [3422] Re6:スマートインデントC/C++で半角スペースを入れたい げんた 2003年10月18日 18:28

                >+ memset(pszData[nDataLen], ' ', nTab);
                これだと,常にTAB幅のスペースを入れることになるので次のTAB位置には移動しないのではないかと.

                ---
                ついでに一言.
                コードの話やパッチは(一般掲示板で報告された内容でも)開発掲示板の方に書き込んでください.
                こちらでは仕様に関する話を中心に.と,掲示板説明には書いてあるのですが(T_T)

                理由は,実装の話で一般掲示板のスレッドを延ばしたくないのが1つ.もう1つは後から取り込むときにチェックする場所を1つにしたい.