>From b373d749d85addd82d17fe4b6c6ec92a0c52e12b Mon Sep 17 00:00:00 2001 From: Alex Branham Date: Fri, 16 Feb 2018 10:55:52 -0600 Subject: [PATCH] Support flymake in Emacs 26+ using chktex --- latex-flymake.el | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ latex.el | 3 ++ 2 files changed, 89 insertions(+) create mode 100644 latex-flymake.el diff --git a/latex-flymake.el b/latex-flymake.el new file mode 100644 index 00000000..e77e0591 --- /dev/null +++ b/latex-flymake.el @@ -0,0 +1,86 @@ +;;; latex-flymake.el --- Flymake integration -*- lexical-binding: t; -*- + +;;; Commentary: +;; This file provides flymake integration for latex documents using +;; "chktex" as a backend. You must be running Emacs 26 or newer. +;; Enable it by adding the following to your init file: + +;; (add-hook 'LaTeX-mode-hook flymake-mode) + +;;; Code: + +(eval-when-compile + (require 'cl-lib)) +(require 'flymake) + +(defvar-local LaTeX--flymake-proc nil) + +(defun LaTeX-flymake (report-fn &rest _args) + "Setup flymake integration. + +REPORT-FN is flymake's callback function." + (unless (executable-find "chktex") + (error "Cannot find chktex")) + (when (process-live-p LaTeX--flymake-proc) + (kill-process LaTeX--flymake-proc)) + (let ((source (current-buffer))) + (save-restriction + (widen) + (setq + LaTeX--flymake-proc + (make-process + :name "LaTeX-flymake" :noquery t :connection-type 'pipe + :buffer (generate-new-buffer " *LaTeX-flymake*") + :command '("chktex" "--verbosity=0" "--quiet" "--inputfiles") + :sentinel + (lambda (proc _event) + (when (eq 'exit (process-status proc)) + (unwind-protect + (if (with-current-buffer source (eq proc LaTeX--flymake-proc)) + (with-current-buffer (process-buffer proc) + (goto-char (point-min)) + (cl-loop + while (search-forward-regexp + (rx line-start "stdin:" + ;; line + (group-n 1 (one-or-more num)) + ":" + ;; column + (group-n 2 (one-or-more num)) + ":" + ;; This is information about the + ;; number of the warning, which we + ;; probably don't care about: + (one-or-more num) + ":" + ;; Warning message: + (group-n 3 (one-or-more not-newline)) line-end) + nil t) + for msg = (match-string 3) + for (beg . end) = (flymake-diag-region + source + (string-to-number (match-string 1)) + (string-to-number (match-string 2))) + for type = :warning + collect (flymake-make-diagnostic source + beg + end + type + msg) + into diags + finally (funcall report-fn diags))) + (flymake-log :warning "Canceling obsolete check %s" + proc)) + (kill-buffer (process-buffer proc))))))) + (process-send-region LaTeX--flymake-proc (point-min) (point-max)) + (process-send-eof LaTeX--flymake-proc)))) + +(defun LaTeX-setup-flymake-backend () + "Setup flymake backend for LaTeX." + (add-hook 'flymake-diagnostic-functions 'LaTeX-flymake nil t)) + +(when (< 25 emacs-major-version) + (add-hook 'LaTeX-mode-hook #'LaTeX-setup-flymake-backend)) + +(provide 'latex-flymake) +;;; latex-flymake.el ends here diff --git a/latex.el b/latex.el index c2d8a4ca..2d7f8223 100644 --- a/latex.el +++ b/latex.el @@ -31,6 +31,9 @@ (require 'tex) (require 'tex-style) (require 'tex-ispell) +(when (<= 26 emacs-major-version) + ;; latex-flymake requires Emacs 26. + (require 'latex-flymake)) (eval-when-compile (require 'cl)) ;FIXME: Use cl-lib. ;;; Syntax -- 2.16.1