From 35d6e1261269d123d842858e2f5db4089abfe192 Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Thu, 7 Oct 2021 22:56:07 +0100 Subject: [PATCH] fix(navigation): resolve dired/dired+ load order issue Because dired+ must be loaded before the dired creates a buffer, we have to actually manually require dired+ when loading dired. Otherwise the first dired buffer within a fresh Emacs instance will have dired+ features, but any further buffers will. Also we can now remove a workaround for dired+ with Emacs 28 that prevented files/folders from being deleted with dired. --- modules/navigation/siren-dired+.el | 26 +++++++ modules/navigation/siren-dired.el | 116 ++--------------------------- 2 files changed, 34 insertions(+), 108 deletions(-) create mode 100644 modules/navigation/siren-dired+.el diff --git a/modules/navigation/siren-dired+.el b/modules/navigation/siren-dired+.el new file mode 100644 index 0000000..8320f38 --- /dev/null +++ b/modules/navigation/siren-dired+.el @@ -0,0 +1,26 @@ +;;; siren-dired+.el --- jimeh's Emacs Siren: dired+ configuration. + +;;; Commentary: + +;; Basic configuration for dired+. + +;;; Code: + +(use-package dired+ + :defer t + :bind (:map dired-mode-map + ("C-l" . diredp-up-directory-reuse-dir-buffer)) + + :hook + (dired-mode . siren-diredp-mode-setup) + + :init + (defun siren-diredp-mode-setup () + (toggle-diredp-find-file-reuse-dir 1)) + + :config + (unbind-key "M-i" dired-mode-map) + (unbind-key "M-l" dired-mode-map)) + +(provide 'siren-dired+) +;;; siren-dired+.el ends here diff --git a/modules/navigation/siren-dired.el b/modules/navigation/siren-dired.el index def2208..5814e0f 100644 --- a/modules/navigation/siren-dired.el +++ b/modules/navigation/siren-dired.el @@ -6,12 +6,15 @@ ;;; Code: +(require 'siren-dired+) + (use-package dired :straight (:type built-in) :defer t :hook (dired-mode . siren-dired-mode-setup) :bind (:map dired-mode-map + ("c" . dired-create-directory) ("M-?" . siren-dired-display-size)) :init @@ -68,7 +71,12 @@ (file-attributes filename))))) :config + ;; dired+ needs to explicitly loaded as it advices lots of dired functions to + ;; work. Without this, the first opened dired window will not have dired+ + ;; active, but all further dired instances will. (require 'dired+) + + ;; Set custom ls flags when a GNU ls command is available. (when (string-match-p "^gnu" (symbol-name system-type)) (setq dired-use-ls-dired t dired-listing-switches "-aBhl")) @@ -84,114 +92,6 @@ :straight (:type built-in) :after dired) -(use-package dired+ - :defer t - :bind (:map dired-mode-map - ("c" . dired-create-directory) - ("C-l" . diredp-up-directory-reuse-dir-buffer)) - - :hook - (dired-mode . siren-diredp-mode-setup) - - :init - (defun siren-diredp-mode-setup () - (toggle-diredp-find-file-reuse-dir 1)) - - :config - (unbind-key "M-i" dired-mode-map) - (unbind-key "M-l" dired-mode-map) - - ;; BEGINING OF WORKAROUND - ;; - ;; TODO: Remove this hacky workaround once Dired+ is updated for Emacs 28.x - ;; - ;; As of commit 194d54a929a83fede75d618b104acd1b544feb10 in Emacs' master - ;; branch, Dired+'s replacements of dired-do-*-deletes functions breaks - ;; file/folder deletion in Dired. - ;; - ;; Until a fix is available in Dired+, lets just restore the original fuctions - ;; from Dired. - ;; - ;; Dired change: https://github.com/emacs-mirror/emacs/commit/194d54a929a83fede75d618b104acd1b544feb10 - (defun dired-do-delete (&optional arg) - "Delete all marked (or next ARG) files. -`dired-recursive-deletes' controls whether deletion of -non-empty directories is allowed." - ;; This is more consistent with the file marking feature than - ;; dired-do-flagged-delete. - (interactive "P") - (let (markers) - (dired-internal-do-deletions - (nreverse - ;; this may move point if ARG is an integer - (dired-map-over-marks (cons (dired-get-filename) - (let ((m (point-marker))) - (push m markers) - m)) - arg)) - arg t) - (dolist (m markers) (set-marker m nil)))) - - (defun dired-do-flagged-delete (&optional nomessage) - "In Dired, delete the files flagged for deletion. -If NOMESSAGE is non-nil, we don't display any message -if there are no flagged files. -`dired-recursive-deletes' controls whether deletion of -non-empty directories is allowed." - (interactive) - (let* ((dired-marker-char dired-del-marker) - (regexp (dired-marker-regexp)) - case-fold-search markers) - (if (save-excursion (goto-char (point-min)) - (re-search-forward regexp nil t)) - (dired-internal-do-deletions - (nreverse - ;; this can't move point since ARG is nil - (dired-map-over-marks (cons (dired-get-filename) - (let ((m (point-marker))) - (push m markers) - m)) - nil)) - nil t) - (dolist (m markers) (set-marker m nil)) - (or nomessage - (message "(No deletions requested)"))))) - - (defun dired-buffers-for-dir (dir &optional file subdirs) - "Return a list of buffers for DIR (top level or in-situ subdir). -If FILE is non-nil, include only those whose wildcard pattern (if any) -matches FILE. -If SUBDIRS is non-nil, also include the dired buffers of -directories below DIR. -The list is in reverse order of buffer creation, most recent last. -As a side effect, killed dired buffers for DIR are removed from -dired-buffers." - (setq dir (file-name-as-directory dir)) - (let (result buf) - (dolist (elt dired-buffers) - (setq buf (cdr elt)) - (cond - ((null (buffer-name buf)) - ;; Buffer is killed - clean up: - (setq dired-buffers (delq elt dired-buffers))) - ((file-in-directory-p (car elt) dir) - (with-current-buffer buf - (when (and (or subdirs - (assoc dir dired-subdir-alist)) - (or (null file) - (if (stringp dired-directory) - (let ((wildcards (file-name-nondirectory - dired-directory))) - (or (zerop (length wildcards)) - (string-match-p (dired-glob-regexp wildcards) - file))) - (member (expand-file-name file dir) - (cdr dired-directory))))) - (setq result (cons buf result))))))) - result)) - ;; END OF WORKAROUND - ) - (use-package dired-subtree :after dired :bind (:map dired-mode-map