Emacs 进程上等待输入的Elisp sentinel

Emacs 进程上等待输入的Elisp sentinel,emacs,elisp,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

我做了一个函数,编译当前的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完成后,关闭*async pdflatex*窗口
(defun乳胶哨兵(过程事件)
(信息事件)
(cond((string-match-p“finished”事件)
(项目
(终止缓冲区“*异步pdflatex*”)
(信息“pdflatex完成”)
(删除其他窗口(()()))
(defun-latex编译()
“在当前文件上运行pdflatex”
(互动)
(let*((文件名(shell引号参数(缓冲区文件名)))
(进程(启动进程外壳命令)
“pdflatex”
“*异步pdflatex*”
(concat“pdflatex”文件名)
(设置进程sentinel进程“乳胶sentinel”)
(设置新窗口(40以下拆分窗口))
(设置窗口缓冲区新窗口“*异步pdflatex*”)
(其他窗口(1))
(添加挂钩的乳胶模式挂钩(lambda()
(定义键LaTeX模式映射(kbd“”)“LaTeX编译”))
当编译时出现错误时,pdflatex会冻结,我看到:

我当前的工作流程:

  • 向上滚动查看错误
  • 终止此缓冲区-终止pdflatex进程
  • 删除窗口-关闭*async pdflatex*窗口并返回编辑

  • 是否可以跟踪进程已停止并正在等待用户输入?我当前的哨兵仅在“完成”事件时激活。因此,我可以自动执行当前的工作流程。

    [@Thomas:你不需要AUCTeX。内置的
    latex模式也为该任务提供了
    C-C-C
    绑定。]


    一般来说,检测流程正在“等待我”是困难的/不可能的(充其量,您可以监视进程的CPU使用率,如果它已经0%一段时间了,您可以确定它可能正在等待您,但即使这样做也很棘手,因为您需要找到适当的OS进程进行监视,然后使用依赖于系统的操作来获取CPU使用率)。latex模式通常为“解决”这是通过在pdflatex的命令行上传递
    \nonstopmode\input
    来实现的。

    我也遇到了同样的困难。下面的内容似乎还可以

    (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模式下重复调用C-C-C的时间
    latex模式

    您知道AUCTeX模式吗?@Thomas是的,我知道您有一件事要做uld try正在将命令更改为
    pdflatex