[▲前のスレッド]

2014/1/26 (日) 19:09:38 sajim  
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
[2091] grep実行結果を標準出力する機能
開発の現場でsakuraエディタを使っています。
ソースコードを一部改変して必要機能を追加しているのですが、
追加した機能とソースの修正箇所などを共有したいと思います。
問題なければ時期リリースに組み込んでいただきたいです。

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

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

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

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

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

以上、ご確認お願いいたします。

2014/1/26 (日) 23:15:09 もか  
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
[2092] Re:grep実行結果を標準出力する機能
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/

2014/1/26 (日) 23:54:38 LR4  
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
[2093] Re2:grep実行結果を標準出力する機能
▼ もかさん
昔、他のアプリで似たようなことをやろうとして、何日もかけて調査したのですが、/SUBSYSTEM:WINDOWSで作成したGUIアプリは、WinMainに到達するよりも前に起動元コンソールの標準入出力(stdin,stdout)から切り離されてしまうようで、できませんでした。
無理やり起動元コンソールにWriteFileで何か書き込むことはできても、パイプやリダイレクトなどは全くできず標準出力として機能しなかった覚えがあります。
(起動元とは別のコンソールを開いてそこに出すというのも意味がないですし…)
当時は不可能だと断念したのですが、できるものなのでしょうか?

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

2014/1/27 (月) 00:33:01 もか  
INCM1.23a
[2094] Re3:grep実行結果を標準出力する機能
CMDの画面には何も出ませんが、リダイレクトするとファイルに出力されますよ。
>sakura -GREPMODE -GOPT=O (中略) | TYPE CON
だとだめですが、
>sakura -GREPMODE -GOPT=O (中略) | catのようなもの
だと画面に表示されました。
あと、サクラエディタの外部コマンド実行で実行すると結果を取得できます。

XPのときには使えたと思います。確認したのはWin7です。

2014/1/27 (月) 00:54:09 LR4  
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
[2095] Re4:grep実行結果を標準出力する機能
▼ もかさん
> >sakura -GREPMODE -GOPT=O (中略) | catのようなもの
> だと画面に表示されました。


をぉ、なんと、| more で表示できました。> grep.txt でファイル出力も。
普通には何も表示されないので、できないとばかり思ってました。
目から鱗です。
実装されるとしたら、ヘルプに説明が必要ですね。

2014/1/28 (火) 13:20:53 sajim  
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.2; .NET CLR 1.1.4322; .NET4.0E)
[2096] Re5:grep実行結果を標準出力する機能
>LR4さん
>もかさん


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

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

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


2014/1/28 (火) 22:27:37 もか  
INCM1.23a
[2097] Re6:grep実行結果を標準出力する機能
>GUI起動にしない
する・しないではなくexeファイルのヘッダ情報に「CUI/GUIフラグ」があって、
それがGUIになっているとこうなります。
CUI(/SUBSYSTEM:CONSOLE)にすると普通の起動のときにコマンドウィンドウが表示されるようになるので、
変更するわけにもいきません。

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

[▼次のスレッド]
INCM/CMT
Cyclamen v3.81
[ut:0.010][st:0.000]