nftable-migration
  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