From 47c8c905b8d5e455a935b4b16288449751f748cc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 9 Sep 2024 18:49:38 -0400 Subject: [PATCH] feat(dired): open dirvish sidebar w/ ' o {p,P}' A new alternative to neotree and treemacs. --- modules/config/default/+emacs-bindings.el | 3 ++ modules/config/default/+evil-bindings.el | 3 ++ modules/emacs/dired/autoload.el | 34 +++++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index b1da1068b..33b830519 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -249,6 +249,9 @@ (:when (modulep! :ui treemacs) :desc "Project sidebar" "p" #'+treemacs/toggle :desc "Find file in project rsidebar" "P" #'treemacs-find-file) + (:when (modulep! :emacs dired +dirvish) + :desc "Project sidebar" "p" #'dirvish-side + :desc "Find file in project sidebar" "P" #'+dired/dirvish-side-and-follow) (:when (modulep! :term shell) :desc "Toggle shell popup" "t" #'+shell/toggle :desc "Open shell here" "T" #'+shell/here) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index f96aa3312..0d256e171 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -697,6 +697,9 @@ (:when (modulep! :ui treemacs) :desc "Project sidebar" "p" #'+treemacs/toggle :desc "Find file in project sidebar" "P" #'treemacs-find-file) + (:when (modulep! :emacs dired +dirvish) + :desc "Project sidebar" "p" #'dirvish-side + :desc "Find file in project sidebar" "P" #'+dired/dirvish-side-and-follow) (:when (modulep! :term shell) :desc "Toggle shell popup" "t" #'+shell/toggle :desc "Open shell here" "T" #'+shell/here) diff --git a/modules/emacs/dired/autoload.el b/modules/emacs/dired/autoload.el index e44d3dda0..c2009ecbf 100644 --- a/modules/emacs/dired/autoload.el +++ b/modules/emacs/dired/autoload.el @@ -13,3 +13,37 @@ (and (not (file-remote-p default-directory)) (locate-dominating-file "." ".git") (dired-git-info-mode 1))) + +;;;###autoload +(defun +dired/dirvish-side-or-follow (&optional arg) + "Open `dirvish-side' then find the currently focused file. + +If dirvish is already open, remotely jump to the file in Dirvish. +If given the prefix ARG, then prompt for a directory (replaces existing Dirvish +sidebars)." + (interactive "P") + (save-selected-window + (let ((win (dirvish-side--session-visible-p))) + (when (and win arg) + (with-selected-window win + (dirvish-quit)) + (setq win nil)) + (unless win + (call-interactively #'dirvish-side)) + (when-let* (((not dirvish--this)) + (dir (or (dirvish--get-project-root) default-directory)) + (win (dirvish-side--session-visible-p)) + (dv (with-selected-window win (dirvish-curr))) + ((not (active-minibuffer-window))) + (file buffer-file-name)) + (with-selected-window win + (when dir + (setq dirvish--this dv) + (let (buffer-list-update-hook) (dirvish-find-entry-a dir)) + (if dirvish-side-auto-expand (dirvish-subtree-expand-to file) + (dired-goto-file file)) + (dirvish-prop :cus-header 'dirvish-side-header) + (dirvish--setup-mode-line (car (dv-layout dv))) + (dirvish-update-body-h)) + (setq dirvish--this nil))))) + (select-window (dirvish-side--session-visible-p)))