外部ツールの使い方について

  1. はじめまして。しばらく前から使わせていただいております。軽快でわかりやすい作りで、感謝しております。
    整形されていないjsonファイルをJQ.exeというツールで整形して表示できないかと考えていますが、外部ツールで工夫すれば可能でしょうか? (JQ: https://stedolan.github.io/jq/
    ちなみに、わからないまま 下記のように試行してみました。
    :外部ツール
    ・コマンド: jq.exe .
    ・アウトプットバー使用: チェック
    ・入力: 文書
    ・引数: なし
    ・カスタム: なし
    ・出力: 文書と置換
    ・ユニコードで出力: チェックなし 
    非整形のファイルを開いたまま、上記の外部ツールを実行すると、アウトプットバーには整形されて出力(漢字部分に文字化け有り)はされていますが、途中で表示が終わっているようで、文書の置換えは実行されず、外部ツールの「ツールジョブの中止」を実行することで、アウトプットバーの内容(途中までのもの)に置換えが行われました。(jsonファイルは15kB程度)
    よろしければアドバイスいただければと思います。よろしくお願いします。

     |  Hiro  |  返信
  2. はじめまして。ご愛用ありがとうございます。

    JQ.exe の使い方となるとちょっとサポート外ではありますが、一応試してみました。

    ↓ の「使ってみた」のセクションを参考にさせて頂きました。
    http://qiita.com/ksomemo/items/06fbf4a1fb024174bf80

    ① jq -R {\"a\":1,\"b\":2} 方式

    このパターンや、"JQ.exe . " で実行した場合は CTRL + C で処理を中断させないと出力が返ってこないのは JQ.exe の仕様のようです。残念ながら Mery の外部ツールの機能ではキーボード入力を送信する機能はありませんので、この方式の使い方では動かないと思います。

    ② echo {"a": 1, "b": 2} | jq 方式

    echo 出力をパイプで渡す方式だと、入力文書に改行が含まれた時点で echo の部分だけ実行されてしまうので無理ですね。

    ③ jq jq_file.json 方式

    編集中のファイルを一旦保存する必要がありますが、"JQ.exe . " にファイル名を渡してやる方式だと動きそうです。

    タイトル: JQ
    コマンド: jq.exe のパス
    引数:. "$(Path)"
    アウトプットバーを使用する:チェック
    入力:無し
    出力:文書と置換

    ただし、ちょっと長めのパスを渡すとクラッシュしてしまうようです。コマンドプロンプトから直接「JQ.exe . ファイル名」で呼び出した場合もクラッシュするので JQ.exe のバグだと思います…。

    他にも JQ.exe の使い方があるのかもしれませんが説明書が長すぎて把握できていません^^;

     |  Kuro  |  返信
  3. 追伸:

    長いパスを渡してもクラッシュしない方法を見つけました。
    バッチファイルを経由するのでちょっと面倒ですが…

    まず、以下のバッチを作成します。

    call_jq.bat
    --------
    @echo off
    type %1 | "jq.exe のパス" .
    --------

    Mery の外部ツールで下記の通り設定します。

    --------
    タイトル: JQ
    コマンド: call_jq.bat のパス
    引数:"$(Path)"
    アウトプットバーを使用する:チェック
    入力:なし
    出力:文書と置換
    --------

    外部ツールから実行する前に編集中の json ファイルは一度保存する必要があります。ちなみに日本語の文字化けは JQ.exe の仕様っぽいのでオプションか何かで対応できるのかもしれません。

     |  Kuro  |  返信
  4. いろいろと直接Meryと関係のないツールのことまで検討いただいて申し訳ありませんでした。
    jqは、いろいろできそうな反面、使いこなすのは難しい感じですね。
    ③については、やってみたところ、やはり、jq.exeは動作を停止しました。となりました。
    追伸の方法で、やってみたところ漢字以外はうまく表示されているようです。
    (単体のバッチで処理した場合には漢字の文字化けはなぜか発生しないようです)
    もう少し研究してみたいと思います。 今回はありがとうございました。

     |  Hiro  |  返信
  5. ご返信ありがとうございます。

    > いろいろと直接Meryと関係のないツールのことまで検討いただいて申し訳ありませんでした。

    いいえー。一応、誰かが回答してくれたらイイナーぐらいの感じで用意しているフォーラムなので、内容は何でも大丈夫ですよ。回答がつくかどうかは保証できませんが…^^;
    (最近、あんまり更新していないのでこのサイトを見てる人も少ないから回答も少ないかもしれません)

    > jqは、いろいろできそうな反面、使いこなすのは難しい感じですね。

    ちょっとクセがありますね。私もあれからもう少し調べてみましたが、かなり多機能で使いこなせば面白いツールだと思いました。

    > (単体のバッチで処理した場合には漢字の文字化けはなぜか発生しないようです)

    バッチの場合は大丈夫のようですが、コマンドプロンプトから "jq.exe ." を起動して直接 json 文字列を手入力してやるという本来の使い方をすると文字化けしてしまいますね。

    どうやら jq.exe が出力するのは utf8 形式に固定されているようで、Windows のコマンドプロンプトはデフォルトで SJIS (932) (Mery もそれに準拠) なのに jq.exe の出力が utf8 なので文字化けしてしまうのではないかと思います。

    一応、Mery の外部ツールからバッチを経由せず、いったん保存もせずに以前のレスの「①」の本来の方法で jq.exe に入力する方法は見つかりました。

    --------
    タイトル:JQ
    コマンド:jq.exe のパス
    引数:. (←ドットのみ)
    アウトプットバーを使用する:チェック
    入力:カスタム
    カスタム:
    $(DocText)
    [SUB] (←後ほど解説)
    出力:文書と置換
    ----

    カスタムの部分がポイントで、$(DocText) で編集中の内容を送信したあとに [SUB] (アスキーコード 0x001A) というファイルの末尾の目印を送ってやることで jq.exe から結果を受け取ることができるようです。

    [SUB] の部分は制御コードなので実際には表示されません (もしくは□になっちゃいます) が、Mery の Macros フォルダに入っている「特殊文字を入力.js」をマクロで実行して、文字コード値「001A」を入力してやれば Mery の編集エリアに「[SUB]」という制御コードが入力されますので、この [SUB] の部分をコピーして、外部ツールの「カスタム」のエリアに貼り付けてやれば入力することができます。

    これで jq.exe の本来の使い方で、編集中の文書に対しても整形できるようになりました。↑ ここまでは現在のバージョンの Mery で対応可能です。

    で、残る問題は文字化けですが、こればっかりは jq.exe の utf8 出力を Mery 側でデコードしてやる必要があるため現在の Mery では対応できません。jq.exe でシフト JIS が使用できるオプションがあればイケそうですが、ないかなぁ…。

    そこで、こういったケースにも対応できるように Mery 側で文字コードを指定して外部ツールを呼び出す仕組みを試験的に作ってみたところ上手くいきましたので、次のバージョンでは対応できそうです。

    この土日あたりにはリリースできると思いますので今しばらくお待ちください。たぶん…^^;

     |  Kuro  |  返信
  6. > どうやら jq.exe が出力するのは utf8 形式に固定されているようで、Windows のコマンドプロンプトはデフォルトで SJIS (932) (Mery もそれに準拠) なのに jq.exe の出力が utf8 なので文字化けしてしまうのではないかと思います。

    どうも、そのようですね。バッチからjq.exeを抜いてtypeコマンドだけでも同様に文字化けするということで、chcp 65001とかも入れてみましたが、駄目でした。

    >本来の方法で jq.exe に入力する方法は見つかりました。

    おお~。これができればバッチも不要でシンプルになりますね。
    外部ツールのカスタムの部分を入力する方法は、やってみたところ、なぜだかアウトプットバーに出力されるはずのデータも表示されず、待ちの状態のままとなります。うーん....この場合、$(DocText)には 引用符とか>はいらないですよね?

    >この土日あたりにはリリースできると思いますので今しばらくお待ちください。たぶん…^^;

    急いでるわけではありませんので、そちらの都合にあわせていただければと思います。ありがとうございます。(ペコリ)

     |  Hiro  |  返信
  7. ご確認ありがとうございます。

    > 外部ツールのカスタムの部分を入力する方法は、やってみたところ、なぜだかアウトプットバーに出力されるはずのデータも表示されず、待ちの状態のままとなります。うーん....この場合、$(DocText)には 引用符とか>はいらないですよね?

    あらら… 引用符とかは必要ないですね。jq のバージョンなども関係しているのかもしれません。こちらは jq 1.5 と Mery 2.5.4 で下記の画像の通りの設定で jq.exe 直接モードで動きました。

    http://www.haijin-boys.com/wiki/images/c/c5/jq.jpg

    注意点は前述の通り制御コードの部分のお豆腐(□)の入力にコツがいるのと、引数の「.」が必要なあたりですね。

    一応、私の環境 (Windows 10 64bit + Mery 2.5.4 + jq.exe 1.5) では文字化け以外は動作しました。カスタム + お豆腐(□)の入力で動作しないようであれば、Mery 側から制御コードを送信するオプション的なモノも設けることも検討してみたいと思います。

     |  Kuro  |  返信
  8. 返信ありがとうございます。
    環境は、Windows10(64bit)、 Mery2.54、JQ ver1.5でした。

    状況の説明が不適切でしたので訂正します。
    誤: アウトプットバーに出力されるはずのデータも表示されず、待ちの状態のままとなります。
    正: 待ちの状態から中断後も、アウトプットバーには何も表示されず、そのため空文字列に置換されます。

    カスタムを選択した場合は、なぜだか出力されない状態となるようです。
    ちなみに JQが問題なのか切り分けるために、コマンドをjq.exeではなく C:\Windows\System32\more.com としてみた場合も、入力を文書からカスタム(指定:$(DocText))に切り替えると、実行後、「ジョブを中断しますか」というダイアログが表示され、アウトプットバーへの出力がされなくなってしまいます。 うーん....。

     |  Hiro  |  返信
  9. ご返信ありがとうございます。

    > カスタムを選択した場合は、なぜだか出力されない状態となるようです。

    こちらでも現象を再現することができました。
    ちょっと長め (というか 256 文字以上) の json 文字列を渡してやると出力されなくなりますね。すみません、コレは Mery 側の問題でした。

    文字化けの対応と合わせて、次のバージョンでは修正しておきます。ご不便をおかけしますが、今しばらくお待ちくださいませ。

     |  Kuro  |  返信
  10. 追伸:
    思ったよりやっかいな問題で、対応にはしばらく時間がかかるか、現在の私の技術力では対応できないかもしれません。

    一日費やして進展ナシ、凹みます…()´д`()

     |  Kuro  |  返信
  11. お疲れ様です。
    貴重なお時間を割いていただいて、申し訳なく思います。
    適当なところで、見切りをつけていただいて...。
    (元々コマンドラインでやればいい話なんで)

     |  Hiro  |  返信
  12. こんばんは、Mery 2.5.5 で対応してみました。(たぶん…)

    外部ツールの設定で下記をお試しください。
    --------
    タイトル: JQ
    コマンド: jq.exe のパス
    引数: .
    アウトプットバーを使用する:チェック
    終了時に閉じる:お好みで
    入力:文書
    EOF を追加:チェック
    出力:文書と置換
    エンコード:UTF-8
    --------

     |  Kuro  |  返信
  13. 新しいバージョンに更新して上記の設定で実行させて見ましたら、考えていた通りに文字化けもなく変換ができました。フィルタ的な使い方ができると使いみちが広がりますね。
    いろいろと検討、対応いただき、ありがとうございました。 

     |  Hiro  |  返信
  14. ご確認ありがとうございます。
    正常に動作しているとのことで、安心いたしました。

    jq.exe の整形機能以外は試していませんが、他の機能も外部ツールから実行できれば面白そうですね。jq.exe、私も活用してみたいと思います^^

     |  Kuro  |  返信
スポンサーリンク