(rfn-eshadow-regexp): Remove.

(rfn-eshadow-sifn-equal): New function.
(rfn-eshadow-update-overlay): Rewrite to use substitute-in-file-name.
This commit is contained in:
Stefan Monnier 2005-11-15 23:02:03 +00:00
parent 7b75b9937c
commit 2fe3d6ec19
2 changed files with 45 additions and 37 deletions

View file

@ -10,6 +10,12 @@
* progmodes/gud.el (gud-menu-map): Make visibility of stop and
go buttons complementary.
2005-11-15 Stefan Monnier <monnier@iro.umontreal.ca>
* 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 <kifer@cs.stonybrook.edu>
* viper-utils (viper-non-word-characters-reformed-vi): Quote `-' in
@ -40,8 +46,7 @@
2005-11-16 Kim F. Storm <storm@cua.dk>
* 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 <teirllm@auburn.edu>

View file

@ -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 @@ system, `file-name-shadow-properties' is used instead."
;;; 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 @@ The prompt and initial input should already have been inserted."
(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 @@ Returns non-nil if the new state is enabled."
(provide 'rfn-eshadow)
;;; arch-tag: dcf70a52-0115-4ec2-b1e3-4f8d3541a888
;; arch-tag: dcf70a52-0115-4ec2-b1e3-4f8d3541a888
;;; rfn-eshadow.el ends here