8

我正在寻找一种方法让 Emacs编译缓冲区由 Mx compile、Mx recompile 或某些 compile on save 脚本仅在编译退出并出现错误或警告时出现。

请注意,如果没有 [1] 中所述的错误或警告,我并不是在寻找关闭编译缓冲区的方法。不,我希望缓冲区在编译完全完成之前永远不会出现,并且只有在出现错误或警告时才会出现。

原因很简单:闪烁的编译缓冲区令人不安,并重新排列了代码在屏幕上的位置。如果您打开了保存时编译,这将变得更加烦人。

编译缓冲区包含从 make 到 pdflatex的许多不同类型的编译过程,因此如果确定是否应显示缓冲区的函数可以全面工作,那就太好了。

[1] emacs编译缓冲区自动关闭?

4

4 回答 4

6

看起来你可以通过暂时禁用 cross 来实现你想要display-buffercompilation-start

这是 sds 所说的内容和评论@此处发布的内容的组合

那里的评论有一个令人讨厌的问题,即在原始源缓冲区中的点跳转,我似乎已经通过阻塞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 回答
2

我编辑了@assem 的答案以使用cl-letf而不是flet.

(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)

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

(ad-activate 'compilation-start)

(provide 'only-display-compile-on-error)
于 2020-04-02T11:37:35.197 回答
1

该函数compilation-start调用display-buffer编译缓冲区。这应该为您提供所需的所有控制。

即,您需要自定义其中一个动作变量(display-buffer-overriding-action等),以便它处理编译缓冲区,特别是在单独的框架中显示它而不显示框架本身。

然后,您需要自定义您的compilation-filter-hook,以便每当将警告或错误插入编译缓冲区时,编译缓冲区都会以可见的方式显示(例如,通过弹出上述单独的框架)。不要忘记将您的操作变量绑定到nil那里!

于 2013-07-15T16:55:54.980 回答
1

大会的答案在某种程度上已经被事件所取代。

Emacs 核心,在他们的智慧中决定弃用flet. 建议的替代方案是cl-flet. 然而,正如本文所讨论的,这似乎是词法作用域而不是动态作用域。我们明确地想要动态范围。

`flet` 应该替换为 `cl-flet` 或 `cl-letf` 吗?

此页面建议替换fletnoflet第三方库。

这似乎只支持函数及其主体的定义。所以flet汇编中的答案变成了

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

于 2016-10-31T15:23:35.240 回答