# HG changeset patch # User Stefan Monnier # Date 1132095723 0 # Node ID c227619d69d6ae126b286b8dfd7b090c160c2517 # Parent 67dbd801970799db90f708ca2e3fea619b43dcc2 (rfn-eshadow-regexp): Remove. (rfn-eshadow-sifn-equal): New function. (rfn-eshadow-update-overlay): Rewrite to use substitute-in-file-name. diff -r 67dbd8019707 -r c227619d69d6 lisp/ChangeLog --- a/lisp/ChangeLog Tue Nov 15 22:55:48 2005 +0000 +++ b/lisp/ChangeLog Tue Nov 15 23:02:03 2005 +0000 @@ -10,6 +10,12 @@ * progmodes/gud.el (gud-menu-map): Make visibility of stop and go buttons complementary. +2005-11-15 Stefan Monnier + + * rfn-eshadow.el (rfn-eshadow-regexp): Remove. + (rfn-eshadow-sifn-equal): New function. + (rfn-eshadow-update-overlay): Rewrite to use substitute-in-file-name. + 2005-11-15 Michael Kifer * viper-utils (viper-non-word-characters-reformed-vi): Quote `-' in @@ -40,8 +46,7 @@ 2005-11-16 Kim F. Storm - * progmodes/gud.el (gud-tool-bar-item-visible-no-fringe): New - function. + * progmodes/gud.el (gud-tool-bar-item-visible-no-fringe): New function. (gud-menu-map): Use it. 2005-11-14 Luc Teirlinck diff -r 67dbd8019707 -r c227619d69d6 lisp/rfn-eshadow.el --- a/lisp/rfn-eshadow.el Tue Nov 15 22:55:48 2005 +0000 +++ b/lisp/rfn-eshadow.el Tue Nov 15 23:02:03 2005 +0000 @@ -98,7 +98,7 @@ '(face file-name-shadow field shadow) "Properties given to the `shadowed' part of a filename in the minibuffer. Only used when `file-name-shadow-mode' is active. -If emacs is not running under a window system, +If Emacs is not running under a window system, `file-name-shadow-tty-properties' is used instead." :type file-name-shadow-properties-custom-type :group 'minibuffer) @@ -121,20 +121,6 @@ ;;; Internal variables -;; Regexp to locate dividing point between shadow and real pathname -(defconst rfn-eshadow-regexp - (cond ((memq system-type '(ms-dos windows-nt)) - ;; This horrible regexp considers the following patterns as - ;; starting an absolute pathname, when following a `/' or an `\': - ;; L: / // ~ $ \\ \\\\ - "\\(.*[^/]+/+?\\|/*?\\|\\)\\(~\\|$[^$]\\|$\\'\\|[][\\^a-z]:\\|//?\\([^][\\^a-z/$~]\\|[^/$~][^:]\\|[^/$~]?\\'\\)\\)") - (t - ;; default is for unix-style filenames - "\\(.*/\\)\\([/~]\\|$[^$]\\|$\\'\\)")) - "Regular expression used to match shadowed filenames. -There should be at least one regexp group; the end of the first one -is used as the end of the shadowed portion of the filename.") - ;; A list of minibuffers to which we've added a post-command-hook. (defvar rfn-eshadow-frobbed-minibufs nil) @@ -168,31 +154,48 @@ (add-to-list 'rfn-eshadow-frobbed-minibufs (current-buffer)) (add-hook 'post-command-hook #'rfn-eshadow-update-overlay nil t))) +(defsubst rfn-eshadow-sifn-equal (goal pos) + (equal goal (condition-case nil + (substitute-in-file-name + (buffer-substring-no-properties pos (point-max))) + ;; `substitute-in-file-name' can fail on partial input. + (error nil)))) + ;; post-command-hook to update overlay (defun rfn-eshadow-update-overlay () "Update `rfn-eshadow-overlay' to cover shadowed part of minibuffer input. -This is intended to be used as a minibuffer post-command-hook for +This is intended to be used as a minibuffer `post-command-hook' for `file-name-shadow-mode'; the minibuffer should have already been set up by `rfn-eshadow-setup-minibuffer'." - ;; This is not really a correct implementation; it won't always do the - ;; right thing in the presence of environment variables that - ;; substitute-in-file-name would expand; currently it just assumes any - ;; environment variable contains an absolute filename. - (save-excursion - (let ((inhibit-point-motion-hooks t)) - (goto-char (minibuffer-prompt-end)) - ;; Update the overlay (which will evaporate if it's empty). - (move-overlay rfn-eshadow-overlay - (point) - (if (looking-at rfn-eshadow-regexp) - (match-end 1) - (point)))))) - + (condition-case nil + (let ((goal (substitute-in-file-name (minibuffer-contents))) + (mid (overlay-end rfn-eshadow-overlay)) + (start (minibuffer-prompt-end)) + (end (point-max))) + (unless + ;; Catch the common case where the shadow does not need to move. + (and mid + (or (eq mid end) + (not (rfn-eshadow-sifn-equal goal (1+ mid)))) + (or (eq mid start) + (rfn-eshadow-sifn-equal goal mid))) + ;; Binary search for the greatest position still equivalent to + ;; the whole. + (while (or (< (1+ start) end) + (if (and (< (1+ end) (point-max)) + (rfn-eshadow-sifn-equal goal (1+ end))) + ;; (SIFN end) != goal, but (SIFN (1+end)) == goal, + ;; We've reached a discontinuity: this can happen + ;; e.g. if `end' point to "/:...". + (setq start (1+ end) end (point-max)))) + (setq mid (/ (+ start end) 2)) + (if (rfn-eshadow-sifn-equal goal mid) + (setq start mid) + (setq end mid))) + (move-overlay rfn-eshadow-overlay (minibuffer-prompt-end) start))) + ;; `substitute-in-file-name' can fail on partial input. + (error nil))) -;;; Note this definition must be at the end of the file, because -;;; `define-minor-mode' actually calls the mode-function if the -;;; associated variable is non-nil, which requires that all needed -;;; functions be already defined. [This is arguably a bug in d-m-m] ;;;###autoload (define-minor-mode file-name-shadow-mode "Toggle File-Name Shadow mode. @@ -220,5 +223,5 @@ (provide 'rfn-eshadow) -;;; arch-tag: dcf70a52-0115-4ec2-b1e3-4f8d3541a888 +;; arch-tag: dcf70a52-0115-4ec2-b1e3-4f8d3541a888 ;;; rfn-eshadow.el ends here