【问题标题】:Latex, Emacs: automatically open *TeX Help* buffer on error and close it after correction of the error?Latex,Emacs:错误时自动打开*TeX Help*缓冲区并在更正错误后关闭它?
【发布时间】:2012-03-04 04:50:44
【问题描述】:

我使用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 帮助 * 缓冲区和 C-x 1 以再次隐藏它。

【问题讨论】:

    标签: emacs latex elisp


    【解决方案1】:

    首先,让我们定义一个函数,它找到*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),一旦编译完成,它就会检查错误。如果出现错误,它会自动打开帮助窗口并获取第一个错误。如果没有,它检查帮助缓冲区是否打开;如果是这样,它会关闭该窗口并终止缓冲区。

    【讨论】:

    • 好的,太好了,非常感谢,迈克!原则上,它有效。 TeX Live 2011 缓冲区仍然存在这个问题:一旦 .tex 中出现错误,而不是仅仅在窗口的下半部分看到 TeX 帮助缓冲区和在上半部分看到 .tex 代码,上半部分包含这个空的 TeX Live 2011 缓冲区,然后我必须杀死它。对于每一个发现的错误,我都必须这样做。我希望我能弄清楚如何按照neilernst.net/2011/04/21/… 中的描述告诉 TeX Live 正常工作(我试过了,但它不起作用)
    • 好的,它有效。我不得不使用file_line_error_style=t 而不是file-line-error=t 然后它起作用了
    • 更好的是,使用(TeX-command-expand "latexmk -pdflatex='pdflatex -file-line-error' -pdf %s" 'TeX-master-file),因此选项file-line-error 被传递给pdflatex,并且错误在原始.tex 文件的正确行中指示。无需按照neilernst.net/2011/04/21/… 中的说明调整 `/usr/local/texlive/2010/texmf.cnf'
    【解决方案2】:

    注意:经过一番澄清,我发现以下内容与所要求的并不完全一致。我对这个问题的其他答案应该可以完成这项工作。

    看起来自动打开缓冲区需要更改运行 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 ' 很尴尬。

    【讨论】:

    • 以防万一,我在 bob.porkrind.org 上使用 2012-01-15 的 GNU Emacs 24.0.92.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) AUCTeX 11.86
    • 我尝试了上面的代码,但它似乎没有任何影响,即使在成功编译文档后我仍然看到 TeX Help 缓冲区。我想知道是否使用了 TeX-parse-error 函数,以及如何在使用 latexmk(甚至只是 `latex')时使其可用
    • 哦,对不起。我以为您想逐步检查所有错误,然后在没有更多错误后关闭“帮助”窗口。 (尝试逐步浏览它们,您应该会看到该窗口关闭。)我想您真正想要做的是再次更改运行 Latex 时调用的函数,但在开头添加一些内容以关闭窗口。我会处理它,并添加第二个答案。
    • 非常感谢您的帮助,迈克,非常友善。我的主要工作流程可以描述如下:我通常运行乳胶(通过 latexmk),如果出现错误 TeX Help 缓冲区会弹出(不幸的是,链接中描述的也是一个空的 TeX Live 缓冲区在我上面的帖子中)。然后我看到了错误。更正后,我只是再次运行 latex(mk) 。如果还有其他错误,TeX Help 缓冲区会更新,我可以再次修复代码。最后,在没有错误的情况下运行代码只会使 TeX 帮助 缓冲区打开,但使用 C-x 1 我可以(手动)关闭它并返回 .tex 文件。
    • “逐步检查”错误是什么意思,哪个命令可以做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    相关资源
    最近更新 更多