From bfd96e995dae796fd3f68301fcc4921fb4c42745 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Wed, 24 Jun 2020 02:59:31 +0300 Subject: [PATCH] M-n in read-directory-name of vc commands gets project dirs (bug#41821) * lisp/progmodes/project.el (project-known-roots): New autoloaded function. * lisp/vc/vc-hooks.el (vc-known-roots): New function. * lisp/vc/vc.el (vc-root-diff, vc-print-root-log): * lisp/vc/vc-dir.el (vc-dir): Use 'vc-known-roots' for default values for read-directory-name. --- etc/NEWS | 3 +++ lisp/progmodes/project.el | 6 ++++++ lisp/vc/vc-dir.el | 2 +- lisp/vc/vc-hooks.el | 5 +++++ lisp/vc/vc.el | 6 ++++-- 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 32ceec1d362..6d42fd46c2a 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -176,6 +176,9 @@ directories with the help of new command 'dired-vc-next-action'. *** More vc commands that don't change VC state can be used from non-file buffers. Such non-file buffers should have default-directory under vc. +*** Typing 'M-n' in the minibuffer that asks for a vc directory in vc commands +can retrieve directories of previously used vc projects. + *** New command 'vc-dir-root' uses the root directory without asking. *** New commands 'vc-dir-mark-registered-files' (bound to '* r') and diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index 2f213dab8b1..42715dc9dcf 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -935,6 +935,12 @@ It's also possible to enter an arbitrary directory not in the list." (read-directory-name "Select directory: " default-directory nil t) pr-dir))) +;;;###autoload +(defun project-known-roots () + "Return a list of known project roots." + (project--ensure-read-project-list) + project--list) + ;;; Project switching diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el index cdf8ab984e8..46be9b73801 100644 --- a/lisp/vc/vc-dir.el +++ b/lisp/vc/vc-dir.el @@ -1366,7 +1366,7 @@ These are the commands available for use in the file status buffer: ;; Otherwise if you do C-x v d -> C-x C-f -> C-x v d ;; you may get a new *vc-dir* buffer, different from the original (file-truename (read-directory-name "VC status for directory: " - (vc-root-dir) nil t + (vc-root-dir) (vc-known-roots) t nil)) (if current-prefix-arg (intern diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el index ce72a49b955..9675c364bb7 100644 --- a/lisp/vc/vc-hooks.el +++ b/lisp/vc/vc-hooks.el @@ -299,6 +299,11 @@ non-nil if FILE exists and its contents were successfully inserted." (set-buffer-modified-p nil) t)) +(declare-function project-try-vc "project") +(defun vc-known-roots () + "Return a list of known vc roots." + (seq-filter #'project-try-vc (mapcar #'car (project-known-roots)))) + (defun vc-find-root (file witness) "Find the root of a checked out project. The function walks up the directory tree from FILE looking for WITNESS. diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index 65775f8e46e..49323ef47d2 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -2001,7 +2001,8 @@ saving the buffer." rootdir working-revision) (if backend (setq rootdir (vc-call-backend backend 'root default-directory)) - (setq rootdir (read-directory-name "Directory for VC root-diff: ")) + (setq rootdir (read-directory-name "Directory for VC root-diff: " + nil (vc-known-roots))) (setq backend (vc-responsible-backend rootdir)) (if backend (setq default-directory rootdir) @@ -2545,7 +2546,8 @@ with its diffs (if the underlying VCS supports that)." rootdir) (if backend (setq rootdir (vc-call-backend backend 'root default-directory)) - (setq rootdir (read-directory-name "Directory for VC revision log: ")) + (setq rootdir (read-directory-name "Directory for VC revision log: " + nil (vc-known-roots))) (setq backend (vc-responsible-backend rootdir)) (unless backend (error "Directory is not version controlled"))) -- 2.39.5