Mercurial > emacs
view lisp/rfn-eshadow.el @ 83542:2d56e13fd23d
Merged from emacs@sv.gnu.org
Patches applied:
* emacs@sv.gnu.org/emacs--devo--0--patch-413
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-414
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-415
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-416
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-417
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-418
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-419
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-420
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-421
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-422
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-423
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-424
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-425
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-426
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-427
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-428
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-429
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-430
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-431
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-432
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-433
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-434
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-435
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-436
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-437
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-438
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-439
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-440
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-441
lisp/url/url-methods.el: Fix format error when http_proxy is empty string
* emacs@sv.gnu.org/emacs--devo--0--patch-442
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-443
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-444
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-445
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-446
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-447
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-448
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-449
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-450
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-451
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-452
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-453
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-454
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-455
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-456
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-457
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-458
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-459
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-460
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-461
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-462
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-463
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-464
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-465
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-466
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-467
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-468
Merge from gnus--rel--5.10
* emacs@sv.gnu.org/emacs--devo--0--patch-469
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-470
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-471
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-472
Update from CVS
* emacs@sv.gnu.org/emacs--devo--0--patch-473
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-128
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-129
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-130
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-131
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-132
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-133
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-134
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-135
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-136
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-137
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-138
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-139
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-140
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-141
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-142
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-143
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-144
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-145
Merge from emacs--devo--0
* emacs@sv.gnu.org/gnus--rel--5.10--patch-146
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-147
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-148
Update from CVS
* emacs@sv.gnu.org/gnus--rel--5.10--patch-149
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-582
author | Karoly Lorentey <lorentey@elte.hu> |
---|---|
date | Sat, 14 Oct 2006 17:36:28 +0000 |
parents | 3bd95f4f2941 |
children | a8f0f78b5599 c5406394f567 |
line wrap: on
line source
;;; rfn-eshadow.el --- Highlight `shadowed' part of read-file-name input text ;; ;; Copyright (C) 2000, 2001, 2002, 2003, 2004, ;; 2005, 2006 Free Software Foundation, Inc. ;; ;; Author: Miles Bader <miles@gnu.org> ;; Keywords: convenience minibuffer ;; This file is part of GNU Emacs. ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;;; Commentary: ;; ;; Defines the mode `file-name-shadow-mode'. ;; ;; The `read-file-name' function passes its result through ;; `substitute-in-file-name', so any part of the string preceding ;; multiple slashes (or a drive indicator on MS-DOS/MS-Windows) is ;; ignored. ;; ;; If `file-name-shadow-mode' is active, any part of the ;; minibuffer text that would be ignored because of this is given the ;; properties in `file-name-shadow-properties', which may ;; be used to make the ignored text invisible, dim, etc. ;; ;;; Code: ;;; Customization (defconst file-name-shadow-properties-custom-type '(list (checklist :inline t (const :tag "Invisible" :doc "Make shadowed part of filename invisible" :format "%t%n%h" :inline t (invisible t intangible t)) (list :inline t :format "%v" :tag "Face" :doc "Display shadowed part of filename using a different face" (const :format "" face) (face :value file-name-shadow)) (list :inline t :format "%t: %v%h" :tag "Brackets" ;; Note the 4 leading spaces in the doc string; ;; this is hack to get around the fact that the ;; newline after the second string widget comes ;; from the string widget, and doesn't indent ;; correctly. We could use a :size attribute to ;; make the second string widget not have a ;; terminating newline, but this makes it impossible ;; to enter trailing whitespace, and it's desirable ;; that it be possible. :doc " Surround shadowed part of filename with brackets" (const :format "" before-string) (string :format "%v" :size 4 :value "{") (const :format "" after-string) ;; see above about why the 2nd string doesn't use :size (string :format " and: %v" :value "} ")) (list :inline t :format "%t: %v%n%h" :tag "String" :doc "Display a string instead of the shadowed part of filename" (const :format "" display) (string :format "%v" :size 15 :value "<...ignored...>")) (const :tag "Avoid" :doc "Try to keep cursor out of shadowed part of filename" :format "%t%n%h" :inline t (field shadow))) (repeat :inline t :tag "Other Properties" (list :inline t :format "%v" (symbol :tag "Property") (sexp :tag "Value"))))) (defcustom file-name-shadow-properties '(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 :version "22.1") (defcustom file-name-shadow-tty-properties '(before-string "{" after-string "} " field shadow) "Properties given to the `shadowed' part of a filename in the minibuffer. Only used when `file-name-shadow-mode' is active and emacs is not running under a window-system; if emacs is running under a window system, `file-name-shadow-properties' is used instead." :type file-name-shadow-properties-custom-type :group 'minibuffer :version "22.1") (defface file-name-shadow '((t :inherit shadow)) "Face used by `file-name-shadow-mode' for the shadow." :group 'minibuffer :version "22.1") ;;; Internal variables ;; A list of minibuffers to which we've added a post-command-hook. (defvar rfn-eshadow-frobbed-minibufs nil) ;; An overlay covering the shadowed part of the filename (local to the ;; minibuffer). (defvar rfn-eshadow-overlay) (make-variable-buffer-local 'rfn-eshadow-overlay) ;;; Hook functions ;; This function goes on minibuffer-setup-hook (defun rfn-eshadow-setup-minibuffer () "Set up a minibuffer for `file-name-shadow-mode'. The prompt and initial input should already have been inserted." (when minibuffer-completing-file-name (setq rfn-eshadow-overlay (make-overlay (minibuffer-prompt-end) (minibuffer-prompt-end))) ;; Give rfn-eshadow-overlay the user's props. (let ((props (if window-system file-name-shadow-properties file-name-shadow-tty-properties))) (while props (overlay-put rfn-eshadow-overlay (pop props) (pop props)))) ;; Turn on overlay evaporation so that we don't have to worry about ;; odd effects when the overlay sits empty at the beginning of the ;; minibuffer. (overlay-put rfn-eshadow-overlay 'evaporate t) ;; Add our post-command hook, and make sure can remove it later. (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))) (define-minor-mode file-name-shadow-mode "Toggle File-Name Shadow mode. When active, any part of a filename being read in the minibuffer that would be ignored (because the result is passed through `substitute-in-file-name') is given the properties in `file-name-shadow-properties', which can be used to make that portion dim, invisible, or otherwise less visually noticeable. With prefix argument ARG, turn on if positive, otherwise off. Returns non-nil if the new state is enabled." :global t :init-value t :group 'minibuffer :version "22.1" (if file-name-shadow-mode ;; Enable the mode (add-hook 'minibuffer-setup-hook 'rfn-eshadow-setup-minibuffer) ;; Disable the mode (remove-hook 'minibuffer-setup-hook 'rfn-eshadow-setup-minibuffer) ;; Remove our entry from any post-command-hook variable's it's still in (dolist (minibuf rfn-eshadow-frobbed-minibufs) (with-current-buffer minibuf (remove-hook 'post-command-hook #'rfn-eshadow-update-overlay t))) (setq rfn-eshadow-frobbed-minibufs nil))) (provide 'rfn-eshadow) ;; arch-tag: dcf70a52-0115-4ec2-b1e3-4f8d3541a888 ;;; rfn-eshadow.el ends here