19

shell-command を使用して、アプリケーションの出力を emacs バッファーで実行しています。

(shell-command "verbose-app &" "*verbose-app*")

問題は、このコマンドが非常に冗長であることです。そのため、emacs バッファーが追いつくのに数秒かかることがあります。実際の出力とは数秒遅れます。

何かを無効にして出力スクロールを高速化する方法はありますか? 正規表現マッチングや構文強調表示のようなものですか?

今後の参考のために:

詳細アプリは adb logcat です。既存の機能を変更しました:

(defun adb-logcat ()
  (interactive)
  (shell-command "adb logcat -v threadtime&" "*adb-logcat*")
  (pop-to-buffer "*adb-logcat*")
  (buffer-disable-undo))

以下に:

(defun adb-logcat ()
  (interactive)
  (start-process "*adb-logcat*" "*adb-logcat*" "/bin/sh" "-c" "adb logcat -v threadtime")
  (pop-to-buffer "*adb-logcat*")
  (buffer-disable-undo))

スクロールが速くなりました。わーい!

4

2 に答える 2

10

ドキュメントにあるようshell-commandに、下位シェルでコマンドを実行し、shell-mode. 出力のみが必要で、機能が必要ない場合は、でコマンドを実行すると、start-process目的に近い場合があります。

(start-process "*verbose-app*" "*verbose-app*"
 "/bin/sh" "-c" "verbose-app")

これを関数にラップすることはそれほど難しくありません。shell-commandが非同期コマンドをどのように実装しているかを確認することをお勧めします。たとえば、別のプロセスが既に存在するときに別のプロセスを作成しようとすると、既存のプロセスを終了するかどうかを尋ねられます。 http://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/simple.el#n2447は良い出発点かもしれません。(リンクがうまくいかない場合、これは inside へのリンクでありdefun shell-command、アンパサンドの処理に関するコメントを指しています。そこにある場合、コマンドは非同期で実行されます。)

于 2012-08-28T07:41:21.753 に答える
0

コマンドがそれほど冗長である場合、完全な出力をリアルタイムでキャプチャすることに何か用途はありますか? おそらくverbose-app > app.log、バックグラウンドで実行してから、emacs 内で何かを実行してwhile true; do tail -n50 app.log; sleep 1; done、ログ ファイルの最後の数行を表示するためにバッファを更新し続けることができます。後で完全な出力が必要な場合は、ログ ファイルを emacs で開くことができます。

于 2012-08-28T00:27:33.343 に答える