◀Unicode版開発トップへ
  • 2091 grep実行結果を標準出力する機能
    • 2092 Re:grep実行結果を標準出力する機能
      • 2093 Re2:grep実行結果を標準出力する機能
        • 2094 Re3:grep実行結果を標準出力する機能
          • 2095 Re4:grep実行結果を標準出力する機能
            • 2096 Re5:grep実行結果を標準出力する機能
              • 2097 Re6:grep実行結果を標準出力する機能
  • [2091] grep実行結果を標準出力する機能 sajim 2014年01月26日 19:09

    開発の現場でsakuraエディタを使っています。
    ソースコードを一部改変して必要機能を追加しているのですが、
    追加した機能とソースの修正箇所などを共有したいと思います。
    問題なければ時期リリースに組み込んでいただきたいです。

    <背景>
    複数回のgrep実行(正規表現あり)をバッチ等で連続実行したい。

    <要求>
    windowsコンソールからsakuraをgrep実行し、
    grep結果をコンソール(標準出力)に出力したい。
    具体的には以下を満たすように改善したい。

    ①grep終了後、sakuraがプロセス終了すること。
    ②grep結果を標準出力に出力できること。

    <実現方法>
    ①にかかわる修正
    ・修正箇所
     Source File : CViewCommander_Clipboard.cpp
     Function Name : Command_ADDTAIL
    ・修正内容
     Command_ADDTAIの最終行に以下を追記
     std::wcout.imbue(std::locale(”japanese”));
     std::wcout << pszData;
    ②にかかわる修正
    ・修正箇所
     Source File : CNormalProcess.cpp
     Function Name : InitializeProcess
    ※”if( !bGrepDlg ){”のIF処理内部
    ・修正内容
     return true;をreturn false;に変更し、
     プロセスを終了させるように変更する。

    <影響・デグレ等>
    ②について
     コンソールでgrep実行後、プロセスが落ちるようになる。
     現行仕様ではコンソールでGUI起動しているが、そもそも需要はあるのか?

    以上、ご確認お願いいたします。
    • [2092] Re:grep実行結果を標準出力する機能 もか 2014年01月26日 23:15

      GREPの引数にオプションを追加して対応することになると思います。
      あとGrep結果には、3000文字ぐらいの制限があるので、結果を使う場合注意する必要があります。
      >  std::wcout.imbue(std::locale(”japanese”));
      >  std::wcout << pszData;
      とりあえず、それだとNUL文字以降が切れるので困るケースがあるとおもいます。

      C++のWide系処理群はいろいろバグがあるような気がします。
      なんか、下記URLなどを読むと不安です。
      http://cpplover.blogspot.jp/2007/07/locale.html
      http://d.hatena.ne.jp/ir9Ex/20060820/1156018812
      http://0xc000013a.blog96.fc2.com/?mode=m&no=226
       MSのライブラリの影響(とmingwとかの場合で違ったりすると困る)を抑えたいので、
      std::wcoutは、利用したくないです。
      サクラエディタのCShiftJisを使うと、NEC選定とIBM選定文字などが化けずに出力できる利点もあります。

      > return false;
      それだといろいろ後処理が走らなくなるので、MYWM_CLOSEをPostするようにしてみました。
      -GOPT=O を指定すると、このモードになるようにしてあります。
      という感じのものをトラッカーに登録しました。
      確認してください。
      https://sourceforge.net/p/sakura-editor/patchunicode/762/
      • [2093] Re2:grep実行結果を標準出力する機能 LR4 2014年01月26日 23:54

        ▼ もかさん
        昔、他のアプリで似たようなことをやろうとして、何日もかけて調査したのですが、/SUBSYSTEM:WINDOWSで作成したGUIアプリは、WinMainに到達するよりも前に起動元コンソールの標準入出力(stdin,stdout)から切り離されてしまうようで、できませんでした。
        無理やり起動元コンソールにWriteFileで何か書き込むことはできても、パイプやリダイレクトなどは全くできず標準出力として機能しなかった覚えがあります。
        (起動元とは別のコンソールを開いてそこに出すというのも意味がないですし…)
        当時は不可能だと断念したのですが、できるものなのでしょうか?

        > https://sourceforge.net/p/sakura-editor/patchunicode/762/
        ちょっと動かしてみましたが、標準出力には何も出ませんでした。
        コンソールはコマンドを叩いてすぐ、プログラムの終了を待たずに、次のコマンド入力待ちになりました。(プログラムが動作開始するよりも前にプロンプトはそのプログラムを切り離し、次のプログラムを受け入れる準備まで整えている状態)
        • [2094] Re3:grep実行結果を標準出力する機能 もか 2014年01月27日 00:33

          CMDの画面には何も出ませんが、リダイレクトするとファイルに出力されますよ。
          >sakura -GREPMODE -GOPT=O (中略) | TYPE CON
          だとだめですが、
          >sakura -GREPMODE -GOPT=O (中略) | catのようなもの
          だと画面に表示されました。
          あと、サクラエディタの外部コマンド実行で実行すると結果を取得できます。

          XPのときには使えたと思います。確認したのはWin7です。
          • [2095] Re4:grep実行結果を標準出力する機能 LR4 2014年01月27日 00:54

            ▼ もかさん
            > >sakura -GREPMODE -GOPT=O (中略) | catのようなもの
            > だと画面に表示されました。

            をぉ、なんと、| more で表示できました。> grep.txt でファイル出力も。
            普通には何も表示されないので、できないとばかり思ってました。
            目から鱗です。
            実装されるとしたら、ヘルプに説明が必要ですね。
            • [2096] Re5:grep実行結果を標準出力する機能 sajim 2014年01月28日 13:20

              >LR4さん
              >もかさん

              ご検証いただきありがとうございます。
              標準出力はうまくできているようでいろいろ問題があったようですね。

              結果をlogフォルダに格納する、そもそもGUI起動にしないとかいかがでしょうか?
              後者は既存ロジックにかなり手が入ることになってしまいますが・・・。

              引き続きご検討お願いいたします。

              • [2097] Re6:grep実行結果を標準出力する機能 もか 2014年01月28日 22:27

                >GUI起動にしない
                する・しないではなくexeファイルのヘッダ情報に「CUI/GUIフラグ」があって、
                それがGUIになっているとこうなります。
                CUI(/SUBSYSTEM:CONSOLE)にすると普通の起動のときにコマンドウィンドウが表示されるようになるので、
                変更するわけにもいきません。

                v3に更新しました。
                ・出力するエンコードをファイルのエンコードに変更