Elisp哨兵正在等待输入

时间:2013-06-02 22:19:39

标签: emacs elisp

我创建了一个函数,编译当前的latex文件:

;close the *async pdflatex* window, when pdflatex finishes
(defun latex-sentinel (process event)
      (message event)
      (cond ((string-match-p "finished" event)
                  (progn
                        (kill-buffer "*async pdflatex*")
                        (message "pdflatex done")
                        (delete-other-windows)))))

(defun latex-compile ()
      "Runs pdflatex on current file"
      (interactive)
      (let* ((file-name (shell-quote-argument (buffer-file-name)))
            (process (start-process-shell-command
                           "pdflatex"
                           "*async pdflatex*"
                           (concat "pdflatex " file-name))))
            (set-process-sentinel process 'latex-sentinel)
            (setq new-window (split-window-below 40))
            (set-window-buffer new-window "*async pdflatex*")
            (other-window 1)))

(add-hook 'LaTeX-mode-hook (lambda () 
    (define-key LaTeX-mode-map (kbd "<f2>") 'latex-compile)))

当出现错误时,在编译时,pdflatex冻结,我看到了:

enter image description here

我目前的工作流程:

  1. 向上滚动以查看错误
  2. kill-this-buffer - 杀死pdflatex进程
  3. delete-window - 关闭* async pdflatex *窗口并返回编辑。
  4. 是否可以跟踪进程已停止并等待用户输入?我目前的哨兵仅在“完成”事件中激活。所以我可以自动完成当前的工作流程。

2 个答案:

答案 0 :(得分:3)

[@Thomas:你不需要AUCTeX。内置latex-mode还为该任务提供C-c C-c绑定。 ]

一般情况下,检测到进程“等待我”是困难/不可能的(最多可能会监视进程的CPU使用情况,如果有一段时间它是0%,你可以决定它可能在等你,但是即使这样做也很棘手,因为你需要找到适当的操作系统进程来监控,然后使用系统相关的操作来获得CPU使用率。 latex-modes通常通过在pdflatex的命令行上传递\nonstopmode\input来“解决”这个问题。

答案 1 :(得分:0)

我遇到了同样的困难。以下似乎没问题。

(defun latex-compile()
  (interactive)
  (save-buffer)
  (set 'tex-to-pdf   "pdflatex -interaction=nonstopmode")
  (set 'file-name (shell-quote-argument (buffer-file-name)))
  (set 'comm1 (concat tex-to-pdf " " file-name ))
  (set-process-sentinel
   (start-process-shell-command "latex-compile"
                "*async latex-compile*"
                comm1)
   'tex-to-pdf-sentinel))
;;;
(defun tex-to-pdf-sentinel (process event)
    (cond
     ( (string-match-p "finished" event)
     (message "latex-compile complete"))
     ( (string-match-p "\\(exited\\|dumped\\)" event)
     (message "error in latex-compile"))
     ))

我意识到使用set的全局变量是不可取的;这只是一个很小的例子。

您可以在第一次完成时设置第二个sentilel,例如以便查看器打开以显示.pdf输出,或者您希望每次都确保bibtex运行。这可以节省latex mode中对 C-c C-c 的重复调用。