]> code.delx.au - gnu-emacs/blobdiff - lisp/add-log.el
(info-insert-file-contents): Always check for conflict with jka-compr.
[gnu-emacs] / lisp / add-log.el
index be22f9e93d0cc47fb08a1b1a0e9b188826cdbe1f..b7557b0150ad0e3a81c98073a0f67e1b275fab6e 100644 (file)
 \\[add-change-log-entry] calls this function (if nil, `add-log-current-defun'
 instead) with no arguments.  It returns a string or nil if it cannot guess.")
 
 \\[add-change-log-entry] calls this function (if nil, `add-log-current-defun'
 instead) with no arguments.  It returns a string or nil if it cannot guess.")
 
-;; This MUST not be autoloaded, since user-login-name
-;; cannot be known at Emacs dump time.
-(defvar add-log-full-name (user-full-name)
+(defvar add-log-full-name nil
   "*Full name of user, for inclusion in ChangeLog daily headers.
 This defaults to the value returned by the `user-full-name' function.")
 
   "*Full name of user, for inclusion in ChangeLog daily headers.
 This defaults to the value returned by the `user-full-name' function.")
 
-;; This MUST not be autoloaded, since user-login-name
-;; cannot be known at Emacs dump time.
-(defvar add-log-mailing-address (concat (user-login-name) "@" (system-name))
+(defvar add-log-mailing-address nil
   "*Electronic mail address of user, for inclusion in ChangeLog daily headers.
   "*Electronic mail address of user, for inclusion in ChangeLog daily headers.
-This defaults to the value returned by `user-login-name', followed by
-an `@' character, followed by the value returned by `system-name'.")
+This defaults to the value of `user-mail-address'.")
+
+(defvar change-log-font-lock-keywords
+  '(("^[SMTWF].+$" . font-lock-function-name-face)     ; Date line.
+    ("^\t\\* \\([^ :\n]+\\)" 1 font-lock-comment-face) ; File name.
+    ("\(\\([^)\n]+\\)\)" 1 font-lock-keyword-face))    ; Function name.
+  "Additional expressions to highlight in Change Log mode.")
+
+(defvar change-log-mode-map nil
+  "Keymap for Change Log major mode.")
+(if change-log-mode-map
+    nil
+  (setq change-log-mode-map (make-sparse-keymap))
+  (define-key change-log-mode-map "\M-q" 'change-log-fill-paragraph))
 
 (defun change-log-name ()
   (or change-log-default-name
 
 (defun change-log-name ()
   (or change-log-default-name
@@ -67,55 +75,53 @@ an `@' character, followed by the value returned by `system-name'.")
 ;;;###autoload
 (defun find-change-log (&optional file-name)
   "Find a change log file for \\[add-change-log-entry] and return the name.
 ;;;###autoload
 (defun find-change-log (&optional file-name)
   "Find a change log file for \\[add-change-log-entry] and return the name.
-Optional arg FILE-NAME is a name to try first.
+
+Optional arg FILE-NAME specifies the file to use.
 If FILE-NAME is nil, use the value of `change-log-default-name' if non-nil.
 If FILE-NAME is nil, use the value of `change-log-default-name' if non-nil.
-Failing that, use \"ChangeLog\" in the current directory.
-If the file does not exist in the named directory, successive parent
-directories are tried.
+Otherwise, search in the current directory and its successive parents
+for a file named `ChangeLog' (or whatever we use on this operating system).
 
 Once a file is found, `change-log-default-name' is set locally in the
 current buffer to the complete file name."
 
 Once a file is found, `change-log-default-name' is set locally in the
 current buffer to the complete file name."
+  ;; If user specified a file name or if this buffer knows which one to use,
+  ;; just use that.
   (or file-name
   (or file-name
-      (setq file-name (or change-log-default-name
-                         ;; Chase links in the source file
-                         ;; and use the change log in the dir where it points.
-                         (and buffer-file-name
-                              (file-name-directory
-                               (file-chase-links buffer-file-name)))
-                         default-directory)))
-  (if (and (eq file-name change-log-default-name)
-          (assq 'change-log-default-name (buffer-local-variables)))
-      ;; Don't do the searching if we already have a buffer-local value.
-      file-name
-
-    (if (file-directory-p file-name)
-       (setq file-name (expand-file-name (change-log-name) file-name)))
-    ;; Chase links before visiting the file.
-    ;; This makes it easier to use a single change log file
-    ;; for several related directories.
-    (setq file-name (file-chase-links file-name))
-    (setq file-name (expand-file-name file-name))
-    ;; Move up in the dir hierarchy till we find a change log file.
-    (let ((file1 file-name)
-         parent-dir)
-      (while (and (not (or (get-file-buffer file1) (file-exists-p file1)))
-                 (progn (setq parent-dir
-                              (file-name-directory
-                               (directory-file-name
-                                (file-name-directory file1))))
-                        ;; Give up if we are already at the root dir.
-                        (not (string= (file-name-directory file1)
-                                      parent-dir))))
-       ;; Move up to the parent dir and try again.
-       (setq file1 (expand-file-name 
-                    (file-name-nondirectory (change-log-name))
-            parent-dir)))
-      ;; If we found a change log in a parent, use that.
-      (if (or (get-file-buffer file1) (file-exists-p file1))
-         (setq file-name file1)))
-    ;; Make a local variable in this buffer so we needn't search again.
-    (set (make-local-variable 'change-log-default-name) file-name)
-    file-name))
+      (setq file-name change-log-default-name)
+      (progn
+       ;; Chase links in the source file
+       ;; and use the change log in the dir where it points.
+       (setq file-name (or (and buffer-file-name
+                                (file-name-directory
+                                 (file-chase-links buffer-file-name)))
+                           default-directory))
+       (if (file-directory-p file-name)
+           (setq file-name (expand-file-name (change-log-name) file-name)))
+       ;; Chase links before visiting the file.
+       ;; This makes it easier to use a single change log file
+       ;; for several related directories.
+       (setq file-name (file-chase-links file-name))
+       (setq file-name (expand-file-name file-name))
+       ;; Move up in the dir hierarchy till we find a change log file.
+       (let ((file1 file-name)
+             parent-dir)
+         (while (and (not (or (get-file-buffer file1) (file-exists-p file1)))
+                     (progn (setq parent-dir
+                                  (file-name-directory
+                                   (directory-file-name
+                                    (file-name-directory file1))))
+                            ;; Give up if we are already at the root dir.
+                            (not (string= (file-name-directory file1)
+                                          parent-dir))))
+           ;; Move up to the parent dir and try again.
+           (setq file1 (expand-file-name 
+                        (file-name-nondirectory (change-log-name))
+                        parent-dir)))
+         ;; If we found a change log in a parent, use that.
+         (if (or (get-file-buffer file1) (file-exists-p file1))
+             (setq file-name file1)))))
+  ;; Make a local variable in this buffer so we needn't search again.
+  (set (make-local-variable 'change-log-default-name) file-name)
+  file-name)
 
 ;;;###autoload
 (defun add-change-log-entry (&optional whoami file-name other-window new-entry)
 
 ;;;###autoload
 (defun add-change-log-entry (&optional whoami file-name other-window new-entry)
@@ -136,11 +142,15 @@ never append to an existing entry."
         ;; s/he can edit the full name field in prompter if s/he wants.
        (setq add-log-mailing-address
              (read-input "Mailing address: " add-log-mailing-address))))
         ;; s/he can edit the full name field in prompter if s/he wants.
        (setq add-log-mailing-address
              (read-input "Mailing address: " add-log-mailing-address))))
+  (or add-log-full-name
+      (setq add-log-full-name (user-full-name)))
+  (or add-log-mailing-address
+      (setq add-log-mailing-address user-mail-address))
   (let ((defun (funcall (or add-log-current-defun-function
                            'add-log-current-defun)))
        paragraph-end entry)
 
   (let ((defun (funcall (or add-log-current-defun-function
                            'add-log-current-defun)))
        paragraph-end entry)
 
-    (setq file-name (find-change-log file-name))
+    (setq file-name (expand-file-name (find-change-log file-name)))
 
     ;; Set ENTRY to the file name to use in the new entry.
     (and buffer-file-name
 
     ;; Set ENTRY to the file name to use in the new entry.
     (and buffer-file-name
@@ -163,11 +173,11 @@ never append to an existing entry."
     (if (looking-at (concat (regexp-quote (substring (current-time-string)
                                                     0 10))
                            ".* " (regexp-quote add-log-full-name)
     (if (looking-at (concat (regexp-quote (substring (current-time-string)
                                                     0 10))
                            ".* " (regexp-quote add-log-full-name)
-                           "  (" (regexp-quote add-log-mailing-address)))
+                           "  <" (regexp-quote add-log-mailing-address)))
        (forward-line 1)
       (insert (current-time-string)
              "  " add-log-full-name
        (forward-line 1)
       (insert (current-time-string)
              "  " add-log-full-name
-             "  (" add-log-mailing-address ")\n\n"))
+             "  <" add-log-mailing-address ">\n\n"))
 
     ;; Search only within the first paragraph.
     (if (looking-at "\n*[^\n* \t]")
 
     ;; Search only within the first paragraph.
     (if (looking-at "\n*[^\n* \t]")
@@ -262,15 +272,10 @@ Runs `change-log-mode-hook'."
   (set (make-local-variable 'page-delimiter) "^\\<\\|^\f")
   (set (make-local-variable 'version-control) 'never)
   (set (make-local-variable 'adaptive-fill-regexp) "\\s *")
   (set (make-local-variable 'page-delimiter) "^\\<\\|^\f")
   (set (make-local-variable 'version-control) 'never)
   (set (make-local-variable 'adaptive-fill-regexp) "\\s *")
+  (set (make-local-variable 'font-lock-defaults)
+       '(change-log-font-lock-keywords t))
   (run-hooks 'change-log-mode-hook))
 
   (run-hooks 'change-log-mode-hook))
 
-(defvar change-log-mode-map nil
-  "Keymap for Change Log major mode.")
-(if change-log-mode-map
-    nil
-  (setq change-log-mode-map (make-sparse-keymap))
-  (define-key change-log-mode-map "\M-q" 'change-log-fill-paragraph))
-
 ;; It might be nice to have a general feature to replace this.  The idea I
 ;; have is a variable giving a regexp matching text which should not be
 ;; moved from bol by filling.  change-log-mode would set this to "^\\s *\\s(".
 ;; It might be nice to have a general feature to replace this.  The idea I
 ;; have is a variable giving a regexp matching text which should not be
 ;; moved from bol by filling.  change-log-mode would set this to "^\\s *\\s(".
@@ -292,7 +297,7 @@ Prefix arg means justify as well."
   "Return name of function definition point is in, or nil.
 
 Understands C, Lisp, LaTeX (\"functions\" are chapters, sections, ...),
   "Return name of function definition point is in, or nil.
 
 Understands C, Lisp, LaTeX (\"functions\" are chapters, sections, ...),
-Texinfo (@node titles), and Fortran.
+Texinfo (@node titles), Perl, and Fortran.
 
 Other modes are handled by a heuristic that looks in the 10K before
 point for uppercase headings starting in the first column or
 
 Other modes are handled by a heuristic that looks in the 10K before
 point for uppercase headings starting in the first column or
@@ -303,7 +308,8 @@ Has a preference of looking backwards."
   (condition-case nil
       (save-excursion
        (let ((location (point)))
   (condition-case nil
       (save-excursion
        (let ((location (point)))
-         (cond ((memq major-mode '(emacs-lisp-mode lisp-mode scheme-mode))
+         (cond ((memq major-mode '(emacs-lisp-mode lisp-mode scheme-mode
+                                                   lisp-interaction-mode))
                 ;; If we are now precisely a the beginning of a defun,
                 ;; make sure beginning-of-defun finds that one
                 ;; rather than the previous one.
                 ;; If we are now precisely a the beginning of a defun,
                 ;; make sure beginning-of-defun finds that one
                 ;; rather than the previous one.
@@ -361,7 +367,9 @@ Has a preference of looking backwards."
                         ;; or the DEFUN macro used by the C library.
                         (if (condition-case nil
                                 (and (save-excursion
                         ;; or the DEFUN macro used by the C library.
                         (if (condition-case nil
                                 (and (save-excursion
-                                       (forward-line 1)
+                                       (end-of-line)
+                                       (while (= (preceding-char) ?\\)
+                                         (end-of-line 2))
                                        (backward-sexp 1)
                                        (beginning-of-line)
                                        (setq tem (point))
                                        (backward-sexp 1)
                                        (beginning-of-line)
                                        (setq tem (point))
@@ -420,7 +428,11 @@ Has a preference of looking backwards."
                                           (end-of-line)
                                           (point))))))
                ((eq major-mode 'texinfo-mode)
                                           (end-of-line)
                                           (point))))))
                ((eq major-mode 'texinfo-mode)
-                (if (re-search-backward "^@node[ \t]+\\([^,]+\\)," nil t)
+                (if (re-search-backward "^@node[ \t]+\\([^,\n]+\\)" nil t)
+                    (buffer-substring (match-beginning 1)
+                                      (match-end 1))))
+               ((eq major-mode 'perl-mode)
+                (if (re-search-backward "^sub[ \t]+\\([^ \t\n]+\\)" nil t)
                     (buffer-substring (match-beginning 1)
                                       (match-end 1))))
                 ((eq major-mode 'fortran-mode)
                     (buffer-substring (match-beginning 1)
                                       (match-end 1))))
                 ((eq major-mode 'fortran-mode)