rougier / nano-emacs

GNU Emacs / N Λ N O - Emacs made simple
GNU General Public License v3.0
2.52k stars 194 forks source link

Font lock issue with `web-mode` #86

Closed d4ncer closed 3 years ago

d4ncer commented 3 years ago

First off, thank you for releasing this! It's a gorgeous foundation and I'm enjoying molding my config around it.

I'm having issues with font-lock in web-mode and web-mode derived buffers:

Backtrace

Debugger entered--Lisp error: (wrong-number-of-arguments #<subr quote> 0)
  quote()
  funcall(quote)
  (if (fboundp keywords) (funcall keywords) (eval keywords))
  (font-lock-eval-keywords (if (fboundp keywords) (funcall keywords) (eval keywords)))
  (if (listp keywords) keywords (font-lock-eval-keywords (if (fboundp keywords) (funcall keywords) (eval keywords))))
  font-lock-eval-keywords(quote)
  (set (make-local-variable 'font-lock-keywords) (font-lock-eval-keywords keywords))
  (let* ((defaults font-lock-defaults) (keywords (font-lock-choose-keywords (nth 0 defaults) (font-lock-value-in-major-mode font-lock-maximum-decoration))) (local (cdr (assq major-mode font-lock-keywords-alist))) (removed-keywords (cdr-safe (assq major-mode font-lock-removed-keywords-alist)))) (set (make-local-variable 'font-lock-keywords-only) (nth 1 defaults)) (set (make-local-variable 'font-lock-keywords-case-fold-search) (nth 2 defaults)) (if (null (nth 3 defaults)) (set (make-local-variable 'font-lock-syntax-table) nil) (set (make-local-variable 'font-lock-syntax-table) (copy-syntax-table (syntax-table))) (let ((--dolist-tail-- (nth 3 defaults))) (while --dolist-tail-- (let ((selem (car --dolist-tail--))) (let ((syntax ...)) (let (...) (while --dolist-tail-- ...))) (setq --dolist-tail-- (cdr --dolist-tail--)))))) (let ((--dolist-tail-- (nthcdr (if (consp (nth 4 defaults)) 4 5) defaults))) (while --dolist-tail-- (let ((x (car --dolist-tail--))) (set (make-local-variable (car x)) (cdr x)) (setq --dolist-tail-- (cdr --dolist-tail--))))) (print-elements-of-list font-lock-keywords) (set (make-local-variable 'font-lock-keywords) (font-lock-eval-keywords keywords)) (while local (font-lock-add-keywords nil (car (car local)) (cdr (car local))) (setq local (cdr local))) (if removed-keywords (progn (font-lock-remove-keywords nil removed-keywords))) (if (eq (car font-lock-keywords) t) nil (setq font-lock-keywords (font-lock-compile-keywords font-lock-keywords))))
  (if (and font-lock-set-defaults (eq font-lock-major-mode major-mode)) nil (setq font-lock-major-mode major-mode) (setq font-lock-set-defaults t) (let* ((defaults font-lock-defaults) (keywords (font-lock-choose-keywords (nth 0 defaults) (font-lock-value-in-major-mode font-lock-maximum-decoration))) (local (cdr (assq major-mode font-lock-keywords-alist))) (removed-keywords (cdr-safe (assq major-mode font-lock-removed-keywords-alist)))) (set (make-local-variable 'font-lock-keywords-only) (nth 1 defaults)) (set (make-local-variable 'font-lock-keywords-case-fold-search) (nth 2 defaults)) (if (null (nth 3 defaults)) (set (make-local-variable 'font-lock-syntax-table) nil) (set (make-local-variable 'font-lock-syntax-table) (copy-syntax-table (syntax-table))) (let ((--dolist-tail-- (nth 3 defaults))) (while --dolist-tail-- (let ((selem ...)) (let (...) (let ... ...)) (setq --dolist-tail-- (cdr --dolist-tail--)))))) (let ((--dolist-tail-- (nthcdr (if (consp ...) 4 5) defaults))) (while --dolist-tail-- (let ((x (car --dolist-tail--))) (set (make-local-variable (car x)) (cdr x)) (setq --dolist-tail-- (cdr --dolist-tail--))))) (print-elements-of-list font-lock-keywords) (set (make-local-variable 'font-lock-keywords) (font-lock-eval-keywords keywords)) (while local (font-lock-add-keywords nil (car (car local)) (cdr (car local))) (setq local (cdr local))) (if removed-keywords (progn (font-lock-remove-keywords nil removed-keywords))) (if (eq (car font-lock-keywords) t) nil (setq font-lock-keywords (font-lock-compile-keywords font-lock-keywords)))) (font-lock-flush))
  font-lock-set-defaults()
  (cond (mode (let ((spec (cons keywords how)) cell) (if (setq cell (assq mode font-lock-keywords-alist)) (if (eq how 'set) (setcdr cell (list spec)) (setcdr cell (append (cdr cell) (list spec)))) (setq font-lock-keywords-alist (cons (list mode spec) font-lock-keywords-alist)))) (font-lock-update-removed-keyword-alist mode keywords how)) (t (if (and font-lock-mode (not (or font-lock-keywords font-lock-defaults))) (progn (font-lock-mode -1) (set (make-local-variable 'font-lock-defaults) '(nil t)) (font-lock-mode 1))) (font-lock-set-defaults) (let ((was-compiled (eq (car font-lock-keywords) t))) (if was-compiled (setq font-lock-keywords (car (cdr font-lock-keywords)))) (if (eq how 'set) (setq font-lock-keywords keywords) (font-lock-remove-keywords nil keywords) (let ((old (if ... ... font-lock-keywords))) (setq font-lock-keywords (if how (append old keywords) (append keywords old))))) (if was-compiled (setq font-lock-keywords (font-lock-compile-keywords font-lock-keywords))))))
  font-lock-add-keywords(nil (((lambda (bound) (hl-todo--search nil bound)) (1 (hl-todo--get-face) prepend t))) t)
  hl-todo--setup()
  hl-todo-mode()
  run-hooks(change-major-mode-after-body-hook prog-mode-hook web-mode-hook)
  apply(run-hooks (change-major-mode-after-body-hook prog-mode-hook web-mode-hook))
  run-mode-hooks(web-mode-hook)
  web-mode()

Key Variables

What I've tried so far

Any help debugging further would be welcome!

d4ncer commented 3 years ago

Found the issue, nano-defaults.el sets this:

(setq font-lock-maximum-decoration nil)

which cause this form:

(font-lock-choose-keywords (nth 0 font-lock-defaults)
                        (font-lock-value-in-major-mode font-lock-maximum-decoration))

to return quote instead of ('(web-mode-fontify) t) for any buffer using or derived from web-mode.

My fix

I've updated my own config to re-set this variable on load to:

(setq font-lock-maximum-decoration '((web-mode . t) (rk-web-tsx-mode . t) (t . nil)))

Where rk-web-tsx-mode is my derived major mode for TSX files.

rougier commented 3 years ago

Thanks for the report and the explanation ! For the theme and modeline, I've moved them in individual packages to try to reduce such errors: nano-modeline nano-theme