From 2418e0aa770dbab25f73185d9a30acdbfd9d86ab Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Fri, 9 Dec 2022 10:58:22 +0100 Subject: [PATCH] Make checkdoc warn if not using lexical-binding * lisp/emacs-lisp/checkdoc.el (checkdoc-file-comments-engine): Warn if there is no lexical-binding cookie. --- etc/NEWS | 7 +++++++ lisp/emacs-lisp/checkdoc.el | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 7f073c4e2d..1025f43207 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -56,6 +56,13 @@ switches for shortlogs, such as the one produced by 'C-x v L'. You can now configure how to display the "*buffer-selection*" buffer using this new option. (Or set 'display-buffer-alist' directly.) +** checkdoc + +--- +*** New checkdock warning if not using lexical-binding. +Checkdoc now warns if the first line of an Emacs Lisp file does not +end with a "-*- lexical-binding: t -*-" cookie. + * New Modes and Packages in Emacs 30.1 diff --git a/lisp/emacs-lisp/checkdoc.el b/lisp/emacs-lisp/checkdoc.el index 3bddb93b64..4ef6f0a212 100644 --- a/lisp/emacs-lisp/checkdoc.el +++ b/lisp/emacs-lisp/checkdoc.el @@ -2369,6 +2369,30 @@ checkdoc-file-comments-engine (point-min) (save-excursion (goto-char (point-min)) (line-end-position)))) nil)) + (setq + err + ;; Lexical binding cookie. + (if (not (save-excursion + (save-restriction + (goto-char (point-min)) + (narrow-to-region (point) (pos-eol)) + (re-search-forward + (rx "-*-" (* (* nonl) ";") + (* space) "lexical-binding:" (* space) "t" (* space) + (* ";" (* nonl)) + "-*-") + nil t)))) + (let ((pos (save-excursion (goto-char (point-min)) + (goto-char (pos-eol)) + (point)))) + (if (checkdoc-y-or-n-p "There is no lexical-binding cookie! Add one?") + (progn + (goto-char pos) + (insert " -*- lexical-binding: t -*-")) + (checkdoc-create-error + "The first line should end with \"-*- lexical-binding: t -*-\"" + pos (1+ pos) t))) + nil)) (setq err (or -- 2.35.1