From: Glenn Morris Date: Sat, 19 Feb 2011 03:53:35 +0000 (-0800) Subject: Merge dired-x's dired-add-entry modifications into the main definition. X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~809 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=30abce25f2c78c46994f22d60295c40578097b76;p=emacs.git Merge dired-x's dired-add-entry modifications into the main definition. * lisp/dired-aux.el (dired-add-entry): Give it a doc-string. Merge dired-x's dired-omit handling here. (dired-omit-mode, dired-omit-regexp, dired-omit-localp): Declare. * lisp/dired-x.el (dired-omit-new-add-entry): Merge into dired-add-entry. * doc/misc/dired-x.texi (Technical Details): No longer redefines dired-add-entry. --- diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog index b0d006ce14b..c11618649da 100644 --- a/doc/misc/ChangeLog +++ b/doc/misc/ChangeLog @@ -1,3 +1,7 @@ +2011-02-19 Glenn Morris + + * dired-x.texi (Technical Details): No longer redefines dired-add-entry. + 2011-02-18 Glenn Morris * dired-x.texi (Optional Installation File At Point): Simplify. diff --git a/doc/misc/dired-x.texi b/doc/misc/dired-x.texi index eff8e4600bd..931af07be4e 100644 --- a/doc/misc/dired-x.texi +++ b/doc/misc/dired-x.texi @@ -190,14 +190,9 @@ from @file{dired.el} @end itemize @noindent -and the following functions from @file{dired-aux.el} - -@itemize @bullet -@item -@code{dired-add-entry} -@item -@code{dired-read-shell-command} -@end itemize +and from @file{dired-aux.el} the function @code{dired-read-shell-command}. +In addition, once @file{dired.el} is loaded, @code{dired-add-entry} +obeys Dired Omit mode (@pxref{Omitting Files in Dired}), if it is active. @node Installation, Omitting Files in Dired, Introduction, Top @chapter Installation diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b4b2d687e85..8e54788610e 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,10 @@ 2011-02-19 Glenn Morris + * dired-x.el (dired-omit-new-add-entry): Merge into dired-add-entry. + * dired-aux.el (dired-add-entry): Give it a doc-string. + Merge dired-x's dired-omit handling here. + (dired-omit-mode, dired-omit-regexp, dired-omit-localp): Declare. + * international/mule-diag.el (list-input-methods-1): Indent all lines of multi-line doc-strings. (Bug#8066) diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el index cb1324051a7..bf70262ee73 100644 --- a/lisp/dired-aux.el +++ b/lisp/dired-aux.el @@ -1039,92 +1039,124 @@ See Info node `(emacs)Subdir switches' for more details." (file-name-directory filename) (file-name-nondirectory filename) (function dired-add-entry) filename marker-char)) +(defvar dired-omit-mode) +(declare-function dired-omit-regexp "dired-x" ()) +(defvar dired-omit-localp) + (defun dired-add-entry (filename &optional marker-char relative) - ;; Add a new entry for FILENAME, optionally marking it - ;; with MARKER-CHAR (a character, else dired-marker-char is used). - ;; Note that this adds the entry `out of order' if files sorted by - ;; time, etc. - ;; At least this version inserts in the right subdirectory (if present). - ;; And it skips "." or ".." (see `dired-trivial-filenames'). - ;; Hidden subdirs are exposed if a file is added there. - (setq filename (directory-file-name filename)) - ;; Entry is always for files, even if they happen to also be directories - (let* ((opoint (point)) - (cur-dir (dired-current-directory)) - (orig-file-name filename) - (directory (if relative cur-dir (file-name-directory filename))) - reason) - (setq filename - (if relative - (file-relative-name filename directory) - (file-name-nondirectory filename)) - reason - (catch 'not-found - (if (string= directory cur-dir) - (progn - (skip-chars-forward "^\r\n") - (if (eq (following-char) ?\r) - (dired-unhide-subdir)) - ;; We are already where we should be, except when - ;; point is before the subdir line or its total line. - (let ((p (dired-after-subdir-garbage cur-dir))) - (if (< (point) p) - (goto-char p)))) - ;; else try to find correct place to insert - (if (dired-goto-subdir directory) - (progn ;; unhide if necessary - (if (looking-at "\r") ;; point is at end of subdir line - (dired-unhide-subdir)) - ;; found - skip subdir and `total' line - ;; and uninteresting files like . and .. - ;; This better not moves into the next subdir! - (dired-goto-next-nontrivial-file)) - ;; not found - (throw 'not-found "Subdir not found"))) - (let (buffer-read-only opoint) - (beginning-of-line) - (setq opoint (point)) - ;; Don't expand `.'. Show just the file name within directory. - (let ((default-directory directory)) - (dired-insert-directory directory - (concat dired-actual-switches " -d") - (list filename))) - (goto-char opoint) - ;; Put in desired marker char. - (when marker-char - (let ((dired-marker-char - (if (integerp marker-char) marker-char dired-marker-char))) - (dired-mark nil))) - ;; Compensate for a bug in ange-ftp. - ;; It inserts the file's absolute name, rather than - ;; the relative one. That may be hard to fix since it - ;; is probably controlled by something in ftp. - (goto-char opoint) - (let ((inserted-name (dired-get-filename 'verbatim))) - (if (file-name-directory inserted-name) - (let (props) - (end-of-line) - (forward-char (- (length inserted-name))) - (setq props (text-properties-at (point))) - (delete-char (length inserted-name)) - (let ((pt (point))) - (insert filename) - (set-text-properties pt (point) props)) - (forward-char 1)) - (forward-line 1))) - (forward-line -1) - (if dired-after-readin-hook ;; the subdir-alist is not affected... - (save-excursion ;; ...so we can run it right now: - (save-restriction - (beginning-of-line) - (narrow-to-region (point) (line-beginning-position 2)) - (run-hooks 'dired-after-readin-hook)))) - (dired-move-to-filename)) - ;; return nil if all went well - nil)) - (if reason ; don't move away on failure - (goto-char opoint)) - (not reason))) ; return t on success, nil else + "Add a new dired entry for FILENAME. +Optionally mark it with MARKER-CHAR (a character, else uses +`dired-marker-char'). Note that this adds the entry `out of order' +if files are sorted by time, etc. +Skips files that match `dired-trivial-filenames'. +Exposes hidden subdirectories if a file is added there. + +If `dired-x' is loaded and `dired-omit-mode' is enabled, skips +files matching `dired-omit-regexp'." + (if (or (not (featurep 'dired-x)) + (not dired-omit-mode) + ;; Avoid calling ls for files that are going to be omitted anyway. + (let ((omit-re (dired-omit-regexp))) + (or (string= omit-re "") + (not (string-match omit-re + (cond + ((eq 'no-dir dired-omit-localp) + filename) + ((eq t dired-omit-localp) + (dired-make-relative filename)) + (t + (dired-make-absolute + filename + (file-name-directory filename))))))))) + ;; Do it! + (progn + (setq filename (directory-file-name filename)) + ;; Entry is always for files, even if they happen to also be directories + (let* ((opoint (point)) + (cur-dir (dired-current-directory)) + (orig-file-name filename) + (directory (if relative cur-dir (file-name-directory filename))) + reason) + (setq filename + (if relative + (file-relative-name filename directory) + (file-name-nondirectory filename)) + reason + (catch 'not-found + (if (string= directory cur-dir) + (progn + (skip-chars-forward "^\r\n") + (if (eq (following-char) ?\r) + (dired-unhide-subdir)) + ;; We are already where we should be, except when + ;; point is before the subdir line or its total line. + (let ((p (dired-after-subdir-garbage cur-dir))) + (if (< (point) p) + (goto-char p)))) + ;; else try to find correct place to insert + (if (dired-goto-subdir directory) + (progn ;; unhide if necessary + (if (looking-at "\r") + ;; Point is at end of subdir line. + (dired-unhide-subdir)) + ;; found - skip subdir and `total' line + ;; and uninteresting files like . and .. + ;; This better not move into the next subdir! + (dired-goto-next-nontrivial-file)) + ;; not found + (throw 'not-found "Subdir not found"))) + (let (buffer-read-only opoint) + (beginning-of-line) + (setq opoint (point)) + ;; Don't expand `.'. + ;; Show just the file name within directory. + (let ((default-directory directory)) + (dired-insert-directory + directory + (concat dired-actual-switches " -d") + (list filename))) + (goto-char opoint) + ;; Put in desired marker char. + (when marker-char + (let ((dired-marker-char + (if (integerp marker-char) marker-char + dired-marker-char))) + (dired-mark nil))) + ;; Compensate for a bug in ange-ftp. + ;; It inserts the file's absolute name, rather than + ;; the relative one. That may be hard to fix since it + ;; is probably controlled by something in ftp. + (goto-char opoint) + (let ((inserted-name (dired-get-filename 'verbatim))) + (if (file-name-directory inserted-name) + (let (props) + (end-of-line) + (forward-char (- (length inserted-name))) + (setq props (text-properties-at (point))) + (delete-char (length inserted-name)) + (let ((pt (point))) + (insert filename) + (set-text-properties pt (point) props)) + (forward-char 1)) + (forward-line 1))) + (forward-line -1) + (if dired-after-readin-hook + ;; The subdir-alist is not affected... + (save-excursion ; ...so we can run it right now: + (save-restriction + (beginning-of-line) + (narrow-to-region (point) + (line-beginning-position 2)) + (run-hooks 'dired-after-readin-hook)))) + (dired-move-to-filename)) + ;; return nil if all went well + nil)) + (if reason ; don't move away on failure + (goto-char opoint)) + (not reason))) ; return t on success, nil else + ;; Don't do it (dired-omit-mode). + ;; Return t for success (perhaps we should return file-exists-p). + t)) (defun dired-after-subdir-garbage (dir) ;; Return pos of first file line of DIR, skipping header and total diff --git a/lisp/dired-x.el b/lisp/dired-x.el index e591bb5d1d9..0bdf4950a58 100644 --- a/lisp/dired-x.el +++ b/lisp/dired-x.el @@ -50,7 +50,7 @@ ;; When loaded this code redefines the following functions of GNU Emacs: ;; From dired.el: dired-clean-up-after-deletion, dired-find-buffer-nocreate, ;; and dired-initial-position. -;; From dired-aux.el: dired-add-entry and dired-read-shell-command. +;; From dired-aux.el: dired-read-shell-command. ;; *Please* see the `dired-x' info pages for more details. @@ -589,45 +589,6 @@ Optional fourth argument LOCALP is as in `dired-get-filename'." (and fn (string-match regexp fn)))) msg))) -;; Compiler does not get fset. -(declare-function dired-omit-old-add-entry "dired-x") - -;; REDEFINE. -;; Redefine dired-aux.el's version of `dired-add-entry' -;; Save old defun if not already done: -(or (fboundp 'dired-omit-old-add-entry) - (fset 'dired-omit-old-add-entry (symbol-function 'dired-add-entry))) - -;; REDEFINE. -(defun dired-omit-new-add-entry (filename &optional marker-char relative) - ;; This redefines dired-aux.el's dired-add-entry to avoid calling ls for - ;; files that are going to be omitted anyway. - (if dired-omit-mode - ;; perhaps return t without calling ls - (let ((omit-re (dired-omit-regexp))) - (if (or (string= omit-re "") - (not - (string-match omit-re - (cond - ((eq 'no-dir dired-omit-localp) - filename) - ((eq t dired-omit-localp) - (dired-make-relative filename)) - (t - (dired-make-absolute - filename - (file-name-directory filename))))))) - ;; if it didn't match, go ahead and add the entry - (dired-omit-old-add-entry filename marker-char relative) - ;; dired-add-entry returns t for success, perhaps we should - ;; return file-exists-p - t)) - ;; omitting is not turned on at all - (dired-omit-old-add-entry filename marker-char relative))) - -;; Redefine it. -(fset 'dired-add-entry 'dired-omit-new-add-entry) - ;;; VIRTUAL DIRED MODE.