From: David PONCE <david.ponce@wanadoo.fr>
Cc: emacs-pretest-bug@gnu.org, emacs-devel@gnu.org
Subject: Re: Inherited face appears as a function in customize-face buffer
Date: Mon, 4 Apr 2005 14:20:45 +0200 (CEST) [thread overview]
Message-ID: <2658884.1112617245113.JavaMail.www@wwinf1302> (raw)
Hello,
> It works well excepted that sometimes, when doing M-TAB completion, I
> encounter this bug:
>
> Debugger entered--Lisp error: (args-out-of-range 1094 1094)
> get-char-property(1094 field #<buffer *Customize Face: Header Line*>)
> widget-field-end(...)
> widget-field-find(1229)
> widget-before-change(1229 1234)
> lisp-complete-symbol(facep)
> #[nil "ÀÁ!‡" [lisp-complete-symbol facep] 2 nil nil]()
> call-interactively(#[nil "ÀÁ!‡" [lisp-complete-symbol facep] 2 nil nil])
> widget-default-complete(...)
> widget-apply(... :complete)
> widget-complete()
> call-interactively(widget-complete)
>
> I am not sure it is due to my change nor have any idea on what could
> cause it. Maybe a guru of the custom/widget internals could help?
I think I finally found the cause of the above bug. It is due to a
side effect of the field narrowing done in `widget-complete' and the
call to `widget-field-end' (so to `get-char-property') done via the
`before-change-functions' hook `widget-before-change'.
I fixed that by temporarily removing field narrowing in
`widget-field-end' before to call `get-char-property'.
Here is a new complete patch that seems to work great now. WDYT?
Sincerely,
David
2005-04-04 David Ponce <david@dponce.com>
* cus-edit.el (face): Derive from symbol widget. Display sample
of the current face on the fly.
(widget-face-sample-face-get, widget-face-notify): New functions.
(widget-face-value-create): Remove.
* wid-edit.el (widget-field-end): Temporarily remove field
narrowing before to call `get-char-property'.
Index: lisp/cus-edit.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/cus-edit.el,v
retrieving revision 1.216
diff -c -r1.216 cus-edit.el
*** lisp/cus-edit.el 27 Feb 2005 21:37:03 -0000 1.216
--- lisp/cus-edit.el 4 Apr 2005 12:14:37 -0000
***************
*** 3296,3360 ****
(defvar widget-face-prompt-value-history nil
"History of input to `widget-face-prompt-value'.")
! (define-widget 'face 'restricted-sexp
! "A Lisp face name."
:complete-function (lambda ()
(interactive)
(lisp-complete-symbol 'facep))
- :prompt-value 'widget-field-prompt-value
- :prompt-internal 'widget-symbol-prompt-internal
:prompt-match 'facep
:prompt-history 'widget-face-prompt-value-history
- :value-create 'widget-face-value-create
- :action 'widget-field-action
- :match-alternatives '(facep)
:validate (lambda (widget)
(unless (facep (widget-value widget))
! (widget-put widget :error (format "Invalid face: %S"
! (widget-value widget)))
! widget))
! :value 'ignore
! :tag "Function")
!
!
! ;;; There is a bug here: the sample doesn't get redisplayed
! ;;; in the new font when you specify one. Does anyone know how to
! ;;; make that work? -- rms.
!
! (defun widget-face-value-create (widget)
! "Create an editable face name field."
! (let ((buttons (widget-get widget :buttons))
! (symbol (widget-get widget :value)))
! ;; Sample.
! (push (widget-create-child-and-convert widget 'item
! :format "(%{%t%})"
! :sample-face symbol
! :tag "sample")
! buttons)
! (insert " ")
! ;; Update buttons.
! (widget-put widget :buttons buttons))
!
! (let ((size (widget-get widget :size))
! (value (widget-get widget :value))
! (from (point))
! ;; This is changed to a real overlay in `widget-setup'. We
! ;; need the end points to behave differently until
! ;; `widget-setup' is called.
! (overlay (cons (make-marker) (make-marker))))
! (widget-put widget :field-overlay overlay)
! (insert value)
! (and size
! (< (length value) size)
! (insert-char ?\ (- size (length value))))
! (unless (memq widget widget-field-list)
! (setq widget-field-new (cons widget widget-field-new)))
! (move-marker (cdr overlay) (point))
! (set-marker-insertion-type (cdr overlay) nil)
! (when (null size)
! (insert ?\n))
! (move-marker (car overlay) from)
! (set-marker-insertion-type (car overlay) t)))
;;; The `hook' Widget.
--- 3296,3332 ----
(defvar widget-face-prompt-value-history nil
"History of input to `widget-face-prompt-value'.")
! (define-widget 'face 'symbol
! "A Lisp face name (with sample)."
! :format "%t: (%{sample%}) %v"
! :tag "Face"
! :value 'default
! :sample-face-get 'widget-face-sample-face-get
! :notify 'widget-face-notify
! :match (lambda (widget value) (facep value))
:complete-function (lambda ()
(interactive)
(lisp-complete-symbol 'facep))
:prompt-match 'facep
:prompt-history 'widget-face-prompt-value-history
:validate (lambda (widget)
(unless (facep (widget-value widget))
! (widget-put widget
! :error (format "Invalid face: %S"
! (widget-value widget)))
! widget)))
!
! (defun widget-face-sample-face-get (widget)
! (let ((value (widget-value widget)))
! (if (facep value)
! value
! 'default)))
!
! (defun widget-face-notify (widget child &optional event)
! "Update the sample, and notify the parent."
! (overlay-put (widget-get widget :sample-overlay)
! 'face (widget-apply widget :sample-face-get))
! (widget-default-notify widget child event))
;;; The `hook' Widget.
Index: lisp/wid-edit.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/wid-edit.el,v
retrieving revision 1.136
diff -c -r1.136 wid-edit.el
*** lisp/wid-edit.el 29 Jan 2005 17:21:12 -0000 1.136
--- lisp/wid-edit.el 4 Apr 2005 12:14:44 -0000
***************
*** 1185,1193 ****
;; or if a special `boundary' field has been added after the widget
;; field.
(if (overlayp overlay)
! (if (and (not (eq (get-char-property (overlay-end overlay)
! 'field
! (widget-field-buffer widget))
'boundary))
(or widget-field-add-space
(null (widget-get widget :size))))
--- 1185,1201 ----
;; or if a special `boundary' field has been added after the widget
;; field.
(if (overlayp overlay)
! (if (and (not (eq (with-current-buffer
! (widget-field-buffer widget)
! (save-restriction
! ;; `widget-narrow-to-field' can be
! ;; active when this function is called
! ;; from an change-functions hook. So
! ;; temporarily remove field narrowing
! ;; before to call `get-char-property'.
! (widen)
! (get-char-property (overlay-end overlay)
! 'field)))
'boundary))
(or widget-field-add-space
(null (widget-get widget :size))))
next reply other threads:[~2005-04-04 12:20 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-04-04 12:20 David PONCE [this message]
2005-04-05 4:22 ` Inherited face appears as a function in customize-face buffer Richard Stallman
-- strict thread matches above, loose matches on Subject: below --
2005-04-05 6:43 David PONCE
2005-04-06 9:21 ` Ralf Angeli
2005-04-06 11:43 ` Ralf Angeli
2005-04-01 8:49 David PONCE
2005-04-01 8:40 David PONCE
2005-04-02 4:19 ` Richard Stallman
2005-03-27 9:28 David Ponce
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2658884.1112617245113.JavaMail.www@wwinf1302 \
--to=david.ponce@wanadoo.fr \
--cc=emacs-devel@gnu.org \
--cc=emacs-pretest-bug@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).