[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/lisp/rfn-eshadow.el
From: |
Stefan Monnier |
Subject: |
[Emacs-diffs] Changes to emacs/lisp/rfn-eshadow.el |
Date: |
Tue, 15 Nov 2005 18:02:04 -0500 |
Index: emacs/lisp/rfn-eshadow.el
diff -c emacs/lisp/rfn-eshadow.el:1.15 emacs/lisp/rfn-eshadow.el:1.16
*** emacs/lisp/rfn-eshadow.el:1.15 Sat Aug 6 22:13:43 2005
--- emacs/lisp/rfn-eshadow.el Tue Nov 15 23:02:03 2005
***************
*** 98,104 ****
'(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,
`file-name-shadow-tty-properties' is used instead."
:type file-name-shadow-properties-custom-type
:group 'minibuffer)
--- 98,104 ----
'(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,
`file-name-shadow-tty-properties' is used instead."
:type file-name-shadow-properties-custom-type
:group 'minibuffer)
***************
*** 121,140 ****
;;; 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)
--- 121,126 ----
***************
*** 168,198 ****
(add-to-list 'rfn-eshadow-frobbed-minibufs (current-buffer))
(add-hook 'post-command-hook #'rfn-eshadow-update-overlay nil t)))
;; 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
`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))))))
!
- ;;; 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.
--- 154,201 ----
(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
`file-name-shadow-mode'; the minibuffer should have already
been set up by `rfn-eshadow-setup-minibuffer'."
! (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)))
;;;###autoload
(define-minor-mode file-name-shadow-mode
"Toggle File-Name Shadow mode.
***************
*** 220,224 ****
(provide 'rfn-eshadow)
! ;;; arch-tag: dcf70a52-0115-4ec2-b1e3-4f8d3541a888
;;; rfn-eshadow.el ends here
--- 223,227 ----
(provide 'rfn-eshadow)
! ;; arch-tag: dcf70a52-0115-4ec2-b1e3-4f8d3541a888
;;; rfn-eshadow.el ends here
- [Emacs-diffs] Changes to emacs/lisp/rfn-eshadow.el,
Stefan Monnier <=
- [Emacs-diffs] Changes to emacs/lisp/rfn-eshadow.el, Luc Teirlinck, 2005/11/15
- [Emacs-diffs] Changes to emacs/lisp/rfn-eshadow.el, Luc Teirlinck, 2005/11/15
- [Emacs-diffs] Changes to emacs/lisp/rfn-eshadow.el, Luc Teirlinck, 2005/11/15
- [Emacs-diffs] Changes to emacs/lisp/rfn-eshadow.el, Luc Teirlinck, 2005/11/16
- [Emacs-diffs] Changes to emacs/lisp/rfn-eshadow.el, Luc Teirlinck, 2005/11/17