3

私は現在、LaTeX ドキュメントの作成と編集に emacs を使用しています。コンパイルするときは、外部プログラムを使用して pdf にコンパイルします。現在、私の.emacsファイルに次のコードがあると、ファイルを保存するたびに、emacs がドキュメントを pdf にコンパイルし始めます。

(defun auto-compile-latex ()
  (save-window-excursion
    (async-shell-command (format "cd %s; scons -u" default-directory))))
(add-hook 'LaTeX-mode-hook '(lambda ()
     (add-hook 'after-save-hook 'auto-compile-latex nil 'make-it-local)))

M-x compile保存する習慣があり、バックグラウンドで起動するため、作業を続けることができるため、 よりもこれを好みます。ただし、コンパイル プロセスが終了しても、目立つ通知は表示されません。

理想的には、コンパイル プロセスが終了するたびに次の関数を実行したいと考えています。

(defun latex-compilation-status (exit-code)
  (if (/= exit-code 0)
      (setq mode-name (propertize mode-name 'face 'font-lock-warning-face))
    (setq mode-name (propertize mode-name 'face 'mode-line-highlight))))

そうすれば、コンパイルが成功したかどうかに応じて、モード ラインの色を自動的に変更できます。ただし、emacs のドキュメントを調べたところ、完了後に実行されるフックについての言及は見つかりませんでしたasync-shell-command。サブプロセスの終了ステータスを示すメッセージがミニバッファーにあることは知っていますが、そのときに入力していると、気づきにくいことがよくあります。

または、シェル コマンドが完了するのを待ってから、すぐに色を変更することもできます。ただし、これにより、コンパイル中に emacs 全体がフリーズしますが、これは望ましくありません。

プロセス中にemacsがフリーズすることなく、コンパイルの最後にこの指示を適用するにはどうすればよいですか?

4

4 に答える 4

1

https://github.com/jwiegley/emacs-asyncasync-startからコマンドを試す必要があります

于 2013-09-13T22:57:52.533 に答える
0

ありがとうございました。最終的に、ローリストのコードの修正版を使用して取得しました。これにより、コンパイルの開始時に色が変更され、成功または失敗を示すために再度変更されます。

;Automatically compile any latex documents when saved.
(defun auto-compile-latex ()
  (setq mode-name (propertize mode-name 'face 'font-lock-string-face))
  (set-process-sentinel
   (start-process-shell-command "latex-compile" "latex-compile"
                                (format "cd %s; scons -u" default-directory))
   'latex-compile-sentinel))
;Change the color after compilation.  Still need to find the right hook to add it to.
(defun latex-compile-sentinel (process event)
  (if (string-equal event "finished\n")
      (setq mode-name (propertize mode-name 'face 'mode-line-highlight))
    (setq mode-name (propertize mode-name 'face 'font-lock-warning-face))))
;Hooks for latex-mode
(add-hook 'LaTeX-mode-hook '(lambda ()
   (add-hook 'after-save-hook 'auto-compile-latex nil 'make-it-local)))

余談ですが、emacs-async パッケージはこの用途では機能しませんでした。これは、emacs-async が別のプロセスでセカンダリ関数を開始し、一部の変数が親プロセスに伝播されないためだと思います。

于 2013-09-14T22:04:11.700 に答える
0

auto-compile-latex実行するように手配することもできますcompile

于 2013-09-16T02:38:31.480 に答える