Function: completion--replace

completion--replace is a byte-compiled function defined in minibuffer.el.gz.

Signature

(completion--replace BEG END NEWTEXT)

Documentation

Replace the buffer text between BEG and END with NEWTEXT.

Moves point to the end of the new text.

Source Code

;; Defined in /usr/src/emacs/lisp/minibuffer.el.gz
(defun completion--replace (beg end newtext)
  "Replace the buffer text between BEG and END with NEWTEXT.
Moves point to the end of the new text."
  ;; The properties on `newtext' include things like the
  ;; `completions-first-difference' face, which we don't want to
  ;; include upon insertion.
  (setq newtext (copy-sequence newtext)) ;Don't modify the arg by side-effect.
  (if minibuffer-allow-text-properties
      ;; If we're preserving properties, then just remove the faces
      ;; and other properties added by the completion machinery.
      (remove-text-properties 0 (length newtext) '(face completion-score)
                              newtext)
    ;; Remove all text properties.
    (set-text-properties 0 (length newtext) nil newtext))
  ;; Maybe this should be in subr.el.
  ;; You'd think this is trivial to do, but details matter if you want
  ;; to keep markers "at the right place" and be robust in the face of
  ;; after-change-functions that may themselves modify the buffer.
  (let ((prefix-len 0))
    ;; Don't touch markers in the shared prefix (if any).
    (while (and (< prefix-len (length newtext))
                (< (+ beg prefix-len) end)
                (eq (char-after (+ beg prefix-len))
                    (aref newtext prefix-len)))
      (setq prefix-len (1+ prefix-len)))
    (unless (zerop prefix-len)
      (setq beg (+ beg prefix-len))
      (setq newtext (substring newtext prefix-len))))
  (let ((suffix-len 0))
    ;; Don't touch markers in the shared suffix (if any).
    (while (and (< suffix-len (length newtext))
                (< beg (- end suffix-len))
                (eq (char-before (- end suffix-len))
                    (aref newtext (- (length newtext) suffix-len 1))))
      (setq suffix-len (1+ suffix-len)))
    (unless (zerop suffix-len)
      (setq end (- end suffix-len))
      (setq newtext (substring newtext 0 (- suffix-len))))
    (goto-char beg)
    (let ((length (- end beg)))         ;Read `end' before we insert the text.
      (insert-and-inherit newtext)
      (delete-region (point) (+ (point) length)))
    (forward-char suffix-len)))