New command vc-dir-root-next-action

* lisp/vc/vc-dir.el (vc-dir-root-next-action): New command.
(vc-dir-mode-map): Bind it.
* doc/emacs/maintaining.texi (VC Directory Commands):
* etc/NEWS: Document it.
This commit is contained in:
Sean Whitton 2026-02-21 17:18:24 +00:00
parent f2b99c4c0b
commit b055b6e889
3 changed files with 36 additions and 3 deletions

View file

@ -1582,8 +1582,8 @@ basis using directory local variables (@pxref{Directory Variables}).
@subsubsection VC Directory Commands
Emacs provides several commands for navigating the VC Directory
buffer, and for marking files as belonging to the current VC
fileset.
buffer, for marking files as belonging to the current VC fileset, and
for operating on the VC fileset.
@table @kbd
@item n
@ -1647,6 +1647,12 @@ prefix, do this with all the marked files.
Discard all the changes you have made to the current fileset
(@code{vc-revert}).
@item V
Take the next logical version control operation on all files shown in
the VC Directory buffer (@code{vc-dir-root-next-action}). This is like
@w{@kbd{C-x v v}} (@pxref{Basic VC Editing}) except that it ignores any
marks and the position of point.
@item q
Quit the VC Directory buffer, and bury it (@code{quit-window}).

View file

@ -2794,6 +2794,12 @@ To restore the old, more limited behavior for VC Directory, you can do
These correspond to the existing 'z p' to pop a stash and 'P' to pop the
stash at point (deleting the stash at point is also bound to 'C-k').
+++
*** New VC Directory command 'V' ('vc-dir-root-next-action').
This is like 'v' ('vc-next-action') but applies to the whole VC-Dir
buffer, ignoring the position of point and any marks. This is useful to
check in all local changes at once.
---
*** VC Directory can now register files when checking in mixed filesets.
Previously, if some files to be checked in were unregistered but others

View file

@ -359,7 +359,6 @@ That is, refreshing the VC-Dir buffer also hides `up-to-date' and
(define-key map "I" #'vc-root-log-incoming) ;; C-x v I
(define-key map "O" #'vc-root-log-outgoing) ;; C-x v O
;; More confusing than helpful, probably
;;(define-key map "R" #'vc-revert) ;; u is taken by vc-dir-unmark.
;;(define-key map "A" #'vc-annotate) ;; g is taken by revert-buffer
;; bound by `special-mode'.
;; Marking.
@ -403,6 +402,7 @@ That is, refreshing the VC-Dir buffer also hides `up-to-date' and
(define-key map "TL" #'vc-root-log-outstanding)
(define-key map "T=" #'vc-diff-outstanding)
(define-key map "TD" #'vc-root-diff-outstanding)
(define-key map "V" #'vc-dir-root-next-action)
(let ((branch-map (make-sparse-keymap)))
(define-key map "b" branch-map)
@ -1011,6 +1011,27 @@ that share the same state."
(interactive "e")
(vc-dir-at-event e (vc-dir-mark-unmark 'vc-dir-toggle-mark-file)))
(defun vc-dir-root-next-action ()
"Like `vc-next-action' but for all files shown in the VC-Dir buffer.
This command ignores VC-Dir marks and the position of point.
When the VC-Dir's root directory is the repository root (as it usually
is), this command is useful to check in all local changes at once."
(interactive)
(let* ((only-files-list
(cl-loop for crt = (ewoc-nth vc-ewoc 0)
then (ewoc-next vc-ewoc crt)
while crt
for data = (ewoc-data crt)
unless (vc-dir-fileinfo->directory data) collect
(cons (expand-file-name (vc-dir-fileinfo->name data))
(vc-dir-fileinfo->state data))))
(vc-buffer-overriding-fileset
`(,vc-dir-backend
(,default-directory)
. ,(vc-only-files-state-and-model only-files-list
vc-dir-backend))))
(vc-next-action nil)))
(defun vc-dir-clean-files ()
"Delete marked files from repository, or the current file if no marks.
This command cleans unregistered files from the repository.