comparison lisp/add-log.el @ 678:8cff3b3bd089

*** empty log message ***
author Roland McGrath <roland@gnu.org>
date Wed, 03 Jun 1992 06:44:38 +0000
parents 7fa6b835da67
children e694e0879463
comparison
equal deleted inserted replaced
677:7a9b4ea68565 678:8cff3b3bd089
1 ;;; add-log.el --- change log maintenance commands for Emacs 1 ;;; add-log.el --- change log maintenance commands for Emacs
2 2
3 ;; Copyright (C) 1985-1991 Free Software Foundation, Inc. 3 ;; Copyright (C) 1985, 86, 87, 88, 89, 90, 91, 1992
4 ;; Free Software Foundation, Inc.
4 5
5 ;; This file is part of GNU Emacs. 6 ;; This file is part of GNU Emacs.
6 7
7 ;; GNU Emacs is free software; you can redistribute it and/or modify 8 ;; GNU Emacs is free software; you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public License as published by 9 ;; it under the terms of the GNU General Public License as published by
40 Optional arg (interactive prefix) non-nil means prompt for user name and site. 41 Optional arg (interactive prefix) non-nil means prompt for user name and site.
41 Second arg is file name of change log. If nil, uses `change-log-default-name'. 42 Second arg is file name of change log. If nil, uses `change-log-default-name'.
42 Third arg OTHER-WINDOW non-nil means visit in other window." 43 Third arg OTHER-WINDOW non-nil means visit in other window."
43 (interactive (list current-prefix-arg 44 (interactive (list current-prefix-arg
44 (prompt-for-change-log-name))) 45 (prompt-for-change-log-name)))
45 (let* ((default (if (eq system-type 'vax-vms) 46 (let* ((full-name (if whoami
46 "$CHANGE_LOG$.TXT"
47 "ChangeLog"))
48 (full-name (if whoami
49 (read-input "Full name: " (user-full-name)) 47 (read-input "Full name: " (user-full-name))
50 (user-full-name))) 48 (user-full-name)))
51 ;; Note that some sites have room and phone number fields in 49 ;; Note that some sites have room and phone number fields in
52 ;; full name which look silly when inserted. Rather than do 50 ;; full name which look silly when inserted. Rather than do
53 ;; anything about that here, let user give prefix argument so that 51 ;; anything about that here, let user give prefix argument so that
57 (user-login-name))) 55 (user-login-name)))
58 (site-name (if whoami 56 (site-name (if whoami
59 (read-input "Site name: " (system-name)) 57 (read-input "Site name: " (system-name))
60 (system-name))) 58 (system-name)))
61 (defun (add-log-current-defun)) 59 (defun (add-log-current-defun))
62 (entry (and buffer-file-name 60 entry entry-position empty-entry)
63 (file-name-nondirectory buffer-file-name)))
64 entry-position entry-boundary empty-entry)
65 ;; Never want to add a change log entry for the ChangeLog buffer itself:
66 (if (equal default entry)
67 (setq entry nil
68 formatted-revision nil
69 defun nil))
70 (or file-name 61 (or file-name
71 (setq file-name (or change-log-default-name 62 (setq file-name (or change-log-default-name
72 default-directory))) 63 default-directory)))
73 (if (file-directory-p file-name) 64 (setq file-name (if (file-directory-p file-name)
74 (setq file-name (concat (file-name-as-directory file-name) 65 (expand-file-name (change-log-name) file-name)
75 (change-log-name)))) 66 (expand-file-name file-name)))
76 (set (make-local-variable 'change-log-default-name) file-name) 67 (set (make-local-variable 'change-log-default-name) file-name)
68 (if buffer-file-name
69 (setq entry (if (string-match
70 (concat "^" (regexp-quote (file-name-directory
71 file-name)))
72 buffer-file-name)
73 (substring buffer-file-name (match-end 0))
74 (file-name-nondirectory buffer-file-name))))
75 ;; Never want to add a change log entry for the ChangeLog buffer itself.
76 (if (equal file-name entry)
77 (setq entry nil
78 defun nil))
77 (if (and other-window (not (equal file-name buffer-file-name))) 79 (if (and other-window (not (equal file-name buffer-file-name)))
78 (find-file-other-window file-name) 80 (find-file-other-window file-name)
79 (find-file file-name)) 81 (find-file file-name))
80 (undo-boundary) 82 (undo-boundary)
81 (goto-char (point-min)) 83 (goto-char (point-min))
89 (setq empty-entry 91 (setq empty-entry
90 (and (search-forward "\n\t* \n" nil t) 92 (and (search-forward "\n\t* \n" nil t)
91 (1- (point)))) 93 (1- (point))))
92 (if (and entry 94 (if (and entry
93 (not empty-entry)) 95 (not empty-entry))
94 ;; Look for today's entry for same file 96 ;; Look for today's entry for the same file.
95 ;; If there is an empty entry (just a `*'), take the hint and 97 ;; If there is an empty entry (just a `*'), take the hint and
96 ;; use it. This is so that C-x a from the ChangeLog buffer 98 ;; use it. This is so that C-x a from the ChangeLog buffer
97 ;; itself can be used to force the next entry to be added at 99 ;; itself can be used to force the next entry to be added at
98 ;; the beginning, even if there are today's entries for the 100 ;; the beginning, even if there are today's entries for the
99 ;; same file (but perhaps different revisions). 101 ;; same file (but perhaps different revisions).
100 (setq entry-boundary (save-excursion 102 (let ((entry-boundary (save-excursion
101 (and (re-search-forward "\n[A-Z]" nil t) 103 (and (re-search-forward "\n[A-Z]" nil t)
102 (point))) 104 (point)))))
103 entry-position (save-excursion 105 (setq entry-position (save-excursion
104 (and (re-search-forward 106 (and (re-search-forward
105 (concat 107 (concat
106 (regexp-quote (concat "* " entry)) 108 (regexp-quote (concat "* " entry))
107 ;; don't accept `foo.bar' when 109 ;; don't accept `foo.bar' when
108 ;; looking for `foo': 110 ;; looking for `foo':
109 "[ \n\t,]") 111 "[ \n\t,:]")
110 entry-boundary 112 entry-boundary
111 t) 113 t)
112 (1- (match-end 0)))))) 114 (1- (match-end 0)))))))
113 (cond (entry-position 115 (cond (entry-position
114 ;; Move to existing entry for same file. 116 ;; Move to the existing entry for the same file.
115 (goto-char entry-position) 117 (goto-char entry-position)
116 (search-forward "\n\n") 118 (re-search-forward "^\\s *$")
117 (forward-line -1)) 119 (open-line 1)
120 (indent-relative-maybe))
118 (empty-entry 121 (empty-entry
119 ;; Put this file name into existing empty entry. 122 ;; Put this file name into the existing empty entry.
120 (goto-char empty-entry) 123 (goto-char empty-entry)
121 (insert (or entry ""))) 124 (if entry
125 (insert entry)))
122 (t 126 (t
123 ;; Make a new entry 127 ;; Make a new entry.
124 (forward-line 1) 128 (forward-line 1)
125 (while (looking-at "\\sW") 129 (while (looking-at "\\sW")
126 (forward-line 1)) 130 (forward-line 1))
127 (delete-region (point) 131 (delete-region (point)
128 (progn 132 (progn
129 (skip-chars-backward "\n") 133 (skip-chars-backward "\n")
130 (point))) 134 (point)))
131 (open-line 3) 135 (open-line 3)
132 (forward-line 2) 136 (forward-line 2)
133 (indent-to left-margin) 137 (indent-to left-margin)
134 (insert "* " (or entry "")))) 138 (insert "* " (or entry ""))))
135 ;; Point is at the entry for this file, 139 ;; Point is at the entry for this file,
136 ;; either at the end of the line or at the first blank line. 140 ;; either at the end of the line or at the first blank line.
137 (if defun 141 (if defun
138 (progn 142 (progn
139 ;; Make it easy to get rid of the defun name. 143 ;; Make it easy to get rid of the function name.
140 (undo-boundary) 144 (undo-boundary)
141 (insert "(" defun "): "))))) 145 (insert (if (save-excursion
146 (beginning-of-line 1)
147 (looking-at "\\s *$"))
148 ""
149 " ")
150 "(" defun "): "))
151 (if (not (save-excursion
152 (beginning-of-line 1)
153 (looking-at "\\s *\\(\\*\\s *\\)?$")))
154 (insert ":")))))
142 155
143 ;;;###autoload 156 ;;;###autoload
144 (define-key ctl-x-4-map "a" 'add-change-log-entry-other-window) 157 (define-key ctl-x-4-map "a" 'add-change-log-entry-other-window)
145 158
146 ;;;###autoload 159 ;;;###autoload
153 (list current-prefix-arg 166 (list current-prefix-arg
154 (prompt-for-change-log-name)))) 167 (prompt-for-change-log-name))))
155 (add-change-log-entry whoami file-name t)) 168 (add-change-log-entry whoami file-name t))
156 169
157 (defun change-log-mode () 170 (defun change-log-mode ()
171 "Major mode for editting change logs; like Indented Text Mode.
172 New log entries are usually made with \\[add-change-log-entry]."
158 (interactive) 173 (interactive)
159 (kill-all-local-variables) 174 (kill-all-local-variables)
160 (indented-text-mode) 175 (indented-text-mode)
161 (setq major-mode 'change-log-mode) 176 (setq major-mode 'change-log-mode)
162 (setq mode-name "Change Log") 177 (setq mode-name "Change Log")
163 ;; Let each entry behave as one paragraph: 178 ;; Let each entry behave as one paragraph:
164 (set (make-local-variable 'paragraph-start) "^$\\|^^L") 179 (set (make-local-variable 'paragraph-start) "^\\s *$\\|^^L")
165 (set (make-local-variable 'paragraph-separate) "^$\\|^^L") 180 (set (make-local-variable 'paragraph-separate) "^\\s *$\\|^^L\\|^\\sw")
166 ;; Let all entries for one day behave as one page. 181 ;; Let all entries for one day behave as one page.
167 ;; Note that a page boundary is also a paragraph boundary. 182 ;; Note that a page boundary is also a paragraph boundary.
168 ;; Unfortunately the date line of a page actually belongs to 183 ;; Unfortunately the date line of a page actually belongs to
169 ;; the next day, but I don't see how to avoid that since 184 ;; the next day, but I don't see how to avoid that since
170 ;; page moving cmds go to the end of the match, and Emacs 185 ;; page moving cmds go to the end of the match, and Emacs
171 ;; regexps don't have a context feature. 186 ;; regexps don't have a context feature.
172 (set (make-local-variable 'page-delimiter) "^[A-Z][a-z][a-z] .*\n\\|^ ") 187 (set (make-local-variable 'page-delimiter) "^[A-Z][a-z][a-z] .*\n\\|^ ")
188 (set (make-local-variable 'version-control) 'never)
189 (set (make-local-variable 'adaptive-fill-regexp) "\\s *")
173 (run-hooks 'change-log-mode-hook)) 190 (run-hooks 'change-log-mode-hook))
174 191
175 (defvar add-log-current-defun-header-regexp 192 (defvar add-log-current-defun-header-regexp
176 "^\\([A-Z][A-Z_ ]+\\|[a-z_---A-Z]+\\)[ \t]*[:=]" 193 "^\\([A-Z][A-Z_ ]+\\|[a-z_---A-Z]+\\)[ \t]*[:=]"
177 "*Heuristic regexp used by `add-log-current-defun' for unknown major modes.") 194 "*Heuristic regexp used by `add-log-current-defun' for unknown major modes.")
229 (if (re-search-backward add-log-current-defun-header-regexp 246 (if (re-search-backward add-log-current-defun-header-regexp
230 (- (point) 10000) 247 (- (point) 10000)
231 t) 248 t)
232 (buffer-substring (match-beginning 1) 249 (buffer-substring (match-beginning 1)
233 (match-end 1)))))))) 250 (match-end 1))))))))
234
235 ;;; add-log.el ends here