Emacs 进程上等待输入的Elisp sentinel
我做了一个函数,编译当前的latex文件: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
;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会冻结,我看到:
我当前的工作流程:
是否可以跟踪进程已停止并正在等待用户输入?我当前的哨兵仅在“完成”事件时激活。因此,我可以自动执行当前的工作流程。[@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