From 81fd74f17e7e2a6082c905947a603f76f04ff730 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Sat, 14 Feb 2026 16:16:15 +0200 Subject: Fix mode-line in non-file buffers and nil project root crash - Update the mode-line via window-configuration-change-hook so non-file buffers like Magit display correct project info (#1823) - Use projectile-acquire-root instead of projectile-project-root in projectile--run-project-cmd to prevent wrong-type-argument error when running commands in newly created projects (#1886) --- CHANGELOG.md | 2 ++ projectile.el | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 930f5a1..7cf4b69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ ### Bugs fixed +* [#1823](https://github.com/bbatsov/projectile/issues/1823): Update the mode-line via `window-configuration-change-hook` so non-file buffers (e.g. Magit) display the correct project info. +* [#1886](https://github.com/bbatsov/projectile/issues/1886): Fix `(wrong-type-argument stringp nil)` error when running project commands in a newly created project by using `projectile-acquire-root` instead of `projectile-project-root` in `projectile--run-project-cmd`. * [#1748](https://github.com/bbatsov/projectile/issues/1748): Fix `projectile-replace` falling back to the legacy Emacs 25/26 code path on Emacs 27+ because `fileloop` was not loaded. * [#1741](https://github.com/bbatsov/projectile/issues/1741): Fix `projectile-replace` treating the search string as a regexp instead of a literal string on Emacs 27+. * [#1729](https://github.com/bbatsov/projectile/issues/1729): Fix `projectile-root-top-down` to actually return the topmost matching project root instead of the bottommost. diff --git a/projectile.el b/projectile.el index 0098b2c..6692cff 100644 --- a/projectile.el +++ b/projectile.el @@ -569,8 +569,8 @@ Any function that does not take arguments will do." (defcustom projectile-dynamic-mode-line t "If true, update the mode-line dynamically. -Only file buffers are affected by this, as the update happens via -`find-file-hook'. +The mode-line is updated when files are opened via `find-file-hook' +and when the window configuration changes. See also `projectile-mode-line-function' and `projectile-update-mode-line'." :group 'projectile @@ -5463,7 +5463,7 @@ If SAVE-BUFFERS is non-nil save all projectile buffers before running the command. The command actually run is returned." - (let* ((project-root (projectile-project-root)) + (let* ((project-root (projectile-acquire-root)) (default-directory (projectile-compilation-dir)) (command (projectile-maybe-read-command show-prompt command @@ -6286,6 +6286,14 @@ thing shown in the mode line otherwise." (setq projectile--mode-line mode-line)) (force-mode-line-update)) +(defun projectile-update-mode-line-on-window-change () + "Update the mode-line when the window configuration changes. +This ensures the mode-line is correct in non-file buffers like +Magit that don't trigger `find-file-hook'." + (when projectile-dynamic-mode-line + (unless (file-remote-p default-directory) + (projectile-update-mode-line)))) + (defvar projectile-command-map (let ((map (make-sparse-keymap))) (define-key map (kbd "4 a") #'projectile-find-other-file-other-window) @@ -6542,12 +6550,14 @@ Otherwise behave as if called interactively. (add-hook 'find-file-hook 'projectile-find-file-hook-function) (add-hook 'projectile-find-dir-hook #'projectile-track-known-projects-find-file-hook t) (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook t t) + (add-hook 'window-configuration-change-hook #'projectile-update-mode-line-on-window-change) (advice-add 'compilation-find-file :around #'compilation-find-file-projectile-find-compilation-buffer) (advice-add 'delete-file :before #'delete-file-projectile-remove-from-cache)) (t (remove-hook 'project-find-functions #'project-projectile) (remove-hook 'find-file-hook #'projectile-find-file-hook-function) (remove-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook t) + (remove-hook 'window-configuration-change-hook #'projectile-update-mode-line-on-window-change) (advice-remove 'compilation-find-file #'compilation-find-file-projectile-find-compilation-buffer) (advice-remove 'delete-file #'delete-file-projectile-remove-from-cache)))) -- cgit v1.0