mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-22 12:57:34 +00:00
(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:
parent
7b75b9937c
commit
2fe3d6ec19
2 changed files with 45 additions and 37 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue