プロセスの出力を* Messages *バッファーに送信しますが、エコー領域はバイパスします


9

プロセスフィルターから*Messages*バッファーに出力を送信し、そのメッセージ出力がエコー領域に表示されないようにしminibuffer-promptて、進行中のサブプレスフィルター出力によって消去されることなくインタラクティブコマンドを同時に使用できるようにすることはできますか?

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)))

編集(2015年1月3日):以下は同様の質問へのリンクですが、正確な文字列が不明であるプロセス文字列で動作させることはまだできていません-スレッドのタイトルはEmacsです:-一部のミニバッファメッセージを無効にする

/superuser/669701/emacs-disable-some-minibuffer-messages


できるとは思いません。なぜ別のバッファにログを記録しないのですか?それがありますほとんどのモードは、プロセスと取引が行うことを何...
lunaryorn

@lunaryorn-提案をありがとう-専用バッファは問題を解決するための有効なオプションです。*Messages*バッファに送信するために個人的に好みのプロセス出力がいくつかあります。同期関連のプロジェクトはその1つです。バッファを一時的に書き込み可能にしてat を使用するなど、まだ試していないことがいくつかあります(組み込みの解決策があったのではないかと思います)。それが表示されるかどうかはわかりませんエコー領域も同様です。私は今晩またそれに取り組みます。。。*Messages*inhibit-read-onlyinsertpoint-max
弁護士、2015年

興味深い点の1つは、メッセージングのC関数が「エコー」と「ロギング」の問題によって非常に分離されていることですが、その区別はelispには公開されていません。おそらくM-x report-emacs-bug、これを機能として要求できますか?
2015年

@phils | @lunaryorn:を使用して目的の効果を達成することができ、(let ((inhibit-read-only t)) (with-current-buffer (get-buffer-create "*Messages*") (goto-char (point-max)) (insert string)))回答のドラフトを投稿しました。これは、ユーザー自身の質問の必須の待機期間が経過した後に受け入れられるようになります。私は次の機能のリクエストを提出しましたreport-emacs-bugdebbugs.gnu.org/cgi/bugreport.cgi
bug=

lawlist:私はなど、あなたが重複メッセージを処理するためのロジックの抵触実行可能性があるため、そのアプローチを提案するつもりではなかった(しかし、それはまた、細かいかもしれません。私は実際にはわかりません。)あなたはおそらく使用すべき(messages-buffer)バッファを取得します、このメソッドを使い続けると、それ(point-max)が常に新しい行の始まりになるとは限らないことに注意してください(例:を使用C-g)。
2015年

回答:


3

minibuffer-message-timeout0に設定すると、ミニバッファーでの表示を抑制できます。

たとえば、「モードが有効です」というメッセージに邪魔されずにミニバッファープロンプト(ido find-fileなど)でマイナーモードを切り替えたい場所で、次のようなものを使用します。

(let ((minibuffer-message-timeout 0))
    (toggle-some-mode))

提案ありがとうございます。しかし、これでは望ましい効果が得られませんでした。またはの(let ((minibuffer-message-timeout 0)) (message "%s" string))ようなインタラクティブな機能を入力すると、echo-area / minibufferにまだ進行中のプロセス出力の印刷が表示されます。つまり、プロンプトと推奨される完了は、プロセス出力メッセージによって消去されます。execute-extended-commandswitch-to-buffer-other-window
弁護士、2015年

3

最初のラフドラフト(2015年1月3日):関数messages-bufferを使用して適切なバッファーを検索または作成(およびmessages-buffer-mode)することに関する@philsの役立つコメントに基づいて、最初のドラフトを改訂しました。また、point-max行の先頭にあるかどうかのチェックを追加しました(そうでない場合は、メッセージ文字列を挿入する前に新しい行を挿入します)。

編集(2015年1月4日):挿入された文字列が必ずしも新しい行で終わるとは限らない状況があり、関数messageがそれが新しい行の先頭にあることを確認するチェックがないため、その点に注意しますこの関数で。したがって、message新しい行を挿入するときはいつでも、その行はバッファーの左左から始まります。

(defun rsync-process-filter (proc string)
  (let ((inhibit-read-only t))
    (when (not (or
        (string-match "files...\r" string)
        (string-match "files to consider\n" string)))
      (with-current-buffer (messages-buffer)
        (goto-char (point-max))
        (when (not (bolp))
          (insert "\n"))
        (insert string)
        (when (not (bolp))
          (insert "\n"))))))

2

messageそれのdocstringを通過すると、目的のコンテンツでnil呼び出した直後に引数を使用してメッセージを呼び出すことmessageで、希望どおりの結果を得ることができるはずです。のドキュメント文字列からmessage

最初の引数がnilまたは空の文字列の場合、関数は既存のメッセージをすべてクリアします。これにより、ミニバッファーの内容が表示されます。

したがって、関数を次のようなものに変更するとうまくいくはずです

(defun rsync-process-filter (proc string)
  (when (not (or
      (string-match "files...\r" string)
      (string-match "files to consider\n" string)))
    (message "%s" string)
    (message nil)))

次のようにしてテストしました

(defun test ()
  (message "%s" "Test")
  (message nil))

(run-at-time 5 5 #'test)

そしてそれはうまくいくようです


提案ありがとうございます。実行中のプロセスへの出力で試験したとき、このアイデア*Messages*バッファして、対話型のコマンドを呼び出しexecute-extended-command、ショーは以下:(すなわち、対話プロンプトM-xや任意の部分的な補完)プロセスからの出力-すなわち、2つのスイッチバックとわずかな速度で進みますが、2つの間のちらつきは認識できます。これは、問題の特定のプロセスが常に新しいメッセージを吐き出しており、その新しいメッセージがエコー領域に1秒未満表示されているためです。
弁護士、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.