Mercurial > hg > xemacs-beta
diff lisp/efs/dired-fsf.el @ 98:0d2f883870bc r20-1b1
Import from CVS: tag r20-1b1
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:13:56 +0200 |
parents | 8fc7fe29b841 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/efs/dired-fsf.el Mon Aug 13 09:13:56 2007 +0200 @@ -0,0 +1,684 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; File: dired-fsf.el +;; Dired Version: $Revision: 1.1 $ +;; RCS: +;; Description: dired functions for V19 of the original GNU Emacs from FSF +;; Created: Sat Jan 29 01:38:49 1994 by sandy on ibm550 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;; Requirements and provisions +(provide 'dired-fsf) +(require 'dired) + +;;;; Variables to set. + +(setq dired-modeline-tracking-cmds '(mouse-set-point)) + +;;;; Support for text properties + +(defun dired-insert-set-properties (beg end) + ;; Sets the text properties for the file names. + (save-excursion + (goto-char beg) + (beginning-of-line) + (let ((eol (save-excursion (end-of-line) (point))) + (bol (point))) + (while (< (point) end) + (setq eol (save-excursion (end-of-line) (point))) + (if (dired-manual-move-to-filename nil bol eol) + (dired-set-text-properties + (point) (dired-manual-move-to-end-of-filename nil bol eol))) + (goto-char (setq bol (1+ eol))))))) + +(defun dired-remove-text-properties (start end &optional object) + ;; Removes text properties. Called in popup buffers. + (remove-text-properties start end '(mouse-face dired-file-name) object)) + +(defun dired-set-text-properties (start end) + ;; Sets dired's text properties + (put-text-property start end 'mouse-face 'highlight) + (put-text-property start end 'dired-file-name t)) + +(defun dired-move-to-filename (&optional raise-error bol eol) + (or bol (setq bol (save-excursion + (skip-chars-backward "^\n\r") + (point)))) + (or eol (setq eol (save-excursion + (skip-chars-forward "^\n\r") + (point)))) + (goto-char bol) + (let ((spot (next-single-property-change bol 'dired-file-name nil eol))) + (if (= spot eol) + (if raise-error + (error "No file on this line") + nil) + (goto-char spot)))) + +(defun dired-move-to-end-of-filename (&optional no-error bol eol) + ;; Assumes point is at beginning of filename, + ;; thus the rwx bit re-search-backward below will succeed in *this* + ;; line if at all. So, it should be called only after + ;; (dired-move-to-filename t). + ;; On failure, signals an error (with non-nil NO-ERROR just returns nil). + (or eol (setq eol (save-excursion (skip-chars-forward "^\r\n") (point)))) + (and + (null no-error) + selective-display + (or bol (setq bol (save-excursion (skip-chars-backward "^\r\n") (point)))) + (eq (char-after (1- bol)) ?\r) + (cond + ((dired-subdir-hidden-p (dired-current-directory)) + (error + (substitute-command-keys + "File line is hidden. Type \\[dired-hide-subdir] to unhide."))) + ((error + (substitute-command-keys + "File line is omitted. Type \\[dired-omit-toggle] to un-omit."))))) + (if (get-text-property (point) 'dired-file-name nil) + (goto-char (next-single-property-change (point) 'dired-file-name + nil eol)) + (and (null no-error) (error "No file on this line")))) + +;; Text properties do not work properly in pre-19.26. + +(if (or (not (boundp 'emacs-major-version)) + (= emacs-major-version 19)) + (progn + (if (not (boundp 'emacs-minor-version)) + ;; Argument structure of where-is-internal went through some + ;; changes. + (defun dired-key-description (cmd &rest prefixes) + ;; Return a key description string for a menu. + ;; If prefixes are given, they should be either strings, + ;; integers, or 'universal-argument. + (let ((key (where-is-internal cmd dired-mode-map nil t))) + (if key + (key-description + (apply 'vconcat + (append + (mapcar + (function + (lambda (x) + (if (eq x 'universal-argument) + (where-is-internal 'universal-argument + dired-mode-map nil t) + x))) + prefixes) + (list key)))) + "")))) + (if (or (not (boundp 'emacs-minor-version)) + (< emacs-minor-version 26)) + (progn + (fset 'dired-insert-set-properties 'ignore) + (fset 'dired-remove-text-properties 'ignore) + (fset 'dired-set-text-properties 'ignore) + (fset 'dired-move-to-filename 'dired-manual-move-to-filename) + (fset 'dired-move-to-end-of-filename + 'dired-manual-move-to-end-of-filename))))) + +;;;; Keymaps + +;;; Caching Menus + +(defun dired-menu-item (menu-item cmd width &rest prefixes) + ;; Return a key description string for a menu. If prefixes are given, + ;; they should be either characters, or 'universal-argument. + (let ((desc (apply 'dired-key-description cmd prefixes))) + (if (string-equal desc "") + menu-item + (concat menu-item + (make-string + (max (- width (length menu-item) (length desc) 2) 1) 32) + "(" desc ")")))) + +(defun dired-cache-key (keymap event cmd &rest prefixes) + ;; Caches a keybinding for cms in a menu keymap. + ;; This is able to handle prefix keys. + (let ((desc (apply 'dired-key-description cmd prefixes))) + (or (string-equal desc "") + (progn + (let ((elt (assq event keymap))) + (if elt + (let ((tail (cdr elt))) + (setcdr tail + (cons + (cons + nil (concat " (" desc ")")) + (cdr tail)))))))))) + +;; Don't cache keys in old emacs versions. Is 23 the right cut-off point? +(if (or (not (boundp 'emacs-minor-version)) + (< emacs-minor-version 23)) + (fset 'dired-cache-key 'ignore)) + +(defvar dired-visit-popup-menu nil) +;; Menus of commands in the Visit popup menu. +(defvar dired-do-popup-menu nil) +;; Menu of commands in the dired Do popup menu. + +;; Menus for the menu bar. +(defvar dired-subdir-menu + (cons "Subdir" (make-sparse-keymap "Subdir"))) +(defvar dired-mark-menu + (cons "Mark" (make-sparse-keymap "Mark"))) +(defvar dired-do-menu + (cons "Do" (make-sparse-keymap "Do"))) +(defvar dired-regex-menu + (cons "Regexp" (make-sparse-keymap "Regex"))) +(defvar dired-look-menu + (cons "Look" (make-sparse-keymap "Look"))) +(defvar dired-sort-menu + (cons "Sort" (make-sparse-keymap "Sort"))) +(defvar dired-help-menu nil) + +(defun dired-setup-menus () + + ;; popup menu + + (setq dired-visit-popup-menu + (list + (cons (dired-menu-item "Find File" 'dired-find-file 35) + 'dired-advertised-find-file) + (cons (dired-menu-item "Find in Other Window" + 'dired-find-file-other-window 35) + 'dired-find-file-other-window) + (cons (dired-menu-item "Find in Other Frame" + 'dired-find-file-other-frame 35) + 'dired-find-file-other-frame) + (cons (dired-menu-item "View File" 'dired-view-file 35) + 'dired-view-file) + (cons (dired-menu-item "Display in Other Window" + 'dired-find-file-other-window 35 + 'universal-argument) + 'dired-display-file))) + + ;; Operate popup menu + + (setq dired-do-popup-menu + (list + (cons (dired-menu-item "Copy to..." 'dired-do-copy 35 1) + 'dired-do-copy) + (cons (dired-menu-item "Rename to..." 'dired-do-rename 35 1) + 'dired-do-rename) + (cons (dired-menu-item "Compress/Uncompress" 'dired-do-compress + 35 1) 'dired-do-compress) + (cons (dired-menu-item "Uuencode/Uudecode" 'dired-do-uucode + 35 1) 'dired-do-uucode) + (cons (dired-menu-item "Change Mode..." 'dired-do-chmod 35 1) + 'dired-do-chmod) + (cons (dired-menu-item "Change Owner..." 'dired-do-chown 35 1) + 'dired-do-chown) + (cons (dired-menu-item "Change Group..." 'dired-do-chgrp 35 1) + 'dired-do-chgrp) + (cons (dired-menu-item "Load" 'dired-do-load 35 1) + 'dired-do-load) + (cons (dired-menu-item "Byte-compile" 'dired-do-byte-compile 35 1) + 'dired-do-byte-compile) + (cons (dired-menu-item "Hardlink to..." 'dired-do-hardlink 35 1) + 'dired-do-hardlink) + (cons (dired-menu-item "Symlink to..." 'dired-do-symlink 35 1) + 'dired-do-symlink) + (cons (dired-menu-item "Relative Symlink to..." + 'dired-do-relsymlink 35 1) + 'dired-do-relsymlink) + (cons (dired-menu-item "Shell Command..." + 'dired-do-shell-command 35 1) + 'dired-do-shell-command) + (cons (dired-menu-item "Background Shell Command..." + 'dired-do-background-shell-command 35 1) + 'dired-do-background-shell-command) + (cons (dired-menu-item "Delete" 'dired-do-delete 35 1) + 'dired-do-delete))) + + ;; Subdir Menu-bar Menu + + (define-key dired-mode-map [menu-bar subdir] dired-subdir-menu) + (define-key dired-mode-map [menu-bar subdir uncompress-subdir-files] + (cons "Uncompress Compressed Files" + (function + (lambda () (interactive) (dired-compress-subdir-files t))))) + (dired-cache-key dired-subdir-menu 'uncompress-subdir-files + 'dired-compress-subdir-files 'universal-argument) + (define-key dired-mode-map [menu-bar subdir compress-subdir-files] + '("Compress Uncompressed Files" . dired-compress-subdir-files)) + (define-key dired-mode-map [menu-bar subdir flag] + '("Flag Files for Deletion" . dired-flag-subdir-files)) + (define-key dired-mode-map [menu-bar subdir mark] + '("Mark Files" . dired-mark-subdir-files)) + (define-key dired-mode-map [menu-bar subdir redisplay] + '("Redisplay Subdir" . dired-redisplay-subdir)) + (define-key dired-mode-map [menu-bar subdir subdir-separator] + '("-- Commands on All Files in Subdir --")) + (define-key dired-mode-map [menu-bar subdir kill-subdir] + '("Kill This Subdir" . dired-kill-subdir)) + (define-key dired-mode-map [menu-bar subdir create-directory] + '("Create Directory..." . dired-create-directory)) + (define-key dired-mode-map [menu-bar subdir insert] + '("Insert This Subdir" . dired-maybe-insert-subdir)) + (define-key dired-mode-map [menu-bar subdir down-dir] + '("Down Dir" . dired-down-directory)) + (define-key dired-mode-map [menu-bar subdir up-dir] + '("Up Dir" . dired-up-directory)) + (define-key dired-mode-map [menu-bar subdir prev-dirline] + '("Prev Dirline" . dired-prev-dirline)) + (define-key dired-mode-map [menu-bar subdir next-dirline] + '("Next Dirline" . dired-next-dirline)) + (define-key dired-mode-map [menu-bar subdir prev-subdir] + '("Prev Subdir" . dired-prev-subdir)) + (define-key dired-mode-map [menu-bar subdir next-subdir] + '("Next Subdir" . dired-next-subdir)) + + ;; Mark Menu-bar Menu + + (define-key dired-mode-map [menu-bar mark] dired-mark-menu) + (define-key dired-mode-map [menu-bar mark mark-from-compilation-buffer] + '("Mark Files from Compile Buffer..." . dired-mark-files-compilation-buffer)) + (define-key dired-mode-map [menu-bar mark mark-from-other-buffer] + '("Mark Files from Other Dired" . + dired-mark-files-from-other-dired-buffer)) + (define-key dired-mode-map [menu-bar mark mark-separator] + '("--")) + (define-key dired-mode-map [menu-bar mark marker-char-right] + '("Marker stack right" . dired-marker-stack-right)) + (define-key dired-mode-map [menu-bar mark marker-char-left] + '("Marker stack left" . dired-marker-stack-left)) + (define-key dired-mode-map [menu-bar mark restore-marker] + '("Restore marker char" . dired-restore-marker-char)) + (define-key dired-mode-map [menu-bar mark add-marker] + '("Set new marker char..." . dired-set-marker-char)) + (define-key dired-mode-map [menu-bar mark auto-save-files] + '("Flag Auto-save Files" . dired-flag-auto-save-files)) + (define-key dired-mode-map [menu-bar mark backup-files] + '("Flag Backup Files" . dired-flag-backup-files)) + (define-key dired-mode-map [menu-bar mark executables] + '("Mark Executables" . dired-mark-executables)) + (define-key dired-mode-map [menu-bar mark directory] + '("Mark Old Backups" . dired-clean-directory)) + (define-key dired-mode-map [menu-bar mark directories] + '("Mark Directories" . dired-mark-directories)) + (define-key dired-mode-map [menu-bar mark symlinks] + '("Mark Symlinks" . dired-mark-symlinks)) + (define-key dired-mode-map [menu-bar mark toggle] + (cons "Toggle Marks..." + (function (lambda () (interactive) + (let ((current-prefix-arg t)) + (call-interactively 'dired-change-marks)))))) + (dired-cache-key dired-mark-menu 'toggle 'dired-change-marks + 'universal-argument) + (define-key dired-mode-map [menu-bar mark unmark-all] + '("Unmark All" . dired-unmark-all-files)) + (define-key dired-mode-map [menu-bar mark marks] + '("Change Marks..." . dired-change-marks)) + (define-key dired-mode-map [menu-bar mark prev] + '("Previous Marked" . dired-prev-marked-file)) + (define-key dired-mode-map [menu-bar mark next] + '("Next Marked" . dired-next-marked-file)) + + ;; Do Menu-bar Menu + + (define-key dired-mode-map [menu-bar do] + dired-do-menu) + (define-key dired-mode-map [menu-bar do do-popup] + (cons "Operate on file menu >" + 'dired-do-popup-menu-internal)) + (dired-cache-key dired-do-menu 'do-popup + 'dired-do-popup-menu) + (define-key dired-mode-map [menu-bar do visit-popup] + (cons "Visit file menu >" + 'dired-visit-popup-menu-internal)) + (dired-cache-key dired-do-menu 'visit-popup + 'dired-visit-popup-menu) + (define-key dired-mode-map [menu-bar do delete] + '("Delete Marked Files" . dired-do-delete)) + (define-key dired-mode-map [menu-bar do background-command] + '("Background Shell Command..." . dired-do-background-shell-command)) + (define-key dired-mode-map [menu-bar do command] + '("Shell Command..." . dired-do-shell-command)) + (define-key dired-mode-map [menu-bar do symlink] + '("Symlink to..." . dired-do-symlink)) + (define-key dired-mode-map [menu-bar do hardlink] + '("Hardlink to..." . dired-do-hardlink)) + (define-key dired-mode-map [menu-bar do compile] + '("Byte-compile" . dired-do-byte-compile)) + (define-key dired-mode-map [menu-bar do load] + '("Load" . dired-do-load)) + (define-key dired-mode-map [menu-bar do chgrp] + '("Change Group..." . dired-do-chgrp)) + (define-key dired-mode-map [menu-bar do chown] + '("Change Owner..." . dired-do-chown)) + (define-key dired-mode-map [menu-bar do chmod] + '("Change Mode..." . dired-do-chmod)) + (define-key dired-mode-map [menu-bar do print] + '("Print..." . dired-do-print)) + (define-key dired-mode-map [menu-bar do uucode] + '("Uuencode/Uudecode" . dired-do-uucode)) + (define-key dired-mode-map [menu-bar do compress] + '("Compress/Uncompress" . dired-do-compress)) + (define-key dired-mode-map [menu-bar do expunge] + '("Expunge File Flagged for Deletion" . dired-expunge-deletions)) + (define-key dired-mode-map [menu-bar do rename] + '("Rename to..." . dired-do-rename)) + (define-key dired-mode-map [menu-bar do copy] + '("Copy to..." . dired-do-copy)) + +;; Regex Menu-bar Menu + + (define-key dired-mode-map [menu-bar regex] dired-regex-menu) + (define-key dired-mode-map [menu-bar regex show-omit-regexp] + (cons "Show Omit Regex" + (function + (lambda () + (interactive) + (let ((current-prefix-arg 0)) + (call-interactively 'dired-add-omit-regexp)))))) + (dired-cache-key dired-regex-menu 'show-omit-regexp + 'dired-add-omit-regexp 0) + (define-key dired-mode-map [menu-bar regex remove-omit-extension] + (cons "Remove Omit Extension..." + (function + (lambda () + (interactive) + (let ((current-prefix-arg '(16))) + (call-interactively 'dired-add-omit-regexp)))))) + (dired-cache-key dired-regex-menu 'remove-omit-extension + 'dired-add-omit-regexp 'universal-argument + 'universal-argument) + (define-key dired-mode-map [menu-bar regex add-omit-extension] + (cons "Add Omit Extension..." + (function + (lambda () + (interactive) + (let ((current-prefix-arg '(4))) + (call-interactively 'dired-add-omit-regexp)))))) + (dired-cache-key dired-regex-menu 'add-omit-extension + 'dired-add-omit-regexp 'universal-argument) + (define-key dired-mode-map [menu-bar regex remove-omit-regexp] + (cons "Remove Omit Regex..." + (function + (lambda () + (interactive) + (let ((current-prefix-arg 1)) + (call-interactively 'dired-add-omit-regexp)))))) + (dired-cache-key dired-regex-menu 'remove-omit-regexp + 'dired-add-omit-regexp 1) + (define-key dired-mode-map [menu-bar regex add-omit-regexp] + '("Add Omit Regex..." . dired-add-omit-regexp)) + (define-key dired-mode-map [menu-bar regex separator] + '("--")) + (define-key dired-mode-map [menu-bar regex relsymlink] + '("Relative Symlink..." . dired-do-relsymlink-regexp)) + (define-key dired-mode-map [menu-bar regex symlink] + '("Symlink..." . dired-do-symlink-regexp)) + (define-key dired-mode-map [menu-bar regex hardlink] + '("Hardlink..." . dired-do-hardlink-regexp)) + (define-key dired-mode-map [menu-bar regex rename] + '("Rename..." . dired-do-rename-regexp)) + (define-key dired-mode-map [menu-bar regex copy] + '("Copy..." . dired-do-copy-regexp)) + (define-key dired-mode-map [menu-bar regex upcase] + '("Upcase" . dired-upcase)) + (define-key dired-mode-map [menu-bar regex downcase] + '("Downcase" . dired-downcase)) + (define-key dired-mode-map [menu-bar regex dired-flag-extension] + '("Flag Files with Extension..." . dired-flag-extension)) + (define-key dired-mode-map [menu-bar regex flag] + '("Flag..." . dired-flag-files-regexp)) + (define-key dired-mode-map [menu-bar regex mark-extension] + '("Mark Files with Extension..." . dired-mark-extension)) + (define-key dired-mode-map [menu-bar regex mark] + '("Mark..." . dired-mark-files-regexp)) + + ;; Look Menu-bar Menu + + (define-key dired-mode-map [menu-bar look] dired-look-menu) + (define-key dired-mode-map [menu-bar look patch] + '("Patch File" . dired-epatch)) + (define-key dired-mode-map [menu-bar look ediff] + '("Ediff Files..." . dired-ediff)) + (define-key dired-mode-map [menu-bar look emerge-with-ancestor] + '("Merge Files Having Common Ancestor..." . dired-emerge-with-ancestor)) + (define-key dired-mode-map [menu-bar look emerge] + '("Merge Files..." . dired-emerge)) + (define-key dired-mode-map [menu-bar look backup-diff] + '("Diff with Backup" . dired-backup-diff)) + (define-key dired-mode-map [menu-bar look diff] + '("Diff File..." . dired-diff)) + ;; Put in a separator line. + (define-key dired-mode-map [menu-bar look look-separator] + '("--")) + (define-key dired-mode-map [menu-bar look tags-query-replace] + '("Tags Query Replace..." . dired-do-tags-query-replace)) + (define-key dired-mode-map [menu-bar look tags-search] + '("Tags Search for..." . dired-do-tags-search)) + (define-key dired-mode-map [menu-bar look grep] + '("Grep for..." . dired-do-grep)) + + ;; Sort Menu-bar Menu + + (define-key dired-mode-map [menu-bar sort] dired-sort-menu) + (define-key dired-mode-map [menu-bar sort redisplay-killed] + (cons "Redisplay Killed Lines" + (function (lambda () (interactive) (dired-do-kill-file-lines 0))))) + (dired-cache-key dired-sort-menu 'redisplay-killed + 'dired-do-kill-file-lines 0) + (define-key dired-mode-map [menu-bar sort kill] + '("Kill Marked Lines" . dired-do-kill-file-lines)) + (define-key dired-mode-map [menu-bar sort toggle-omit] + '("Toggle Omit" . dired-omit-toggle)) + (define-key dired-mode-map [menu-bar sort hide-subdir] + '("Hide Subdir" . dired-hide-subdir)) + (define-key dired-mode-map [menu-bar sort hide-all] + '("Hide All Subdirs" . dired-hide-all)) + (define-key dired-mode-map [menu-bar sort sort-separator] + '("--")) + (define-key dired-mode-map [menu-bar sort entire-edit] + (cons "Edit Switches for Entire Buffer..." + (function (lambda () (interactive) + (dired-sort-toggle-or-edit '(16)))))) + (dired-cache-key dired-sort-menu 'entire-edit + 'dired-sort-toggle-or-edit 'universal-argument + 'universal-argument) + (define-key dired-mode-map [menu-bar sort entire-name] + (cons "Sort Entire Buffer by Name" + (function (lambda () (interactive) + (dired-sort-toggle-or-edit 'name))))) + (dired-cache-key dired-sort-menu 'entire-name 'dired-sort-toggle-or-edit + 'universal-argument) + (define-key dired-mode-map [menu-bar sort entire-date] + (cons "Sort Entire Buffer by Date" + (function (lambda () (interactive) + (dired-sort-toggle-or-edit 'date))))) + (dired-cache-key dired-sort-menu 'entire-date 'dired-sort-toggle-or-edit + 'universal-argument) + (define-key dired-mode-map [menu-bar sort new-edit] + (cons "Edit Default Switches for Inserted Subdirs..." + (function (lambda () (interactive) (dired-sort-toggle-or-edit 2))))) + (dired-cache-key dired-sort-menu 'new-edit 'dired-sort-toggle-or-edit 2) + (define-key dired-mode-map [menu-bar sort edit] + (cons "Edit Switches for Current Subdir..." + (function (lambda () (interactive) (dired-sort-toggle-or-edit 1))))) + (dired-cache-key dired-sort-menu 'edit 'dired-sort-toggle-or-edit 1) + (define-key dired-mode-map [menu-bar sort show] + (cons "Show Current Switches" + (function (lambda () (interactive) (dired-sort-toggle-or-edit 0))))) + (dired-cache-key dired-sort-menu 'show 'dired-sort-toggle-or-edit 0) + (define-key dired-mode-map [menu-bar sort toggle] + '("Toggle Current Subdir by Name/Date" . dired-sort-toggle-or-edit)) + + ;; Help Menu-bar Menu + + (or dired-help-menu + (setq dired-help-menu + (if (and (boundp 'menu-bar-help-menu) (keymapp menu-bar-help-menu)) + (cons "Help" (cons 'keymap (cdr menu-bar-help-menu))) + (cons "Help" (make-sparse-keymap "Help"))))) + (define-key dired-mode-map [menu-bar dired-help] dired-help-menu) + (define-key dired-mode-map [menu-bar dired-help help-separator] + '("--")) + (define-key dired-mode-map [menu-bar dired-help dired-bug] + '("Report Dired Bug" . dired-report-bug)) + (define-key dired-mode-map [menu-bar dired-help dired-var-apropos] + (cons "Dired Variable Apropos" + (function (lambda () + (interactive) + (let ((current-prefix-arg t)) + (call-interactively 'dired-apropos)))))) + (dired-cache-key dired-help-menu 'dired-var-apropos + 'dired-apropos 'universal-argument) + (define-key dired-mode-map [menu-bar dired-help dired-apropos] + '("Dired Command Apropos" . dired-apropos)) + (define-key dired-mode-map [menu-bar dired-help dired-info] + (cons "Dired Info Manual" + (function (lambda () + (interactive) + (dired-describe-mode t))))) + (dired-cache-key dired-help-menu 'dired-info 'dired-describe-mode + 'universal-argument) + (define-key dired-mode-map [menu-bar dired-help dired-describe-mode] + '("Describe Dired" . dired-describe-mode)) + (define-key dired-mode-map [menu-bar dired-help dired-summary] + '("Dired Summary Help" . dired-summary))) + +(add-hook 'dired-setup-keys-hook 'dired-setup-menus) + +;;; Mouse functions + +(defun dired-mouse-find-file (event) + "In dired, visit the file or directory name you click on." + (interactive "e") + (save-excursion + (set-buffer (window-buffer (posn-window (event-end event)))) + (if dired-subdir-alist + (save-excursion + (goto-char (posn-point (event-end event))) + (dired-find-file)) + (error + (concat "dired-subdir-alist seems to be mangled. " + (substitute-command-keys + "\\<dired-mode-map>Try dired-revert (\\[dired-revert]).")))))) + +(defun dired-mouse-mark (event) + "In dired, mark the file name that you click on. +If the file name is already marked, this unmarks it." + (interactive "e") + (save-excursion + (set-buffer (window-buffer (posn-window (event-end event)))) + (if dired-subdir-alist + (save-excursion + (goto-char (posn-point (event-end event))) + (beginning-of-line) + (if (looking-at dired-re-mark) + (dired-unmark 1) + (dired-mark 1))) + (error + (concat "dired-subdir-alist seems to be mangled. " + (substitute-command-keys + "\\<dired-mode-map>Try dired-revert (\\[dired-revert]).")))))) + +(defun dired-mouse-flag (event) + "In dired, flag for deletion the file name that you click on. +If the file name is already flag, this unflags it." + (interactive "e") + (save-excursion + (set-buffer (window-buffer (posn-window (event-end event)))) + (if dired-subdir-alist + (save-excursion + (goto-char (posn-point (event-end event))) + (beginning-of-line) + (if (char-equal (following-char) dired-del-marker) + (dired-unflag 1) + (dired-flag-file-deletion 1))) + (error + (concat "dired-subdir-alist seems to be mangled. " + (substitute-command-keys + "\\<dired-mode-map>Try dired-revert (\\[dired-revert]).")))))) + +(defun dired-mouse-get-target (event) + "In dired, put a copy of the selected directory in the active minibuffer." + (interactive "e") + (let ((obuff (current-buffer)) + mb) + (set-buffer (window-buffer (posn-window (event-end event)))) + (if (and dired-subdir-alist (setq mb (dired-get-active-minibuffer-window))) + (let (dir) + (goto-char (posn-point (event-end event))) + (setq dir (dired-current-directory)) + (select-window mb) + (set-buffer (window-buffer mb)) + (erase-buffer) + (insert dir)) + (set-buffer obuff) + (if mb + (error "No directory specified") + (error "No active minibuffer"))))) + +(defun dired-visit-popup-menu (event) + "Popup a menu to visit the moused file." + (interactive "e") + (save-excursion + (set-buffer (window-buffer (posn-window (event-end event)))) + (save-excursion + (goto-char (posn-point (event-end event))) + (dired-visit-popup-menu-internal event)))) + +(defun dired-visit-popup-menu-internal (event) + (interactive "e") + (let ((fn (dired-get-filename 'no-dir)) + fun) + (dired-remove-text-properties 0 (length fn) fn) + (setq fun (x-popup-menu + event + (list "Visit popup menu" + (cons + (concat "Visit " fn " with") + dired-visit-popup-menu)))) + (if fun (funcall fun)))) + +(defun dired-do-popup-menu (event) + ;; Pop up a menu do an operation on the moused file. + (interactive "e") + (let ((obuff (current-buffer))) + (unwind-protect + (progn + (set-buffer (window-buffer (posn-window (event-end event)))) + (dired-save-excursion + (goto-char (posn-point (event-end event))) + (dired-do-popup-menu-internal event))) + (set-buffer obuff)))) + +(defun dired-do-popup-menu-internal (event) + (interactive "e") + (let ((fn (dired-get-filename 'no-dir)) + fun) + (dired-remove-text-properties 0 (length fn) fn) + (setq fun (x-popup-menu + event + (list "Do popup menu" + (cons + (concat "Do operation on " fn) + dired-do-popup-menu)))) + (dired-save-excursion + (if fun (let ((current-prefix-arg 1)) + (call-interactively fun)))))) + +;;; Key maps + +;; Get rid of the Edit menu bar item to save space. +(define-key dired-mode-map [menu-bar edit] 'undefined) +;; We have our own help item +(define-key dired-mode-map [menu-bar help] 'undefined) +(define-key dired-mode-map [mouse-2] 'dired-mouse-find-file) +(define-key dired-mode-map [S-mouse-1] 'dired-mouse-mark) +(define-key dired-mode-map [C-S-mouse-1] 'dired-mouse-flag) +(define-key dired-mode-map [down-mouse-3] 'dired-visit-popup-menu) +;; This can be useful in dired, so move to double click. +(define-key dired-mode-map [double-mouse-3] 'mouse-save-then-kill) +(define-key dired-mode-map [C-down-mouse-2] 'dired-do-popup-menu) +(define-key dired-mode-map [M-mouse-2] 'dired-mouse-get-target) + +(or (memq 'dired-help menu-bar-final-items) + (setq menu-bar-final-items (cons 'dired-help menu-bar-final-items))) + +;;; end of dired-fsf.el