Download
(require 'dired-sort-menu)
(when (fboundp 'diredp-rename-this-file)
(define-key dired-mode-map "b" 'diredp-byte-compile-this-file)
(define-key dired-mode-map "r" 'diredp-rename-this-file)
(define-key dired-mode-map "T" nil)
(define-key dired-mode-map "T+" 'diredp-tag-this-file)
(define-key dired-mode-map "T-" 'diredp-untag-this-file)
(define-key dired-mode-map "T0" 'diredp-remove-all-tags-this-file)
(define-key dired-mode-map "Tc" 'diredp-copy-tags-this-file)
(define-key dired-mode-map "Tp" 'diredp-paste-add-tags-this-file)
(define-key dired-mode-map "Tq" 'diredp-paste-replace-tags-this-file)
(define-key dired-mode-map "Tv" 'diredp-set-tag-value-this-file)
(define-key dired-mode-map "T\M-w" 'diredp-copy-tags-this-file)
(define-key dired-mode-map "T\C-y" 'diredp-paste-add-tags-this-file)
(define-key dired-mode-map "T>+" 'diredp-do-tag)
(define-key dired-mode-map "T>-" 'diredp-do-untag)
(define-key dired-mode-map "T>0" 'diredp-do-remove-all-tags)
(define-key dired-mode-map "T>p" 'diredp-do-paste-add-tags)
(define-key dired-mode-map "T>q" 'diredp-do-paste-replace-tags)
(define-key dired-mode-map "T>v" 'diredp-do-set-tag-value)
(define-key dired-mode-map "T>\C-y" 'diredp-do-paste-add-tags)
(define-key dired-mode-map "Tm%" 'diredp-mark-files-tagged-regexp)
(define-key dired-mode-map "Tm*" 'diredp-mark-files-tagged-all)
(define-key dired-mode-map "Tm+" 'diredp-mark-files-tagged-some)
(define-key dired-mode-map "Tm~*" 'diredp-mark-files-tagged-not-all)
(define-key dired-mode-map "Tm~+" 'diredp-mark-files-tagged-none)
(define-key dired-mode-map "Tu%" 'diredp-unmark-files-tagged-regexp)
(define-key dired-mode-map "Tu*" 'diredp-unmark-files-tagged-all)
(define-key dired-mode-map "Tu+" 'diredp-unmark-files-tagged-some)
(define-key dired-mode-map "Tu~*" 'diredp-unmark-files-tagged-not-all)
(define-key dired-mode-map "Tu~+" 'diredp-unmark-files-tagged-none)
)
(define-key dired-mode-map "|" 'dired-sort-menu-toggle-reverse)
(when (and (fboundp 'ls-lisp-var-p) (ls-lisp-var-p 'ls-lisp-ignore-case))
(define-key dired-mode-map "c" 'dired-sort-menu-toggle-ignore-case))
(when (and (fboundp 'ls-lisp-var-p) (ls-lisp-var-p 'ls-lisp-dirs-first))
(define-key dired-mode-map "/" 'dired-sort-menu-toggle-dirs-first))
(easy-menu-remove-item dired-mode-map '("menu-bar" "immediate") "Sort By")
(easy-menu-add-item dired-mode-map '("menu-bar" "subdir") dired-sort-menu
'revert-buffer)
(defun dired-sort-dialogue ()
"A static dialogue version of the Dired sort menu.
This command *must* be run in the Dired buffer!"
(interactive)
(or (eq major-mode 'dired-mode)
(error "This command may only be run in a Dired buffer"))
(let
((radio (dired-sort-dialogue-choice))
(reverse (dired-sort-menu-switch-p "r"))
(recursive (dired-sort-menu-switch-p "R"))
(dired-buffer (current-buffer))
window-configuration-change-hook
kill-buffer-hook)
(let ((bufname (dired-sort-dialogue-buffer-name))
(bufs (buffer-list)) buf
(title (concat "<" (buffer-name dired-buffer) ">")))
(while (and bufs (not (string= bufname
(buffer-name (setq buf (car bufs))))))
(setq bufs (cdr bufs)))
(if bufs
(progn
(if (dired-sort-dialogue-own-frame-really)
(progn
(select-frame (window-frame (get-buffer-window buf t)))
(raise-frame))
(select-window (get-buffer-window buf t)))
(set-window-dedicated-p (selected-window) nil)
(kill-buffer buf))
(if (dired-sort-dialogue-own-frame-really)
(let* ((alist (frame-parameters))
(top (cdr (assq 'top alist)))
(left (cdr (assq 'left alist)))
)
(or (atom left) (setq left (cadr left)))
(setq left (+ left (frame-pixel-width)))
(setq left (if (> (+ left (* dired-sort-dialogue-width
(frame-char-width)))
(x-display-pixel-width))
-10
(+ left 10)))
(select-frame (make-frame
`((title . ,title)
(top . ,top)
(left . ,left)
(width . ,dired-sort-dialogue-width)
(height . 22)
(minibuffer . nil)
(vertical-scroll-bars . nil)
(horizontal-scroll-bars . nil)
(unsplittable . nil)
(menu-bar-lines . 0)
))))
(split-window
nil (- (window-width) dired-sort-dialogue-width) t)
(select-window (next-window))))
(switch-to-buffer bufname)
(set-window-dedicated-p (selected-window) t)
(kill-all-local-variables)
(setq truncate-lines t
mode-line-format title))
(let ((inhibit-read-only t))
(erase-buffer))
(setq dired-sort-dialogue-dired-buffer dired-buffer)
(let ((start (point)))
(widget-insert "Dired Sort Options")
(put-text-property start (point) 'face 'bold))
(widget-insert " for\n<"
(buffer-name dired-buffer)
">\n\n(Use any mouse button)\n\n ")
(setq dired-sort-dialogue-radio-widget
(eval `(widget-create
'radio-button-choice
:indent 1
:value radio
'(item :tag "Name" "")
'(item :tag "Time Modified" "t")
,@(if (dired-sort-menu-active-p "S")
'('(item :tag "Size" "S")))
,@(if (dired-sort-menu-active-p "X")
'('(item :tag "Extension" "X")))
,@(if (dired-sort-menu-active-p "U")
'('(item :tag "Unsorted" "U")))
,@(if (dired-sort-menu-active-p "c")
`('(item :tag
,(if (or (not (eq system-type 'windows-nt))
(dired-sort-menu-remote-p))
"Time Changed"
"Time Created") "c")))
,@(if (and (dired-sort-menu-active-p "u")
(or (not (eq system-type 'windows-nt))
(dired-sort-menu-remote-p)))
'('(item :tag "Time Accessed" "u")))
)))
(widget-insert " _____________________\n\n ")
(when (dired-sort-menu-active-p "r")
(setq dired-sort-dialogue-reverse-widget
(widget-create 'checkbox
:help-echo "Reverse the sort order"
reverse))
(widget-insert " Reverse\n "))
(when (dired-sort-menu-active-p "R")
(setq dired-sort-dialogue-recursive-widget
(widget-create 'checkbox
:help-echo "Recursively list all subdirectories"
recursive))
(widget-insert " Recursive\n "))
(when (ls-lisp-var-p 'ls-lisp-ignore-case)
(setq dired-sort-dialogue-ignore-case-widget
(widget-create 'checkbox
:help-echo "Ignore case when sorting"
ls-lisp-ignore-case))
(widget-insert " Ignore Case\n "))
(when (ls-lisp-var-p 'ls-lisp-dirs-first)
(setq dired-sort-dialogue-dirs-first-widget
(widget-create 'checkbox
:help-echo "Sort directories first"
ls-lisp-dirs-first))
(widget-insert " Dirs First\n "))
(widget-insert "_____________________\n\n ")
(widget-create 'push-button
:notify 'dired-sort-dialogue-OK
:help-echo "Apply the settings and close the window"
"OK")
(widget-insert " ")
(widget-create 'push-button
:notify 'dired-sort-dialogue-close
:help-echo "Close the window and ignore the settings"
"Cancel")
(widget-insert " ")
(widget-create 'push-button
:notify 'dired-sort-dialogue-apply
:help-echo "Apply the settings without closing the window"
"Apply")
(widget-setup)
(goto-char (point-min))
(let ((map widget-keymap))
(define-key map [down-mouse-1] 'widget-button-click)
(define-key map [down-mouse-3] 'widget-button-click)
(use-local-map map)))
(when (fboundp 'fit-frame) (fit-frame))
(add-hook 'window-configuration-change-hook
'dired-sort-dialogue-auto-kill-2))
(defun dired-sort-dialogue-close (&rest ignore)
"Close the dired sort dialogue (ignoring the settings)."
(kill-buffer (current-buffer)))
(defadvice handle-delete-frame
(before handle-delete-frame-advice activate)
"Kill dialogue buffer before killing its frame."
(let* ((frame (posn-window (event-start (ad-get-arg 0))))
(buf (car (buffer-list frame))))
(when (and (buffer-name buf)
(dired-sort-dialogue-buffer-p (buffer-name buf)))
(set-window-dedicated-p (selected-window) nil)
(kill-buffer buf))))
(provide 'dired-sort-menu+)