From c6a3771ff4c2dd9ccde026bf84beec69938445de Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Sun, 7 Aug 2022 12:56:25 +0200 Subject: [PATCH] [Emacs] Replace dired with dirvish, optimize TRAMP --- org/config/emacs.org | 222 ++++++++++++++++++++----------------------- 1 file changed, 103 insertions(+), 119 deletions(-) diff --git a/org/config/emacs.org b/org/config/emacs.org index f78c96d..cf3d5c6 100644 --- a/org/config/emacs.org +++ b/org/config/emacs.org @@ -3149,50 +3149,110 @@ any graphical file manager for me most of the time because: - All actions can be done with keybindings - I get a consistent behavior between Dired and Emacs, since it’s the same thing. -However, the only thing I lack still is thumbnails. In any case, I -need still to make some tweaks in order to make it usable for -me. +I used to have an extensive configuration for Dired with a couple of +additional packages to make it more usable. Dirvish rendered that +obsolete! #+begin_src emacs-lisp -(use-package dired - :straight (:type built-in) +(use-package dirvish + :straight (:build t) :defer t - :hook (dired-mode . turn-on-gnus-dired-mode) + :init (dirvish-override-dired-mode) + :custom + (dirvish-quick-access-entries + '(("h" "~/" "Home") + ("d" "~/Downloads/" "Downloads") + ("c" "~/org/config" "Config") + ("C" "~/Documents/conlanging/content" "Conlanging"))) + (dirvish-mode-line-format + '(:left (sort file-time "" file-size symlink) :right (omit yank index))) + (dirvish-attributes '(all-the-icons file-size collapse subtree-state vc-state git-msg)) + :config + (dirvish-peek-mode) + <> + <> + <> + <> + (csetq dired-dwim-target t + dired-recursive-copies 'always + dired-recursive-deletes 'top + delete-by-moving-to-trash t) :general (phundrak/evil - :keymaps 'dired-mode-map - :packages 'dired - "(" #'dired-hide-details-mode - "n" #'evil-next-line - "p" #'evil-previous-line) - :config - (csetq dired-dwim-target t - dired-recursive-copies 'always - dired-recursive-deletes 'top - dired-listing-switches "-ahl1v --time-style=long-iso --group-directories-first" - dired-auto-revert-buffer t - image-dired-thumb-size 150 - image-dired-dir (expand-file-name (file-name-as-directory "dired-img") - user-emacs-directory) - image-dired-db-file (expand-file-name "dired-db.el" user-emacs-directory) - image-dired-gallery-dir (expand-file-name (file-name-as-directory "gallery") - user-emacs-directory) - image-dired-temp-image-file (expand-file-name "temp-image" image-dired-dir) - image-dired-temp-rotate-image-file (expand-file-name "temp-rotate-image" - image-dired-dir))) + :keymaps 'dirvish-mode-map + :packages '(dired dirvish) + "q" #'dirvish-quit + "TAB" #'dirvish-subtree-toggle) + (phundrak/major-leader-key + :keymaps 'dirvish-mode-map + :packages '(dired dirvish) + "a" #'dirvish-quick-access + "e" #'dirvish-emerge-menu + "f" #'dirvish-fd-jump + "F" #'dirvish-file-info-menu + "h" '(:ignore t :which-key "history") + "hp" #'dirvish-history-go-backward + "hn" #'dirvish-history-go-forward + "hj" #'dirvish-history-jump + "hl" #'dirvish-history-last + "l" '(:ignore t :which-key "layout") + "ls" #'dirvish-layout-switch + "lt" #'dirvish-layout-toggle + "m" #'dirvish-mark-menu + "s" #'dirvish-quicksort + "S" #'dirvish-setup-menu + "y" #'dirvish-yank-menu + "n" #'dirvish-narrow)) #+end_src -Dired-x stands for “dired extra” which provides a couple more features -that are for some reason not included in dired yet. -#+begin_src emacs-lisp -(use-package dired-x - :straight (:type built-in) - :after dired - :commands (dired-jump dired-jump-other-window dired-omit-mode) - :general - (phundrak/evil - :keymaps 'dired-mode-map - :packages 'dired-x - "«" #'dired-omit-mode)) +Since Emacs 29, it is possible to enable drag-and-drop between Emacs +and other applications. +#+name: dired-drag-and-drop +#+begin_src emacs-lisp :tangle no +(csetq dired-mouse-drag-files t + mouse-drag-and-drop-region-cross-program t) +#+end_src + +In Dirvish, it’s best to use the long name of flags whenever possible, +otherwise some commands won’t work. +#+name: dired-listing-flags +#+begin_src emacs-lisp :tangle no +(csetq dired-listing-switches (string-join '("--all" + "--human-readable" + "--time-style=long-iso" + "--group-directories-first" + "-lv1") + " ")) +#+end_src + +However, it is possible to instead use ~exa~ when it is available. +Instead of making Emacs’ main thread to the file listing in a +directory, we offload it to an external thread. +#+name: dirvish-exa-offload +#+begin_src emacs-lisp :tangle no +(dirvish-define-preview exa (file) + "Use `exa' to generate directory preview." + :require ("exa") + (when (file-directory-p file) + `(shell . ("exa" "--color=always" "-al" ,file)))) + +(add-to-list 'dirvish-preview-dispatchers 'exa) +#+end_src + +Finally, some directories need to be set for Dired to store various +files and images. +#+name: dired-files-and-dirs +#+begin_src emacs-lisp :tangle no +(let ((my/file (lambda (path &optional dir) + (expand-file-name path (or dir user-emacs-directory)))) + (my/dir (lambda (path &optional dir) + (expand-file-name (file-name-as-directory path) + (or dir user-emacs-directory))))) + (csetq image-dired-thumb-size 150 + image-dired-dir (funcall my/dir "dired-img") + image-dired-db-file (funcall my/file "dired-db.el") + image-dired-gallery-dir (funcall my/dir "gallery") + image-dired-temp-image-file (funcall my/file "temp-image" image-dired-dir) + image-dired-temp-rotate-image-file (funcall my/file "temp-rotate-image" image-dired-dir))) #+end_src Copying files with Dired is a blocking process. It’s usually fine when @@ -3212,84 +3272,6 @@ happening. "C-r" #'dired-rsync)) #+end_src -~dired-du~ provides the user with the option to be able to see the size -of directories as they are, rather than just the size of their -inode. However, I will not enable it by default as it can take some -time to get the actual size of a directory. -#+begin_src emacs-lisp -(use-package dired-du - :after dired - :straight (:build t) - :general - (phundrak/evil - :keymaps 'dired-mode-map - :packages 'dired-du - "»" #'dired-du-mode)) -#+end_src - -This package on the other hand provides Git information to the user in -the current dired buffer in a similar way to how Github and Gitea -display the latest commit message and its age about a file in the file -tree. And by default, I want ~dired-git-info~ to hide file details. -#+begin_src emacs-lisp -(use-package dired-git-info - :after (dired) - :straight (:build t) - :hook (dired-after-reading . dired-git-info-auto-enable) - :general - (phundrak/evil - :keymaps 'dired-mode-map - :packages 'dired-git-info - ")" #'dired-git-info-mode) - :config - (setq dgi-auto-hide-details-p t)) -#+end_src - -Diredfl makes dired colorful, and much more readable in my opinion. -#+begin_src emacs-lisp -(use-package diredfl - :after (dired all-the-icons) - :straight (:build t) - :init - (diredfl-global-mode 1)) -#+end_src - -Dired can benefit from ~fd~, a fast reimplementation of ~find~, to -increase the speed of ~find-dired~. -#+begin_src emacs-lisp -(use-package fd-dired - :if (executable-find "fd") - :defer t - :straight (:build t) - :init - (global-set-key [remap find-dired] #'fd-dired)) -#+end_src - -And let’s add some fancy icons in dired! -#+begin_src emacs-lisp -(use-package all-the-icons-dired - :after (all-the-icons) - :straight (:build t) - :defer t - :hook (dired-mode . all-the-icons-dired-mode) - :config - (defun my/all-the-icons-dired--refresh (orig-fun &rest args) - (unless (or (not (file-remote-p default-directory)) - (<= (count-lines (point-min) (point-max)) 512)) - (apply orig-fun args))) - (advice-add #'all-the-icons-dired--refresh - :around - #'my/all-the-icons-dired--refresh)) -#+end_src - -Lastly, let’s install some extensions to ~image-dired~. -#+begin_src emacs-lisp -(use-package image-dired+ - :after (image-dired) - :straight (:build t) - :init (image-diredx-adjust-mode 1)) -#+end_src - *** Compilation mode :PROPERTIES: :CUSTOM_ID: Packages-Configuration-Emacs-built-ins-Compilation-mode-7nh817m0t8j0 @@ -3624,13 +3606,15 @@ various hosts using various protocols, such as ~ssh~ and ~rsync~. However, I have some use-case for Tramp which are not supported natively. I will describe them here. #+begin_src emacs-lisp -(require 'tramp) (use-package tramp :straight (tramp :type built-in :build t) :init <> :config - (setq tramp-ssh-controlmaster-options "") + (csetq tramp-ssh-controlmaster-options nil + tramp-verbose 0 + tramp-auto-save-directory (locate-user-emacs-file "tramp/") + tramp-chunksize 2000) (add-to-list 'backup-directory-alist ; deactivate auto-save with TRAMP (cons tramp-file-name-regexp nil))) #+end_src @@ -8374,7 +8358,7 @@ My keybinds for jumping around are prefixed by ~j~. |-----+-------------------------+-------------| | | | jump | | f | counsel-file-jump | | -| d | dired-jump | | +| d | dirvish-dwim | | | D | dired-jump-other-window | | ** Project