From: João Távora Date: Sat, 21 Jul 2018 14:54:21 +0000 (+0100) Subject: New option to make 'C-x 4 a' use file-less ChangeLog buffers X-Git-Tag: emacs-27.0.90~4664^2~48 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=f96fe57fb76df8e7282f266d42a0d471780e1d75;p=emacs.git New option to make 'C-x 4 a' use file-less ChangeLog buffers * doc/emacs/maintaining.texi (Change Log Commands): Document add-log-dont-create-changelog-file. * etc/NEWS (Change Logs Mode): Mention add-log-dont-create-changelog-file. * lisp/vc/add-log.el (add-log-file-name): Add comment. (add-log-dont-create-changelog-file): New variable. (add-log--pseudo-changelog-buffer-name) (add-log--changelog-buffer-p): New helpers. (add-log-find-changelog-buffer): New function. (add-log--pseudo-changelog-buffer-name): Respect add-log-dont-create-changelog-file. * lisp/vc/log-edit.el (log-edit-changelog-entries): Use add-log-find-changelog-buffer. --- diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi index 024fd9728c5..c59978ebbe2 100644 --- a/doc/emacs/maintaining.texi +++ b/doc/emacs/maintaining.texi @@ -1655,10 +1655,18 @@ not just to the next change log entry. You can also use log files into a buffer in Change Log Mode, preserving the date ordering of entries. +@vindex add-log-dont-create-changelog-file Version control systems are another way to keep track of changes in -your program and keep a change log. In the VC log buffer, typing -@kbd{C-c C-a} (@code{log-edit-insert-changelog}) inserts the relevant -change log entry, if one exists. @xref{Log Buffer}. +your program and keep a change log. In these situations, you may not +want to keep a separate versioned change log file. If +@code{add-log-dont-create-changelog-file} is non-@code{nil}, commands +like @kbd{C-x 4 a} (@code{add-change-log-entry-other-window}) will +record changes in a suitably named temporary buffer instead of a file, +unless such a file already exists. + +In either case, you can type @kbd{C-c C-a} +(@code{log-edit-insert-changelog}) in the VC Log buffer to insert the +relevant change log entries, if they exist. @xref{Log Buffer}. @node Format of ChangeLog @subsection Format of ChangeLog diff --git a/etc/NEWS b/etc/NEWS index 8275cbb72c0..72e35f93e19 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -217,6 +217,13 @@ navigation and editing of large files. * Changes in Specialized Modes and Packages in Emacs 27.1 +** Change Logs and VC + +*** Recording ChangeLog entries doesn't require an actual file +An existing file will be used if it already exists. This is +controlled by the defcustom 'add-log-dont-create-changelog-file', +which defaults to t. + ** diff-mode *** Hunks are now automatically refined by default To disable it, set the new defcustom 'diff-font-lock-refine' to nil. diff --git a/lisp/vc/add-log.el b/lisp/vc/add-log.el index 4d69aac454c..5ed43e8c8c4 100644 --- a/lisp/vc/add-log.el +++ b/lisp/vc/add-log.el @@ -744,6 +744,7 @@ Optional arg BUFFER-FILE overrides `buffer-file-name'." file-name) (defun add-log-file-name (buffer-file log-file) + "Compute file-name of BUFFER-FILE as displayed in LOG-FILE." ;; Never want to add a change log entry for the ChangeLog file itself. (unless (or (null buffer-file) (string= buffer-file log-file)) (if add-log-file-name-function @@ -767,36 +768,76 @@ Optional arg BUFFER-FILE overrides `buffer-file-name'." (file-name-sans-versions buffer-file) buffer-file)))) -;;;###autoload -(defun add-change-log-entry (&optional whoami file-name other-window new-entry - put-new-entry-on-new-line) - "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 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'. - -Third arg OTHER-WINDOW non-nil means visit in other window. +(defcustom add-log-dont-create-changelog-file t + "If non-nil, don't create ChangeLog files for log entries. +This applies only if no pre-existing ChangeLog is found." + :type :boolean + :version "27.1") -Fourth arg NEW-ENTRY non-nil means always create a new entry at the front; -never append to an existing entry. Option `add-log-keep-changes-together' -otherwise affects whether a new entry is created. +(put 'add-log-dont-create-changelog-file 'safe-local-variable 'booleanp) -Fifth arg PUT-NEW-ENTRY-ON-NEW-LINE non-nil means that if a new -entry is created, put it on a new line by itself, do not put it -after a comma on an existing line. +(defun add-log--pseudo-changelog-buffer-name (changelog-file-name) + "Compute suitable name for a non-file ChangeLog buffer. + CHANGELOG-FILE-NAME is the file name of the actual ChangeLog file + if it were to exist." + (format "*changes to %s*" + (abbreviate-file-name + (file-name-directory changelog-file-name)))) -Option `add-log-always-start-new-record' non-nil means always create a -new record, even when the last record was made on the same date and by -the same person. - -The change log file can start with a copyright notice and a copying -permission notice. The first blank line indicates the end of these -notices. +(defun add-log--changelog-buffer-p (changelog-file-name buffer) + "Tell if BUFFER holds a ChangeLog for CHANGELOG-FILE-NAME." + (with-current-buffer buffer + (if buffer-file-name + (equal buffer-file-name changelog-file-name) + (equal (add-log--pseudo-changelog-buffer-name changelog-file-name) + (buffer-name))))) + +(defun add-log-find-changelog-buffer (changelog-file-name) + "Find a ChangeLog buffer for CHANGELOG-FILE-NAME. + Respect `add-log-use-pseudo-changelog', which see." + (if (or (file-exists-p changelog-file-name) + (not add-log-dont-create-changelog-file)) + (find-file-noselect changelog-file-name) + (get-buffer-create + (add-log--pseudo-changelog-buffer-name changelog-file-name)))) -Today's date is calculated according to `add-log-time-zone-rule' if -non-nil, otherwise in local time." +;;;###autoload +(defun add-change-log-entry (&optional whoami + changelog-file-name + other-window new-entry + put-new-entry-on-new-line) + "Find ChangeLog buffer, add an entry for today and an item for this file. + Optional arg WHOAMI (interactive prefix) non-nil means prompt for + user name and email (stored in `add-log-full-name' and + `add-log-mailing-address'). + + Second arg CHANGELOG-FILE-NAME is file name of the change log. + If nil, use the value of `change-log-default-name'. If the file + thus named exists, it's used for the new entry. If it doesn't + exist, it is created, unless `add-log-dont-create-changelog-file' is t, + in which case a suitably named file-less buffer is used for + keeping entries pertaining to CHANGELOG-FILE-NAME's directory. + + Third arg OTHER-WINDOW non-nil means visit in other window. + + Fourth arg NEW-ENTRY non-nil means always create a new entry at the front; + never append to an existing entry. Option `add-log-keep-changes-together' + otherwise affects whether a new entry is created. + + Fifth arg PUT-NEW-ENTRY-ON-NEW-LINE non-nil means that if a new + entry is created, put it on a new line by itself, do not put it + after a comma on an existing line. + + Option `add-log-always-start-new-record' non-nil means always create a + new record, even when the last record was made on the same date and by + the same person. + + The change log file can start with a copyright notice and a copying + permission notice. The first blank line indicates the end of these + notices. + + Today's date is calculated according to `add-log-time-zone-rule' if + non-nil, otherwise in local time." (interactive (list current-prefix-arg (prompt-for-change-log-name))) (let* ((defun (add-log-current-defun)) @@ -804,20 +845,28 @@ non-nil, otherwise in local time." (change-log-version-number-search))) (buf-file-name (funcall add-log-buffer-file-name-function)) (buffer-file (if buf-file-name (expand-file-name buf-file-name))) - (file-name (expand-file-name (find-change-log file-name buffer-file))) + (changelog-file-name (expand-file-name (find-change-log + changelog-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))) + (item (add-log-file-name buffer-file changelog-file-name))) - (unless (equal file-name buffer-file-name) + ;; don't add entries from the ChangeLog file/buffer to itself. + (unless (equal changelog-file-name buffer-file-name) (cond - ((equal file-name (buffer-file-name (window-buffer))) + ((add-log--changelog-buffer-p + changelog-file-name + (window-buffer)) ;; If the selected window already shows the desired buffer don't show ;; it again (particularly important if other-window is true). ;; This is important for diff-add-change-log-entries-other-window. (set-buffer (window-buffer))) ((or other-window (window-dedicated-p)) - (find-file-other-window file-name)) - (t (find-file file-name)))) + (switch-to-buffer-other-window + (add-log-find-changelog-buffer changelog-file-name))) + (t + (switch-to-buffer + (add-log-find-changelog-buffer changelog-file-name))))) (or (derived-mode-p 'change-log-mode) (change-log-mode)) (undo-boundary) diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el index 6ff782a6061..90860fbdcfe 100644 --- a/lisp/vc/log-edit.el +++ b/lisp/vc/log-edit.el @@ -913,8 +913,10 @@ where LOGBUFFER is the name of the ChangeLog buffer, and each (setq change-log-default-name nil) (find-change-log))))) (when (or (find-buffer-visiting changelog-file-name) - (file-exists-p changelog-file-name)) - (with-current-buffer (find-file-noselect changelog-file-name) + (file-exists-p changelog-file-name) + add-log-dont-create-changelog-file) + (with-current-buffer + (add-log-find-changelog-buffer changelog-file-name) (unless (eq major-mode 'change-log-mode) (change-log-mode)) (goto-char (point-min)) (if (looking-at "\\s-*\n") (goto-char (match-end 0)))