Latex,Emacs:错误时自动打开* TeX Help *缓冲区并在纠正错误后将其关闭?

时间:2012-02-12 14:16:43

标签: emacs latex elisp

我使用Emacs latexmk function throws me into an empty buffer底部的Ivan Andrus定义的函数TeX-parse-error,以便在编译期间出现错误时自动打开* TeX Help *缓冲区(C-c C-c )。纠正错误并再次编译后,* TeX Help *缓冲区保持打开状态(尽管错误已更正)。有没有办法调整功能(不幸的是,我没有经验的elisp编程),如果错误得到解决和更新(并且仍然打开),如果错误未解决,则关闭* TeX Help *缓冲区?这样可以省去很多像C-c '这样的输入来显示* TeX Help *缓冲区和C-x 1来再次隐藏它。

2 个答案:

答案 0 :(得分:6)

首先,让我们定义一个找到*TeX Help*缓冲区的函数,如果它存在,关闭它的窗口,然后杀死缓冲区:

(defun demolish-tex-help ()
  (interactive)
  (if (get-buffer "*TeX Help*") ;; Tests if the buffer exists
      (progn ;; Do the following commands in sequence
        (if (get-buffer-window (get-buffer "*TeX Help*")) ;; Tests if the window exists
            (delete-window (get-buffer-window (get-buffer "*TeX Help*")))
          ) ;; That should close the window
        (kill-buffer "*TeX Help*") ;; This should kill the buffer
        )
    )
  )

现在,当你调用用于编译的任何函数时,你必须调用它。以其他页面为例,您可以将Ivan Andrus的功能修改为:

(defun run-latexmk ()
  (interactive)
  (let ((TeX-save-query nil)
        (TeX-process-asynchronous nil)
        (master-file (TeX-master-file)))
    (TeX-save-document "")
    (TeX-run-TeX "latexmk"
                 (TeX-command-expand "latexmk %t" 'TeX-master-file)
                 master-file)
    (if (plist-get TeX-error-report-switches (intern master-file))
        (TeX-next-error t)
      (progn
       (demolish-tex-help)
       (minibuffer-message "latexmk done")))))

(add-hook 'LaTeX-mode-hook
          (lambda () (local-set-key (kbd "C-0") #'run-latexmk)))

(注意:这对我来说实际上并不适用,因为我的latexmk搞砸了,所以我没有成功测试过。但如果Ivan的版本适合你,那么这也应该。)

所以现在,只要你用这个函数调用latexmk(例如,通过点击C-0),一旦编译完成,它就会检查错误。如果有错误,它会自动打开“帮助”窗口并获取第一个错误。如果没有,它会检查帮助缓冲区是否打开;如果是这样,它会关闭该窗口并杀死缓冲区。

答案 1 :(得分:1)

注意:经过一番澄清后,我发现以下内容并不完全符合要求。我对这个问题的另一个答案应该是这个工作。

看起来自动打开缓冲区需要更改运行latex时调用的函数。 (至少,我找不到任何可以让你这样做的钩子。)这实际上就是你提到的那个问题的早期答案中所做的事情之一。特别是行

    (if (plist-get TeX-error-report-switches (intern master-file))
    (TeX-next-error t)
  (minibuffer-message "latexmk done"))))

检查是否有错误。如果是,则该函数运行TeX-next-error;如果不是它只是打印消息。所以你可能想尝试安装该功能。

自动关闭帮助缓冲区只需要稍微调整一下Ivan Andrus的功能。在“没有更多错误”的区域,只需用以下内容替换相关部分:

     ((null
       (re-search-forward regexp nil t))
      ;; No more errors.
      (message "No more errors.")
      (beep)
  (delete-window (get-buffer-window (get-buffer "*TeX Help*")))
  (kill-buffer "*TeX Help*")
      (TeX-pop-to-buffer old)
      nil)

这实际上会在关闭窗口后杀死帮助缓冲区,但如果您因某种原因不喜欢它,可以对其进行评论。

另一个不错的选择是将(setq TeX-display-help nil)放入~/.emacs。这样,帮助缓冲区甚至不会显示。相反,描述错误的简洁消息被放入迷你缓冲区,光标放在原始的坏线上。 (我从来没有发现大部分帮助输出都有用。)

最后,您可能想为TeX-next-error尝试另一个键绑定,因为C-c '很尴尬。