1

proselint is a prose linter which returns error/warning messages like this:

2020-09-09-still-processing.md:18:14: typography.symbols.curly_quotes Use curly quotes “”, not straight quotes "".

I know there is a proselint checker in Flycheck, but I am trying to configure Flymake. For this task, I am using flymake-easy like this:

(defconst flymake-proselint-err-line-patterns
  '(("^\\(.*\.md\\):\\([0-9]+\\):\\([0-9]+\\): \\(.*\\)$" 1 2 3 4)))

(defvar flymake-proselint-executable "proselint" "The proselint executable to use for syntax checking.")

(defun flymake-proselint-command (filename) "Construct a command that flymake can use to check Markdown in FILENAME." (list flymake-proselint-executable filename))

(defun flymake-proselint-load () "Configure flymake mode to check the current buffer's ruby syntax." (interactive) (flymake-easy-load 'flymake-proselint-command flymake-proselint-err-line-patterns 'tempdir "md"))

(defun flymake-proselint-maybe-load () "Call `flymake-proselint-load' if this file appears to be Markdown." (interactive) (if (and buffer-file-name (string= "md" (file-name-extension buffer-file-name))) (flymake-proselint-load)))

I added flymake-proselint-maybe-load to markdown-mode-hook but flymake-show-diagnostics-buffer shows an empty buffer instead of the above-mentioned message from proselint.

My guess is I am setting flymake-proselint-err-line-patterns, but I am not sure if this is the problem.

Manuel Uberti
  • 3,250
  • 19
  • 37

1 Answers1

2

I took another approach, using flymake-quickdef, so as to leverage flymake-diagnostic-functions:

(require 'flymake-quickdef)
(flymake-quickdef-backend
  flymake-proselint-backend
  :pre-let ((proselint-exec (executable-find "proselint")))
  :pre-check (unless proselint-exec (error "proselint not found on PATH"))
  :write-type 'pipe
  :proc-form (list proselint-exec "-")
  :search-regexp "^.+:\\([[:digit:]]+\\):\\([[:digit:]]+\\): \\(.+\\)$"
  :prep-diagnostic
  (let* ((lnum (string-to-number (match-string 1)))
         (lcol (string-to-number (match-string 2)))
         (msg (match-string 3))
         (pos (flymake-diag-region fmqd-source lnum lcol))
         (beg (car pos))
         (end (cdr pos)))
    (list fmqd-source beg end :warning msg)))

(defun flymake-proselint-setup () "Enable flymake backend." (add-hook 'flymake-diagnostic-functions #'flymake-proselint-backend nil t))

Then it's just a matter of adding flymake-proselint-setup to markdown-mode-hook:

(add-hook 'markdown-mode-hook #'flymake-proselint-setup)
Manuel Uberti
  • 3,250
  • 19
  • 37
  • 2
    By the way, I packaged this code and make it available to anyone interested: https://github.com/manuel-uberti/flymake-proselint – Manuel Uberti Sep 21 '20 at 13:05
  • For the record, the repository has been moved on SourceHut: https://git.sr.ht/~manuel-uberti/flymake-proselint – Manuel Uberti Feb 17 '23 at 07:08