diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index b9ecb770e60..764d31387e0 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -847,6 +847,7 @@ project-prefix-map (define-key map "G" 'project-or-external-find-regexp) (define-key map "r" 'project-query-replace-regexp) (define-key map "x" 'project-execute-extended-command) + (define-key map "o" 'project-other-command) (define-key map "\C-b" 'project-list-buffers) map) "Keymap for project commands.") @@ -889,10 +890,18 @@ project-other-window-command \\{project-prefix-map} \\{project-other-window-map}" (interactive) - (project--other-place-command '((display-buffer-pop-up-window) - (inhibit-same-window . t)) - project-other-window-map)) - + (if (< emacs-major-version 30) + (project--other-place-command '((display-buffer-pop-up-window) + (inhibit-same-window . t)) + project-other-window-map) + (prefix-command-preserve-state) + (let ((inhibit-message t)) (other-window-prefix)) + (message "Display next project command buffer in a new window...") + ;; Should return exitfun from set-transient-map + (set-transient-map (make-composed-keymap project-prefix-map + project-other-window-map)))) + +;; TODO: maybe rename to project-other-window-prefix ;;;###autoload (define-key ctl-x-4-map "p" #'project-other-window-command) ;;;###autoload @@ -904,8 +913,15 @@ project-other-frame-command \\{project-prefix-map} \\{project-other-frame-map}" (interactive) - (project--other-place-command '((display-buffer-pop-up-frame)) - project-other-frame-map)) + (if (< emacs-major-version 30) + (project--other-place-command '((display-buffer-pop-up-frame)) + project-other-frame-map) + (prefix-command-preserve-state) + (let ((inhibit-message t)) (other-frame-prefix)) + (message "Display next project command buffer in a new frame...") + ;; Should return exitfun from set-transient-map + (set-transient-map (make-composed-keymap project-prefix-map + project-other-frame-map)))) ;;;###autoload (define-key ctl-x-5-map "p" #'project-other-frame-command) @@ -917,7 +933,13 @@ project-other-tab-command \\{project-prefix-map}" (interactive) - (project--other-place-command '((display-buffer-in-new-tab)))) + (if (< emacs-major-version 30) + (project--other-place-command '((display-buffer-in-new-tab))) + (prefix-command-preserve-state) + (let ((inhibit-message t)) (other-tab-prefix)) + (message "Display next project command buffer in a new tab...") + ;; Should return exitfun from set-transient-map + (set-transient-map project-prefix-map))) ;;;###autoload (when (bound-and-true-p tab-prefix-map) @@ -1796,6 +1818,19 @@ project-execute-extended-command (let ((default-directory (project-root (project-current t)))) (call-interactively #'execute-extended-command))) +;;;###autoload +(defun project-other-command () + "Run command with `default-directory' set to the current project root." + (interactive) + (let* ((pr (project-current t)) + (prefix-command-echo-keystrokes-functions + (cons (lambda () (format "[execute in %s]" (project-root pr))) + prefix-command-echo-keystrokes-functions)) + (command (key-binding (read-key-sequence "") t))) + (let ((default-directory (project-root pr))) + (and command + (call-interactively command))))) + (defun project-remember-projects-under (dir &optional recursive) "Index all projects below a directory DIR. If RECURSIVE is non-nil, recurse into all subdirectories to find @@ -1874,7 +1909,8 @@ project-switch-commands (project-find-regexp "Find regexp") (project-find-dir "Find directory") (project-vc-dir "VC-Dir") - (project-eshell "Eshell")) + (project-eshell "Eshell") + (project-other-command "Other")) "Alist mapping commands to descriptions. Used by `project-switch-project' to construct a dispatch menu of commands available upon \"switching\" to another project.