Function: widget-specify-field
widget-specify-field is a byte-compiled function defined in
wid-edit.el.gz.
Signature
(widget-specify-field WIDGET FROM TO)
Documentation
Specify editable button for WIDGET between FROM and TO.
Source Code
;; Defined in /usr/src/emacs/lisp/wid-edit.el.gz
(defun widget-specify-field (widget from to)
"Specify editable button for WIDGET between FROM and TO."
;; Terminating space is not part of the field, but necessary in
;; order for local-map to work. Remove next sexp if local-map works
;; at the end of the overlay.
(save-excursion
(goto-char to)
(cond ((null (widget-get widget :size))
(forward-char 1))
(widget-field-add-space
(insert-and-inherit " ")))
(setq to (point)))
(let ((keymap (widget-get widget :keymap))
(face (or (widget-get widget :value-face) 'widget-field))
(help-echo (widget-get widget :help-echo))
(follow-link (widget-get widget :follow-link))
(rear-sticky
(or (not widget-field-add-space) (widget-get widget :size))))
(if (functionp help-echo)
(setq help-echo 'widget-mouse-help))
(when (and (or (> to (1+ from)) (null (widget-get widget :size)))
(= (char-before to) ?\n))
;; When the last character in the field is a newline, we want to
;; give it a `field' char-property of `boundary', which helps the
;; C-n/C-p act more naturally when entering/leaving the field. We
;; do this by making a small secondary overlay to contain just that
;; one character. BUT we only do this if there is more than one
;; character (so we don't do this for the character widget),
;; or if the size of the editable field isn't specified.
(let ((overlay (make-overlay (1- to) to nil t nil)))
;; Save it so that we can easily delete it in
;; `widget-field-value-delete'. (Bug#75646)
(widget-put widget :field-end-overlay overlay)
(overlay-put overlay 'field 'boundary)
;; We need the real field for tabbing.
(overlay-put overlay 'real-field widget)
;; Use `local-map' here, not `keymap', so that normal editing
;; works in the field when, say, Custom uses `suppress-keymap'.
(overlay-put overlay 'local-map keymap)
(overlay-put overlay 'face face)
(overlay-put overlay 'follow-link follow-link)
(overlay-put overlay 'help-echo help-echo)
;; Since the `widget-field' face has a :box attribute, we need to add
;; some character with no face after the newline character, to avoid
;; clashing with text that comes after the field and has a face with
;; a :box attribute too. (Bug#51550)
(overlay-put overlay 'after-string #(" " 0 1 (invisible t))))
(setq to (1- to))
(setq rear-sticky t))
(let ((overlay (make-overlay from to nil nil rear-sticky)))
(widget-put widget :field-overlay overlay)
;;(overlay-put overlay 'detachable nil)
(overlay-put overlay 'field widget)
(overlay-put overlay 'local-map keymap)
(overlay-put overlay 'face face)
(overlay-put overlay 'follow-link follow-link)
(overlay-put overlay 'help-echo help-echo)))
(widget-specify-secret widget))