fedora-csb-system-manager
1;;; config-dired.el -- -*- lexical-binding: t; -*-
2;;; Commentary:
3;;; Configuration of Dired
4;;; Code:
5
6(defun my-substspaces (str)
7 (subst-char-in-string ?\s ?_ str))
8
9(defmacro vde/dired-fd (name doc prompt &rest flags)
10 "Make commands for selecting 'fd' results with completion.
11NAME is how the function should be named. DOC is the function's
12documentation string. PROMPT describes the scope of the query.
13FLAGS are the command-line arguments passed to the 'fd'
14executable, each of which is a string."
15 `(defun ,name (&optional arg)
16 ,doc
17 (interactive "P")
18 (let* ((vc (vc-root-dir))
19 (dir (expand-file-name (if vc vc default-directory)))
20 (regexp (read-regexp
21 (format "%s matching REGEXP in %s: " ,prompt
22 (propertize dir 'face 'bold))))
23 (names (process-lines "fd" ,@flags regexp dir))
24 (buf "*FD Dired*"))
25 (if names
26 (if arg
27 (dired (cons (generate-new-buffer-name buf) names))
28 (find-file
29 (completing-read (format "Items matching %s (%s): "
30 (propertize regexp 'face 'success)
31 (length names))
32 names nil t))))
33 (user-error (format "No matches for « %s » in %s" regexp dir)))))
34
35(use-package dired
36 :unless noninteractive
37 :commands (dired find-name-dired)
38 :hook ((dired-mode . dired-hide-details-mode)
39 (dired-mode . toggle-truncate-lines)
40 (dired-mode . hl-line-mode))
41 :bind (("C-c RET" . vde/open-in-external-app)
42 ("C-c f g" . vde/dired-get-size)
43 ("M-s d" . vde/dired-fd-dirs)
44 ("M-s z" . vde/dired-fd-files-and-dirs)
45 ("C-c f f" . find-name-dired)
46 (:map dired-mode-map
47 ("M-p" . vde/dired-up)
48 ("^" . vde/dired-up)
49 ("<backspace>" . vde/dired-up)
50 ("M-n" . vde/dired-down)
51 ("!" . vde/sudired)
52 ("<prior>" . beginend-dired-mode-goto-beginning)
53 ("<next>" . beginend-dired-mode-goto-end)
54 ("b" . dired-do-open)))
55 :config
56 (setq-default dired-auto-revert-buffer t
57 dired-recursive-copies 'always
58 dired-recursive-deletes 'always
59 dired-isearch-filenames 'dwim
60 delete-by-moving-to-trash t
61 dired-listing-switches "-lFaGh1v --group-directories-first"
62 dired-ls-F-marks-symlinks t
63 dired-dwim-target t)
64
65 (when (string= system-type "darwin")
66 (setq dired-use-ls-dired t
67 insert-directory-program "/usr/local/bin/gls"))
68
69 ;; Enable dired-find-alternate-file
70 (put 'dired-find-alternate-file 'disabled nil)
71
72 (defun vde/dired-substspaces (&optional arg)
73 "Rename all marked (or next ARG) files so that spaces are replaced with underscores."
74 (interactive "P")
75 (dired-rename-non-directory #'my-substspaces "Rename by substituting spaces" arg))
76 (if (keymap-lookup dired-mode-map "% s")
77 (message "Error: %% s already defined in dired-mode-map")
78 (define-key dired-mode-map "%s" 'vde/dired-substspaces))
79
80 (defun vde/dired-up ()
81 "Go to previous directory."
82 (interactive)
83 (find-alternate-file ".."))
84
85 (defun vde/dired-down ()
86 "Enter directory."
87 (interactive)
88 (dired-find-alternate-file))
89
90 (defun vde/open-in-external-app ()
91 "Open the file(s) at point with an external application."
92 (interactive)
93 (let* ((file-list
94 (dired-get-marked-files)))
95 (mapc
96 (lambda (file-path)
97 (let ((process-connection-type nil))
98 (start-process "" nil "xdg-open" file-path))) file-list)))
99
100 (defun find-file-reuse-dir-buffer ()
101 "Like `dired-find-file', but reuse Dired buffers."
102 (interactive)
103 (set-buffer-modified-p nil)
104 (let ((file (dired-get-file-for-visit)))
105 (if (file-directory-p file)
106 (find-alternate-file file)
107 (find-file file))))
108
109 (defun vde/sudired ()
110 "Open directory with sudo in Dired."
111 (interactive)
112 (require 'tramp)
113 (let ((dir (expand-file-name default-directory)))
114 (if (string-match "^/sudo:" dir)
115 (user-error "Already in sudo")
116 (dired (concat "/sudo::" dir)))))
117
118 (defun vde/dired-get-size ()
119 "Quick and easy way to get file size in Dired."
120 (interactive)
121 (let ((files (dired-get-marked-files)))
122 (with-temp-buffer
123 (apply 'call-process "du" nil t nil "-sch" files)
124 (message
125 "Size of all marked files: %s"
126 (progn
127 (re-search-backward "\\(^[0-9.,]+[A-Za-z]+\\).*total$")
128 (match-string 1))))))
129
130 (vde/dired-fd
131 vde/dired-fd-dirs
132 "Search for directories in VC root or PWD.
133With \\[universal-argument] put the results in a `dired' buffer.
134This relies on the external 'fd' executable."
135 "Subdirectories"
136 "-i" "-H" "-a" "-t" "d" "-c" "never")
137
138 (vde/dired-fd
139 vde/dired-fd-files-and-dirs
140 "Search for files and directories in VC root or PWD.
141With \\[universal-argument] put the results in a `dired' buffer.
142This relies on the external 'fd' executable."
143 "Files and dirs"
144 "-i" "-H" "-a" "-t" "d" "-t" "f" "-c" "never")
145 )
146
147(use-package find-dired
148 :after dired
149 :commands (find-name-dired)
150 :config
151 (setq-default find-ls-option ;; applies to `find-name-dired'
152 '("-ls" . "-AFhlv --group-directories-first")
153 find-name-arg "-iname"))
154
155(use-package dired-x
156 :after dired
157 :bind (("C-x C-j" . dired-jump))
158 :commands (dired-jump dired-omit-mode)
159 :config
160 (setq-default dired-omit-files (concat dired-omit-files "\\|^\\.+$\\|^\\..+$")
161 dired-omit-verbose nil
162 dired-clean-confirm-killing-deleted-buffers nil))
163
164(use-package dired-aux
165 :unless noninteractive
166 :after dired
167 :config
168 (setq-default
169 ;; Ask for creation of missing directories when copying/moving
170 dired-create-destination-dirs 'ask
171 dired-create-destination-dirs-on-trailing-dirsep t
172 ;; Search only file names when point is on a file name
173 dired-isearch-filenames'dwim))
174
175(use-package async)
176(use-package dired-async
177 :unless noninteractive
178 :after (dired async)
179 :commands (dired-async-mode)
180 :hook (dired-mode . dired-async-mode))
181
182(use-package dired-narrow
183 :unless noninteractive
184 :after dired
185 :commands (dired-narrow)
186 :bind (:map dired-mode-map
187 ("M-s n" . dired-narrow))
188 :config
189 (setq-default dired-narrow-exit-when-one-left t
190 dired-narrow-enable-blinking t
191 dired-narrow-blink-time 0.3))
192
193(use-package wdired
194 :unless noninteractive
195 :after dired
196 :commands (wdired-mode
197 wdired-change-to-wdired-mode)
198 :bind (:map dired-mode-map
199 ("E" . wdired-change-to-wdired-mode))
200 :config
201 (setq-default wdired-allow-to-change-permissions t
202 wdired-create-parent-directories t))
203
204(use-package dired-rsync
205 :unless noninteractive
206 :after dired
207 :commands (dired-rsync)
208 :bind (:map dired-mode-map
209 ("r" . dired-rsync)))
210
211(use-package trashed
212 :unless noninteractive
213 :commands (trashed)
214 :config
215 (setq trashed-action-confirmer 'y-or-n-p)
216 (setq trashed-use-header-line t)
217 (setq trashed-sort-key '("Date deleted" . t))
218 (setq trashed-date-format "%Y-%m-%d %H:%M:%S"))
219
220;; (use-package dired-sidebar
221;; :unless noninteractive
222;; :commands (dired-sidebar-toggle-sidebar)
223;; :bind ("C-c C-n" . dired-sidebar-toggle-sidebar)
224;; :init
225;; (add-hook 'dired-sidebar-mode-hook
226;; (lambda ()
227;; (unless (file-remote-p default-directory)
228;; (auto-revert-mode))))
229;; :config
230;; (push 'toggle-window-split dired-sidebar-toggle-hidden-commands)
231;; (push 'rotate-windows dired-sidebar-toggle-hidden-commands)
232;;
233;; ;; (setq dired-sidebar-subtree-line-prefix "__")
234;; ;;(setq dired-sidebar-use-custom-font t)
235;; (setq dired-sidebar-theme 'arrow)
236;; (setq dired-sidebar-use-term-integration t))
237
238(use-package casual-dired
239 :after dired
240 :commands (casual-dired-tmenu)
241 :bind (:map dired-mode-map ("C-o" . 'casual-dired-tmenu)))
242
243(provide 'config-dired)
244;; config-dired.el ends here