8

Mx コンパイル、Mx 再コンパイル、または保存スクリプトでのコンパイルによってトリガーされる Emacsコンパイルバッファーを、コンパイルがエラーまたは警告で終了したときにのみ表示する方法を探しています。

[1] で説明されているように、エラーや警告がない場合にコンパイル バッファーを閉じる方法を探しているわけではないことに注意してください。いいえ、コンパイルが完全に終了するまでバッファーが表示されないようにし、表示するエラーまたは警告がある場合にのみ表示されるようにします。

理由は簡単です。コンパイル バッファーのちらつきが邪魔で、画面上のコードの位置が再配置されます。保存時にコンパイルを有効にしている場合、これはさらに厄介になります。

コンパイルバッファにはmake から pdflatex までさまざまな種類のコンパイル処理が含まれているため、バッファを表示するかどうかを決定する機能が全面的に機能するとよいでしょう。

[1] emacs コンパイル バッファの自動クローズ?

4

4 に答える 4

6

display-buffer全体で一時的に無効にすることで、目的を達成できるようですcompilation-start

これは、sds が言ったことと、@ hereのコメントに投稿されたものを組み合わせたものです。

そこのコメントには、元のソース バッファでのポイント ジャンプに関する厄介な問題がありましset-window-pointgoto-char。汚いハックのように感じますが、今のところ機能しています。YMMV!

(defun brian-compile-finish (buffer outstr)
  (unless (string-match "finished" outstr)
    (switch-to-buffer-other-window buffer))
  t)

(setq compilation-finish-functions 'brian-compile-finish)

(require 'cl)

(defadvice compilation-start
  (around inhibit-display
      (command &optional mode name-function highlight-regexp)) 
  (if (not (string-match "^\\(find\\|grep\\)" command))
      (flet ((display-buffer)
         (set-window-point)
         (goto-char)) 
    (fset 'display-buffer 'ignore)
    (fset 'goto-char 'ignore)
    (fset 'set-window-point 'ignore)
    (save-window-excursion 
      ad-do-it))
    ad-do-it))

(ad-activate 'compilation-start)

これで、すべてのコンパイル バッファがoutstr正常終了ステータスを返さない場合、または呼び出されたコマンドが「find」または「grep」で開始された場合にのみ表示されることがわかります。

于 2013-07-22T13:13:04.037 に答える
1

関数はコンパイル バッファーでcompilation-start呼び出します。display-bufferこれにより、必要なすべての制御が可能になります。

つまり、アクション変数 ( et al)の 1 つをカスタマイズして、フレーム自体を表示せdisplay-buffer-overriding-actionに別のフレームに表示する特別なコンパイル バッファを処理する必要があります。

次に、警告またはエラーがコンパイル バッファに挿入されるたびに、コンパイル バッファが表示されるようにカスタマイズする必要がありますcompilation-filter-hook(たとえば、前述の別のフレームをポップアップすることによって)。アクション変数をそこにバインドすることを忘れないでくださいnil!

于 2013-07-15T16:55:54.980 に答える
1

assems の回答は、イベントによって多少追い越されています。

Emacsコアは、彼らの知恵で廃止することを決定しましたflet。推奨される代替手段はcl-flet. ただし、この投稿で説明したように、これは動的スコープではなく字句スコープのようです。明示的に動的スコープが必要です。

flet は cl-flet または cl-letf に置き換えるべきですか?

このページでは、サードパーティのライブラリである に置き換えることfletを提案しています。noflet

これは、関数とその本体の定義のみをサポートしているようです。したがって、fletin assemの答えは次のようになります

(noflet ((display-buffer ()) ....

于 2016-10-31T15:23:35.240 に答える