Как проверить, изменился ли текущий файл в elisp, совместимом с latexmk
Я использую следующую функцию для запуска latexmk для моего latex-файла в emacs:
(defun my-run-latex ()
(interactive)
(if (buffer-modified-p)
(progn
(setq TeX-save-query nil)
(TeX-save-document (TeX-master-file))
(TeX-command "Latexmk" 'TeX-master-file -1))
(TeX-view)))
(Взято с /questions/27397758/argumentyi-prefiksa-emacsauctex/27397771#27397771).
Предположим, у меня есть простой документ (test.tex
) с некоторыми ошибками в этом, как:
\documentclass{article}
\begin{document}
\error1
\error2
\end{document}
Теперь, если я нажму, например, пробел, а затем Backspace (или делать какие-либо изменения и отменить его), а затем запустить my-run-latex
latexmk запускает и говорит, что все цели обновлены. Проблема в том, что тогда я теряю список ошибок, поэтому TeX-next-error
не будет иметь никакого эффекта.
Я думаю, что проблему можно решить, заменив (buffer-modified-p)
чем-то, что мешает запустить latexmk в этом случае (лучше всего по тому же тесту latexmk проверяет, не изменился ли файл с момента последнего запуска). есть идеи как это сделать?
1 ответ
latexmk
использует хеширование, чтобы определить, был ли файл изменен. Используемый алгоритм хеширования md5
Это не совсем безопасно, но это не очень важно в этом отношении. Таким образом, вы можете использовать тест на основе хеша вместо (buffer-modified-p)
, Следующий код должен работать:
(setq current-buffer-hash nil)
(make-variable-buffer-local 'current-buffer-hash)
(defun my-run-latex ()
(interactive)
(if (equal current-buffer-hash
(setq current-buffer-hash (secure-hash 'md5 (current-buffer))))
(TeX-view)
(setq TeX-save-query nil)
(TeX-save-document (TeX-master-file))
(TeX-command "Latexmk" 'TeX-master-file -1)))
Как указывает @student, функция secure-hash
был введен в Emacs 24.2. Для предыдущих версий можно использовать (md5 (current-buffer))
,