В настоящее время я использую emacs для создания и редактирования документов LaTeX. При компиляции я использую внешнюю программу для компиляции в pdf. Прямо сейчас, со следующим кодом в моем .emacs
файле, emacs начнет компилировать документ в pdf всякий раз, когда я сохраню файл.Функция emacs после асинхронной команды
(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 во время процесса?
Это много глобальных переменных.Как насчет использования одной переменной с именами для хранения всех данных и извлечения значений из этого на другом конце? – phils
Я хотел бы узнать лучший способ делать вещи, если бы вы могли быть настолько добры, чтобы привести пример или два. 'let' привязки не могут быть определены * внутри *' set-process-sentinel', потому что они отклоняются при попытке запустить эту функцию. Любые привязки 'let', определенные до *' set-process-sentinel', не могут использоваться внутри функции 'lambda (p e)', так как * ранее * 'let' привязки не распознаются в подфункции' lambda'. 'start-process' не может быть' let' bound, так как он запускается немедленно, как только он привязан. Моя цель состояла в том, чтобы все было встроено в одну аккуратную/чистую функцию. – lawlist
'start process' и' concat' не смешиваются, даже с разделителем пробелов - например, '(concat arg-1" "arg-2)' отклоняется 'start-process', поэтому каждый аргумент должен быть отдельно прописано. – lawlist