diff options
author | Lars Ingebrigtsen <larsi@gnus.org> | 2022-06-05 16:36:25 +0200 |
---|---|---|
committer | Lars Ingebrigtsen <larsi@gnus.org> | 2022-06-05 16:36:34 +0200 |
commit | 9d2f4a8d5a92fdfab80ce9faf0dcfa159189916b (patch) | |
tree | e594acec129ce3637dd49e22ad8f771e3b247fd7 /lisp/emacs-lisp | |
parent | ac6660a2d026e89214814768990d0d232f0a9d06 (diff) | |
download | emacs-9d2f4a8d5a92fdfab80ce9faf0dcfa159189916b.tar.gz emacs-9d2f4a8d5a92fdfab80ce9faf0dcfa159189916b.tar.bz2 emacs-9d2f4a8d5a92fdfab80ce9faf0dcfa159189916b.zip |
Add convenience functions for generating Emacs Lisp files
* lisp/url/url-cookie.el (url-cookie-write-file):
* lisp/international/titdic-cnv.el (tit-process-header):
* lisp/international/ja-dic-cnv.el (skkdic-convert):
* lisp/international/emoji.el (emoji--generate-file):
* lisp/emacs-lisp/loaddefs-gen.el (loaddefs-generate--rubric)
* admin/unidata/unidata-gen.el (unidata-gen-file)
(unidata-gen-charprop): Use the new functions.
* lisp/emacs-lisp/generate-file.el: New file to provide
convenience functions for generated files. It's not always
trivial to know which parts of the trailer that has to be
obfuscated to avoid not getting byte-compiled etc, and some parts
of the headers/trailers are usually forgotten when hand-coding
these.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r-- | lisp/emacs-lisp/generate-file.el | 111 | ||||
-rw-r--r-- | lisp/emacs-lisp/loaddefs-gen.el | 41 |
2 files changed, 126 insertions, 26 deletions
diff --git a/lisp/emacs-lisp/generate-file.el b/lisp/emacs-lisp/generate-file.el new file mode 100644 index 00000000000..456503df6a3 --- /dev/null +++ b/lisp/emacs-lisp/generate-file.el @@ -0,0 +1,111 @@ +;;; generate-file.el --- utility functions for generated files -*- lexical-binding: t -*- + +;; Copyright (C) 2022 Free Software Foundation, Inc. + +;; Keywords: maint +;; Package: emacs + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;;; Code: + +(eval-when-compile (require 'cl-lib)) + +(cl-defun generate-file-heading (file &key description text (code t)) + "Insert a standard header for FILE. +This header will specify that this is a generated file that +should not be edited. + +If `standard-output' is bound to a buffer, insert in that buffer. +If no, insert at point in the current buffer. + +DESCRIPTION (if any) will be used in the first line. + +TEXT (if given) will be inserted as a comment. + +If CODE is non-nil (which is the default), a Code: line is +inserted." + (with-current-buffer (if (bufferp standard-output) + standard-output + (current-buffer)) + (insert ";;; " (file-name-nondirectory file) + " --- " + (or description "automatically generated") + " (do not edit) " + " -*- lexical-binding: t -*-\n\n" + ";; This file is part of GNU Emacs.\n\n") + (when text + (insert ";;; Commentary:\n\n") + (let ((start (point)) + (fill-prefix ";; ")) + (insert ";; " text) + (fill-region start (point)))) + (ensure-empty-lines 1) + (when code + (insert ";;; Code:\n\n")))) + +(cl-defun generate-file-trailer (file &key version inhibit-provide + (coding 'utf-8-emacs-unix) autoloads + compile provide) + "Insert a standard trailer for FILE. +By default, this trailer inhibits version control, byte +compilation, updating autoloads, and uses a `utf-8-emacs-unix' +coding system. These can be inhibited by providing non-nil +values to the VERSION, NO-PROVIDE, AUTOLOADS and COMPILE +keyword arguments. + +CODING defaults to `utf-8-emacs-unix'. Use a nil value to +inhibit generating this setting, or a coding system value to use +that. + +If PROVIDE is non-nil, use that in the `provide' statement +instead of using FILE as the basis. + +If `standard-output' is bound to a buffer, insert in that buffer. +If no, insert at point in the current buffer." + (with-current-buffer (if (bufferp standard-output) + standard-output + (current-buffer)) + (ensure-empty-lines 1) + (unless inhibit-provide + (insert (format "(provide '%s)\n\n" + (or provide + (file-name-sans-extension + (file-name-nondirectory file)))))) + ;; Some of the strings below are chopped into bits to inhibit + ;; automatic scanning tools from thinking that they are actual + ;; directives. + (insert ";; Local " "Variables:\n") + (unless version + (insert ";; version-control: never\n")) + (unless compile + (insert ";; no-byte-" "compile: t\n")) ;; #$ is byte-compiled into nil. + (unless autoloads + (insert ";; no-update-autoloads: t\n")) + (when coding + (insert (format ";; coding: %s\n" + (if (eq coding t) + 'utf-8-emacs-unix + coding)))) + (insert + ";; End:\n\n" + ";;; " (file-name-nondirectory file) " ends here\n"))) + +(provide 'generate-file) + +;;; generate-file.el ends here diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el index dce5466be2d..9aa2967d7b3 100644 --- a/lisp/emacs-lisp/loaddefs-gen.el +++ b/lisp/emacs-lisp/loaddefs-gen.el @@ -40,6 +40,7 @@ (require 'radix-tree) (require 'lisp-mnt) +(require 'generate-file) (defvar autoload-compute-prefixes t "If non-nil, autoload will add code to register the prefixes used in a file. @@ -437,32 +438,20 @@ but adds an extra line to the output to modify `load-path'. If FEATURE is non-nil, FILE will provide a feature. FEATURE may be a string naming the feature, otherwise it will be based on FILE's name." - (let ((basename (file-name-nondirectory file)) - (lp (if (equal type "package") (setq type "autoloads")))) - (concat ";;; " basename - " --- automatically extracted " (or type "autoloads") - " -*- lexical-binding: t -*-\n" - (when (string-match "/lisp/loaddefs\\.el\\'" file) - ";; This file will be copied to ldefs-boot.el and checked in periodically.\n") - ";;\n" - ";;; Code:\n\n" - (if lp - "(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path))))\n\n") - "\n;;; End of scraped data\n\n" - ;; This is used outside of autoload.el, eg cus-dep, finder. - (if feature - (format "(provide '%s)\n" - (if (stringp feature) feature - (file-name-sans-extension basename)))) - ";; Local Variables:\n" - ";; version-control: never\n" - ";; no-byte-compile: t\n" ;; #$ is byte-compiled into nil. - ";; no-update-autoloads: t\n" - ";; coding: utf-8-emacs-unix\n" - ";; End:\n" - ";;; " basename - " ends here\n"))) + (let ((lp (and (equal type "package") (setq type "autoloads")))) + (with-temp-buffer + (generate-file-heading + file + :description (concat "automatically extracted " (or type "autoloads")) + :text (and (string-match "/lisp/loaddefs\\.el\\'" file) + "This file will be copied to ldefs-boot.el and checked in periodically.")) + (when lp + (insert "(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path))))\n\n")) + (insert "\n;;; End of scraped data\n\n") + (generate-file-trailer file :provide (and (stringp feature) feature) + :inhibit-provide (not feature)) + (buffer-string)))) (defun loaddefs-generate--insert-section-header (outbuf autoloads load-name file time) |