Как проверить, изменился ли текущий файл в 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)),

Другие вопросы по тегам