9.6. dired

ファイルシステムのディレクトリを編集する機能

Emacs入門当初は、多機能な dired を追求してやまなかった。

現在は使用頻度も減り、あれやこれやとカスタマイズした備忘録として残しています。

最近の進化といえば、all-the-icons-dired.el で多少ビジアルになったくらい。

(leaf dired
  :hook ((dired-mode-hook . dired-my-append-buffer-name-hint)
		 (dired-mode-hook . (lambda () (load "dired-x") (dired-omit-mode 1))))
  :bind (:dired-mode-map
		 ("<left>" . dired-up-alternate-directory)
		 ("<right>" . dired-open-in-accordance-with-situation)
		 ("RET" . dired-open-in-accordance-with-situation)
		 ("<" . beginning-of-buffer)
		 (">" . end-of-buffer)
		 ("SPC" . my:dired-toggle-mark)
		 ("C-g" . my:dired-unmark-all)
		 ("f" . counsel-find-file)
		 ("r" . wdired-change-to-wdired-mode)
		 ("o" . dired-open-file)
		 ("[" . dired-hide-details-mode)
		 ("a" . toggle-dired-listing-switches)
		 ("q" . dired-dwim-quit-window)
		 ("i" . call-sxiv)
		 ("s" . sudo-edit)
		 ("e" . gedit-open-dired)
		 ("@" . dired-do-gist)
		 ("." . dired-omit-mode))
  :custom
  `((dired-dwim-target . t)
	(delete-by-moving-to-trash . t)
	(dired-recursive-copies . 'always)
	(dired-recursive-deletes . 'always)
	(dired-listing-switches . "-lgGhF")
	(dired-omit-files . ".elc")
	(ls-lisp-use-insert-directory-program . nil)
	(ls-lisp-dirs-first . t)))

カスタマイズ設定

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Dired custom configurations
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(with-eval-after-load 'dired
  (defun toggle-dired-listing-switches ()
	"Toggle `dired-mode' switch between with and without 'A' option to show or hide dot files."
	(interactive)
	(progn
	  (if (string-match "[Aa]" dired-listing-switches)
		  (setq dired-listing-switches "-lgGhF")
		(setq dired-listing-switches "-lgGhFA"))
	  (reload-current-dired-buffer)))

  (defun reload-current-dired-buffer ()
	"Reload current `dired-mode' buffer."
	(let* ((dir (dired-current-directory)))
	  (progn (kill-buffer (current-buffer))
			 (dired dir))))

  (defun dired-my-append-buffer-name-hint ()
	"Append a auxiliary string [Dir] to a name of dired buffer."
	(when (eq major-mode 'dired-mode)
	  (let* ((dir (expand-file-name list-buffers-directory))
			 ;; Add a drive letter for Windows
			 (drive (if (and (eq 'system-type 'windows-nt)
							 (string-match "^\\([a-zA-Z]:\\)/" dir))
						(match-string 1 dir) "")))
		(rename-buffer (concat (buffer-name) " [" drive "dir]") t))))

  (defun dired-dwim-quit-window ()
	"`quit-window 'according to screen division."
	(interactive)
	(quit-window (not (delq (selected-window) (get-buffer-window-list)))))

  (defun dired-open-in-accordance-with-situation ()
	"Files are opened in separate buffers, directories are opened in the same buffer."
	(interactive)
	(let ((file (dired-get-filename)))
	  (if (file-directory-p file)
		  (dired-find-alternate-file)
		(dired-find-file)
		;; If in org-mode, open with view-mode
		(if (equal major-mode 'org-mode)
			(view-mode 1)))))

  (defun dired-up-alternate-directory ()
	"Move to higher directory without make new buffer."
	(interactive)
	(let* ((dir (dired-current-directory))
		   (up (file-name-directory (directory-file-name dir))))
	  (or (dired-goto-file (directory-file-name dir))
		  ;; Only try dired-goto-subdir if buffer has more than one dir.
		  (and (cdr dired-subdir-alist)
			   (dired-goto-subdir up))
		  (progn
			(find-alternate-file up)
			(dired-goto-file dir)))))

  (defun dired-open-file ()
	"In dired, open the file in associated application."
	(interactive)
	(let* ((file (dired-get-filename nil t)))
	  (call-process "xdg-open" nil 0 nil file)))

  (defun my:dired-toggle-mark (arg)
	"ARG toggle the current next files."
	(interactive "p")
	(let ((dired-marker-char
		   (if (save-excursion (beginning-of-line)
							   (looking-at " "))
			   dired-marker-char ?\040)))
	  (dired-mark arg)))

  (defun my:dired-unmark-all ()
	"Dired unmark all."
	(interactive)
	(call-interactively 'dired-unmark-all-marks)
	(call-interactively 'revert-buffer))

  ;; Show all images in the directory
  ;; https://gist.github.com/kobapan/28908b564b610bd3e6f3fae78637ac8b
  (defun call-sxiv ()
	"Image viewer."
	(interactive)
	(let ((image-files
		   (delq nil
				 (mapcar
				  (lambda (f)
					(when (string-match "\.\\(jpe?g\\|png\\|gif\\|bmp\\)$" f)
					  f))
				  (directory-files default-directory)))))
	  ;; File list in the current directory in alphabetical order
	  (start-process-shell-command
	   "sxiv" nil
	   (format "sxiv -f -t -n %s %s"
			   (length image-files)
			   (mapconcat 'identity image-files " "))))))