]> code.delx.au - gnu-emacs/blobdiff - lisp/add-log.el
(math-random-digit): Call math-init-random-base if var-RandSeed is nil.
[gnu-emacs] / lisp / add-log.el
index 86902d884326ecc34ad6056ac359d25355016bb6..14a32e580c844bc98a91da05ea4fd73b0c5964b6 100644 (file)
@@ -1,6 +1,7 @@
 ;;; add-log.el --- change log maintenance commands for Emacs
 
-;; Copyright (C) 1985, 86, 88, 93, 94, 97, 98, 2000 Free Software Foundation, Inc.
+;; Copyright (C) 1985, 86, 88, 93, 94, 97, 98, 2000, 03, 2004
+;;           Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: tools
@@ -50,6 +51,8 @@
   :type 'hook
   :group 'change-log)
 
+;; Many modes set this variable, so avoid warnings.
+;;;###autoload
 (defcustom add-log-current-defun-function nil
   "*If non-nil, function to guess name of surrounding function.
 It is used by `add-log-current-defun' in preference to built-in rules.
@@ -227,13 +230,16 @@ Note: The search is conducted only within 10%, at the beginning of the file."
      ;; Possibly further names in a list:
      ("\\=, \\([^ ,:([\n]+\\)" nil nil (1 'change-log-file-face))
      ;; Possibly a parenthesized list of names:
-     ("\\= (\\([^) ,:\n]+\\)" nil nil (1 'change-log-list-face))
-     ("\\=, *\\([^) ,:\n]+\\)" nil nil (1 'change-log-list-face)))
+     ("\\= (\\([^() ,\n]+\\|(\\(setf\\|SETF\\) [^() ,\n]+)\\)"
+      nil nil (1 'change-log-list-face))
+     ("\\=, *\\([^() ,\n]+\\|(\\(setf\\|SETF\\) [^() ,\n]+)\\)"
+      nil nil (1 'change-log-list-face)))
     ;;
     ;; Function or variable names.
-    ("^\t(\\([^) ,:\n]+\\)"
+    ("^\t(\\([^() ,\n]+\\|(\\(setf\\|SETF\\) [^() ,\n]+)\\)"
      (1 'change-log-list-face)
-     ("\\=, *\\([^) ,:\n]+\\)" nil nil (1 'change-log-list-face)))
+     ("\\=, *\\([^() ,\n]+\\|(\\(setf\\|SETF\\) [^() ,\n]+)\\)" nil nil
+      (1 'change-log-list-face)))
     ;;
     ;; Conditionals.
     ("\\[!?\\([^]\n]+\\)\\]\\(:\\| (\\)" (1 'change-log-conditionals-face))
@@ -246,7 +252,11 @@ Note: The search is conducted only within 10%, at the beginning of the file."
      2 'change-log-acknowledgement-face))
   "Additional expressions to highlight in Change Log mode.")
 
-(defvar change-log-mode-map (make-sparse-keymap)
+(defvar change-log-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [?\C-c ?\C-p] 'add-log-edit-prev-comment)
+    (define-key map [?\C-c ?\C-n] 'add-log-edit-next-comment)
+    map)
   "Keymap for Change Log major mode.")
 
 (defvar change-log-time-zone-rule nil
@@ -287,6 +297,31 @@ If nil, use local time.")
          "$CHANGE_LOG$.TXT"
        "ChangeLog")))
 
+(defun add-log-edit-prev-comment (arg)
+  "Cycle backward through Log-Edit mode comment history.
+With a numeric prefix ARG, go back ARG comments."
+  (interactive "*p")
+  (save-restriction
+    (narrow-to-region (point)
+                     (if (memq last-command '(add-log-edit-prev-comment
+                                              add-log-edit-next-comment))
+                         (mark) (point)))
+    (when (fboundp 'log-edit-previous-comment)
+      (log-edit-previous-comment arg)
+      (indent-region (point-min) (point-max))
+      (goto-char (point-min))
+      (unless (save-restriction (widen) (bolp))
+       (delete-region (point) (progn (skip-chars-forward " \t\n") (point))))
+      (set-mark (point-min))
+      (goto-char (point-max))
+      (delete-region (point) (progn (skip-chars-backward " \t\n") (point))))))
+
+(defun add-log-edit-next-comment (arg)
+  "Cycle forward through Log-Edit mode comment history.
+With a numeric prefix ARG, go back ARG comments."
+  (interactive "*p")
+  (add-log-edit-prev-comment (- arg)))
+
 ;;;###autoload
 (defun prompt-for-change-log-name ()
   "Prompt for a change log name."
@@ -310,27 +345,26 @@ If nil, use local time.")
 This is the value returned by `vc-workfile-version' or, if that is
 nil, by matching `change-log-version-number-regexp-list'."
   (let* ((size (buffer-size))
-        (end
+        (limit
          ;; The version number can be anywhere in the file, but
          ;; restrict search to the file beginning: 10% should be
          ;; enough to prevent some mishits.
          ;;
          ;; Apply percentage only if buffer size is bigger than
          ;; approx 100 lines.
-         (if (> size (* 100 80))
-             (/ size 10)
-           size))
-        version)
+         (if (> size (* 100 80)) (+ (point) (/ size 10)))))
     (or (and buffer-file-name (vc-workfile-version buffer-file-name))
        (save-restriction
          (widen)
-         (let ((regexps change-log-version-number-regexp-list))
+         (let ((regexps change-log-version-number-regexp-list)
+               version)
            (while regexps
              (save-excursion
                (goto-char (point-min))
-               (when (re-search-forward (pop regexps) end t)
+               (when (re-search-forward (pop regexps) limit t)
                  (setq version (match-string 1)
-                       regexps nil)))))))))
+                       regexps nil))))
+           version)))))
 
 
 ;;;###autoload
@@ -414,7 +448,7 @@ Optional arg BUFFER-FILE overrides `buffer-file-name'."
 (defun add-change-log-entry (&optional whoami file-name other-window new-entry)
   "Find change log file, and add an entry for today and an item for this file.
 Optional arg WHOAMI (interactive prefix) non-nil means prompt for user
-name and site.
+name and email (stored in `add-log-full-name' and `add-log-mailing-address').
 
 Second arg FILE-NAME is file name of the change log.
 If nil, use the value of `change-log-default-name'.
@@ -437,20 +471,6 @@ Today's date is calculated according to `change-log-time-zone-rule' if
 non-nil, otherwise in local time."
   (interactive (list current-prefix-arg
                     (prompt-for-change-log-name)))
-  (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))
-  (if whoami
-      (progn
-       (setq add-log-full-name (read-input "Full name: " add-log-full-name))
-        ;; Note that some sites have room and phone number fields in
-        ;; full name which look silly when inserted.  Rather than do
-        ;; anything about that here, let user give prefix argument so that
-        ;; 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))))
-
   (let* ((defun (add-log-current-defun))
         (version (and change-log-version-info-enabled
                       (change-log-version-number-search)))
@@ -458,11 +478,22 @@ non-nil, otherwise in local time."
                            (funcall add-log-buffer-file-name-function)
                          buffer-file-name))
         (buffer-file (if buf-file-name (expand-file-name buf-file-name)))
