X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/3e9103768f83da3e27987071468c2ea012c24e31..654359e2e3cbae9727b2bf6a298054bee9e10d41:/lisp/emacs-lisp/copyright.el diff --git a/lisp/emacs-lisp/copyright.el b/lisp/emacs-lisp/copyright.el index 45d5cff1b5..3d160f5460 100644 --- a/lisp/emacs-lisp/copyright.el +++ b/lisp/emacs-lisp/copyright.el @@ -1,6 +1,7 @@ ;;; copyright.el --- update the copyright notice in current buffer -;; Copyright (C) 1991, 92, 93, 94, 95, 1998 Free Software Foundation, Inc. +;; Copyright (C) 1991, 92, 93, 94, 95, 1998, 2001, 2003, 2004 +;; Free Software Foundation, Inc. ;; Author: Daniel Pfeiffer ;; Keywords: maint, tools @@ -25,7 +26,9 @@ ;;; Commentary: ;; Allows updating the copyright year and above mentioned GPL version manually -;; or when saving a file. Do (add-hook 'write-file-hooks 'copyright-update). +;; or when saving a file. +;; Do (add-hook 'before-save-hook 'copyright-update), or use +;; M-x customize-variable RET before-save-hook RET. ;;; Code: @@ -35,24 +38,32 @@ (defcustom copyright-limit 2000 "*Don't try to update copyright beyond this position unless interactive. -`nil' means to search whole buffer." +A value of nil means to search whole buffer." :group 'copyright :type '(choice (integer :tag "Limit") (const :tag "No limit"))) - +;; The character classes have the Latin-1 version and the Latin-9 +;; version, which is probably enough. (defcustom copyright-regexp - "\\([\251©]\\|@copyright{}\\|[Cc]opyright\\s *:?\\s *(C)\ -\\|[Cc]opyright\\s *:?\\s *[\251©]\\)\ -\\s *\\([1-9][-0-9, ']*[0-9]+\\) " + "\\([©Ž©]\\|@copyright{}\\|[Cc]opyright\\s *:?\\s *\\(?:(C)\\)?\ +\\|[Cc]opyright\\s *:?\\s *[©Ž©]\\)\ +\\s *\\([1-9]\\([-0-9, ';/*%#\n\t]\\|\\s<\\|\\s>\\)*[0-9]+\\)" "*What your copyright notice looks like. The second \\( \\) construct must match the years." :group 'copyright :type 'regexp) +(defcustom copyright-years-regexp + "\\(\\s *\\)\\([1-9]\\([-0-9, ';/*%#\n\t]\\|\\s<\\|\\s>\\)*[0-9]+\\)" + "*Match additional copyright notice years. +The second \\( \\) construct must match the years." + :group 'copyright + :type 'regexp) + (defcustom copyright-query 'function - "*If non-`nil', ask user before changing copyright. + "*If non-nil, ask user before changing copyright. When this is `function', only ask when called non-interactively." :group 'copyright :type '(choice (const :tag "Do not ask") @@ -60,87 +71,110 @@ When this is `function', only ask when called non-interactively." (other :tag "Ask" t))) -(defconst copyright-current-year (substring (current-time-string) -4) - "String representing the current year.") - - ;; when modifying this, also modify the comment generated by autoinsert.el (defconst copyright-current-gpl-version "2" - "String representing the current version of the GPL or `nil'.") + "String representing the current version of the GPL or nil.") (defvar copyright-update t) +;; This is a defvar rather than a defconst, because the year can +;; change during the Emacs session. +(defvar copyright-current-year (substring (current-time-string) -4) + "String representing the current year.") + +(defun copyright-update-year (replace noquery) + (when (re-search-forward copyright-regexp (+ (point) copyright-limit) t) + ;; If the years are continued onto multiple lined + ;; that are marked as comments, skip to the end of the years anyway. + (while (save-excursion + (and (eq (following-char) ?,) + (progn (forward-char 1) t) + (progn (skip-chars-forward " \t") (eolp)) + comment-start-skip + (save-match-data + (forward-line 1) + (and (looking-at comment-start-skip) + (goto-char (match-end 0)))) + (save-match-data + (looking-at copyright-years-regexp)))) + (forward-line 1) + (re-search-forward comment-start-skip) + (re-search-forward copyright-years-regexp)) + + ;; Note that `current-time-string' isn't locale-sensitive. + (setq copyright-current-year (substring (current-time-string) -4)) + (unless (string= (buffer-substring (- (match-end 2) 2) (match-end 2)) + (substring copyright-current-year -2)) + (if (or noquery + (y-or-n-p (if replace + (concat "Replace copyright year(s) by " + copyright-current-year "? ") + (concat "Add " copyright-current-year + " to copyright? ")))) + (if replace + (replace-match copyright-current-year t t nil 1) + (let ((size (save-excursion (skip-chars-backward "0-9")))) + (if (and (eq (% (- (string-to-number copyright-current-year) + (string-to-number (buffer-substring + (+ (point) size) + (point)))) + 100) + 1) + (or (eq (char-after (+ (point) size -1)) ?-) + (eq (char-after (+ (point) size -2)) ?-))) + ;; This is a range so just replace the end part. + (delete-char size) + ;; Insert a comma with the preferred number of spaces. + (insert + (save-excursion + (if (re-search-backward "[0-9]\\( *, *\\)[0-9]" + (line-beginning-position) t) + (match-string 1) + ", "))) + ;; If people use the '91 '92 '93 scheme, do that as well. + (if (eq (char-after (+ (point) size -3)) ?') + (insert ?'))) + ;; Finally insert the new year. + (insert (substring copyright-current-year size)))))))) + ;;;###autoload -(defun copyright-update (&optional arg) - "Update the copyright notice at the beginning of the buffer to indicate -the current year. If optional prefix ARG is given replace the years in the -notice rather than adding the current year after them. If necessary and -`copyright-current-gpl-version' is set, the copying permissions following the -copyright, if any, are updated as well." - (interactive "*P") - (if copyright-update +(defun copyright-update (&optional arg interactivep) + "Update copyright notice at beginning of buffer to indicate the current year. +With prefix ARG, replace the years in the notice rather than adding +the current year after them. If necessary, and +`copyright-current-gpl-version' is set, any copying permissions +following the copyright are updated as well. +If non-nil, INTERACTIVEP tells the function to behave as when it's called +interactively." + (interactive "*P\nd") + (when (or copyright-update interactivep) + (let ((noquery (or (not copyright-query) + (and (eq copyright-query 'function) interactivep)))) (save-excursion (save-restriction (widen) (goto-char (point-min)) - (if (re-search-forward copyright-regexp copyright-limit t) - (if (string= (buffer-substring (- (match-end 2) 2) (match-end 2)) - (substring copyright-current-year -2)) - () - (backward-char 1) - (if (or (not copyright-query) - (and (eq copyright-query 'function) - (eq this-command 'copyright-update)) - (y-or-n-p (if arg - (concat "Replace copyright year(s) by " - copyright-current-year "? ") - (concat "Add " copyright-current-year - " to copyright? ")))) - (if arg - (progn - (delete-region (match-beginning 1) (match-end 1)) - (insert copyright-current-year)) - (setq arg (save-excursion (skip-chars-backward "0-9"))) - (if (and (eq (% (- (string-to-number - copyright-current-year) - (string-to-number (buffer-substring - (+ (point) arg) - (point)))) - 100) - 1) - (or (eq (char-after (+ (point) arg -1)) ?-) - (eq (char-after (+ (point) arg -2)) ?-))) - (delete-char arg) - (insert ", ") - (if (eq (char-after (+ (point) arg -3)) ?') - (insert ?'))) - (insert (substring copyright-current-year arg)))))) + (copyright-update-year arg noquery) (goto-char (point-min)) (and copyright-current-gpl-version ;; match the GPL version comment in .el files, including the ;; bilingual Esperanto one in two-column, and in texinfo.tex - (re-search-forward "\\(the Free Software Foundation; either \\|; a\\^u eldono \\([0-9]+\\)a, ? a\\^u (la\\^u via \\)version \\([0-9]+\\), or (at" - copyright-limit t) - (not (string= (buffer-substring (match-beginning 3) (match-end 3)) - copyright-current-gpl-version)) - (or (not copyright-query) - (and (eq copyright-query 'function) - (eq this-command 'copyright-update)) + (re-search-forward "\\(the Free Software Foundation;\ + either \\|; a\\^u eldono \\([0-9]+\\)a, ? a\\^u (la\\^u via \\)\ +version \\([0-9]+\\), or (at" + (+ (point) copyright-limit) t) + (not (string= (match-string 3) copyright-current-gpl-version)) + (or noquery (y-or-n-p (concat "Replace GPL version by " copyright-current-gpl-version "? "))) (progn (if (match-end 2) ;; Esperanto bilingual comment in two-column.el - (progn - (delete-region (match-beginning 2) (match-end 2)) - (goto-char (match-beginning 2)) - (insert copyright-current-gpl-version))) - (delete-region (match-beginning 3) (match-end 3)) - (goto-char (match-beginning 3)) - (insert copyright-current-gpl-version)))) + (replace-match copyright-current-gpl-version t t nil 2)) + (replace-match copyright-current-gpl-version t t nil 3)))) (set (make-local-variable 'copyright-update) nil))) - ;; If a write-file-hook returns non-nil, the file is presumed to be written. - nil) + ;; If a write-file-hook returns non-nil, the file is presumed to be written. + nil)) ;;;###autoload @@ -148,13 +182,19 @@ copyright, if any, are updated as well." "Insert a copyright by $ORGANIZATION notice at cursor." "Company: " comment-start - "Copyright (C) " copyright-current-year " by " + "Copyright (C) " `(substring (current-time-string) -4) " by " (or (getenv "ORGANIZATION") str) - '(if (> (point) copyright-limit) + '(if (> (point) (+ (point-min) copyright-limit)) (message "Copyright extends beyond `copyright-limit' and won't be updated automatically.")) - comment-end) + comment-end \n) (provide 'copyright) -;; copyright.el ends here +;; For the copyright sign: +;; Local Variables: +;; coding: emacs-mule +;; End: + +;;; arch-tag: b4991afb-b6b1-4590-bebe-e076d9d4aee8 +;;; copyright.el ends here