如何强制使用 AUCTeX 的 emacs 在新缓冲区中显示编译

如何强制使用 AUCTeX 的 emacs 在新缓冲区中显示编译

因此,我在 emacs 中使用 AUCTeX 和 xetex,每次编译文件后,我都会得到一个显示编译过程的分割窗口。我不想完全隐藏它,因为我发现它对调试很有用,但我希望它出现在不同的缓冲区中,并且在没有错误时不会打扰我。这可能吗?另一个选择,虽然不太好,是除了编译错误外自动隐藏它。

我有一个选择:

(setq TeX-show-compilation t)

答案1

我认为最好的解决方案是挂接到TeX-LaTeX-sentinel。这样,您可以在编译器完成其工作后检查是否存在错误。将以下代码添加到您的初始化文件中:

(defadvice TeX-LaTeX-sentinel
  (around mg-TeX-LaTeX-sentinel-open-output activate)
  "Open output when there are errors."
  ;; Run `TeX-LaTeX-sentinel' as usual.
  ad-do-it
  ;; Check for the presence of errors.
  (when
      (with-current-buffer TeX-command-buffer
    (plist-get TeX-error-report-switches (intern (TeX-master-file))))
    ;; If there are errors, open the output buffer.
    (TeX-recenter-output-buffer nil)))

答案2

问题编译步骤的缺点是下一个缓冲区非常大。我通常这样做:

(defun shrink-window-to-height(height)
  "Shrink window height to certain height."
  (interactive "nNew window height: ")
  (if (> (window-height) height)
    (shrink-window (- (window-height) height))
    (enlarge-window (- height (window-height)))
  )
)

(add-to-list 'TeX-command-list '("pdfLaTeX" "pdflatex -shell-escape %t" TeX-run-interactive nil t))
(defun do-pdflatex ()
    "pdflatex with shell escape."
    (interactive nil)
    (save-buffer)
    (let ((process (TeX-active-process)))
      (if process
          (TeX-kill-job)))
    (TeX-command "pdfLaTeX" 'TeX-master-file)
    (other-window 1)
    (shrink-window-to-height 7)
    (other-window -1)
    (TeX-recenter-output-buffer nil)
)
(global-set-key [f3] 'do-pdflatex)

它的作用是:

  1. 终止所有活动的编译步骤
  2. 开始新的编译步骤
  3. 将缓冲区切换到编译窗口(不完全是,但如果打开了 2 个缓冲区就会发生这种情况)
  4. 将窗口缩小到高度 7
  5. 切换回原始缓冲区

由于它占用的空间很小,所以当它编译正常时,我通常不会感到困扰。我从未研究过这个问题,但它可能意味着侵入该过程以检查它是否已完成,我怀疑这并不容易。

相关内容