-        (file-name (expand-file-name
-                    (or file-name (find-change-log file-name buffer-file))))
+        (file-name (expand-file-name (find-change-log file-name buffer-file)))
         ;; Set ITEM to the file name to use in the new item.
         (item (add-log-file-name buffer-file file-name))
-        bound)
+        bound
+        (full-name (or add-log-full-name (user-full-name)))
+        (mailing-address (or add-log-mailing-address user-mail-address)))
+
+    (if whoami
+       (progn
+         (setq full-name (read-input "Full name: " full-name))
+         ;; Note that some sites have room and phone number fields in
+         ;; full name which look silly when inserted.  Rather than do
+         ;; anything about that here, let user give prefix argument so that
+         ;; s/he can edit the full name field in prompter if s/he wants.
+         (setq mailing-address
+               (read-input "Mailing address: " mailing-address))))
 
     (unless (equal file-name buffer-file-name)
       (if (or other-window (window-dedicated-p (selected-window)))
@@ -482,11 +513,11 @@ non-nil, otherwise in local time."
     ;; Advance into first entry if it is usable; else make new one.
     (let ((new-entries (mapcar (lambda (addr)
                                 (concat (funcall add-log-time-format)
-                                        "  " add-log-full-name
+                                        "  " full-name
                                         "  <" addr ">"))
-                              (if (consp add-log-mailing-address)
-                                  add-log-mailing-address
-                                (list add-log-mailing-address)))))
+                              (if (consp mailing-address)
+                                  mailing-address
+                                (list mailing-address)))))
       (if (and (not add-log-always-start-new-record)
                (let ((hit nil))
                 (dolist (entry new-entries hit)
@@ -564,8 +595,13 @@ non-nil, otherwise in local time."
        (skip-syntax-backward " ")
        (skip-chars-backward "):")
        (if (and (looking-at "):")
-                (> fill-column (+ (current-column) (length defun) 4)))
-           (progn (delete-region (point) pos) (insert ", "))
+                (let ((pos (save-excursion (backward-sexp 1) (point))))
+                  (when (equal (buffer-substring pos (point)) defun)
+                    (delete-region pos (point)))
+                  (> fill-column (+ (current-column) (length defun) 4))))
+           (progn (skip-chars-backward ", ")
+                  (delete-region (point) pos)
+                  (unless (memq (char-before) '(?\()) (insert ", ")))
          (if (looking-at "):")
              (delete-region (+ 1 (point)) (line-end-position)))
          (goto-char pos)
@@ -585,20 +621,44 @@ the change log file in another window."
   (add-change-log-entry whoami file-name t))
 ;;;###autoload (define-key ctl-x-4-map "a" 'add-change-log-entry-other-window)
 
+(defvar add-log-indent-text 0)
+
+(defun add-log-indent ()
+  (let* ((indent
+         (save-excursion
+           (beginning-of-line)
+           (skip-chars-forward " \t")
+           (cond
+            ((and (looking-at "\\(.*\\)  [^ \n].*[^ \n]  <.*>$")
+                  ;; Matching the output of add-log-time-format is difficult,
+                  ;; but I'll get it has at least two adjacent digits.
+                  (string-match "[[:digit:]][[:digit:]]" (match-string 1)))
+             0)
+            ((looking-at "[^*(]")
+             (+ (current-left-margin) add-log-indent-text))
+            (t (current-left-margin)))))
+        (pos (save-excursion (indent-line-to indent) (point))))
+    (if (> pos (point)) (goto-char pos))))
+
+
+(defvar smerge-resolve-function)
+
 ;;;###autoload
 (define-derived-mode change-log-mode text-mode "Change Log"
   "Major mode for editing change logs; like Indented Text Mode.
 Prevents numeric backups and sets `left-margin' to 8 and `fill-column' to 74.
 New log entries are usually made with \\[add-change-log-entry] or \\[add-change-log-entry-other-window].
 Each entry behaves as a paragraph, and the entries for one day as a page.
-Runs `change-log-mode-hook'."
+Runs `change-log-mode-hook'.
+\\{change-log-mode-map}"
   (setq left-margin 8
        fill-column 74
        indent-tabs-mode t
        tab-width 8)
   (set (make-local-variable 'fill-paragraph-function)
        'change-log-fill-paragraph)
-  (set (make-local-variable 'indent-line-function) 'indent-to-left-margin)
+  (set (make-local-variable 'indent-line-function) 'add-log-indent)
+  (set (make-local-variable 'tab-always-indent) nil)
   ;; We really do want "^" in paragraph-start below: it is only the
   ;; lines that begin at column 0 (despite the left-margin of 8) that
   ;; we are looking for.  Adding `* ' allows eliding the blank line
@@ -719,9 +779,28 @@ Has a preference of looking backwards."
                   (forward-line 1))
                 (or (eobp)
                     (forward-char 1))
-                (beginning-of-defun)
-                (when (progn (end-of-defun)
-                             (< location (point)))
+                (let (maybe-beg)
+                  ;; Try to find the containing defun.
+                  (beginning-of-defun)
+                  (end-of-defun)
+                  ;; If the defun we found ends before the desired position,
+                  ;; see if there's a DEFUN construct
+                  ;; between that end and the desired position.
+                  (when (save-excursion
+                          (and (> location (point))
+                               (re-search-forward "^DEFUN" 
+                                                  (save-excursion
+                                                    (goto-char location)
+                                                    (line-end-position))
+                                                  t)
+                               (re-search-forward "^{" nil t)
+                               (setq maybe-beg (point))))
+                    ;; If so, go to the end of that instead.
+                    (goto-char maybe-beg)
+                    (end-of-defun)))
+                ;; If the desired position is within the defun we found,
+                ;; find the function name.
+                (when (< location (point))
                   (backward-sexp 1)
                   (let (beg tem)
 
@@ -984,4 +1063,5 @@ old-style time formats for entries are supported."
 
 (provide 'add-log)
 
+;;; arch-tag: 81eee6fc-088f-4372-a37f-80ad9620e762
 ;;; add-log.el ends here