Function: abbrev-insert
abbrev-insert is a byte-compiled function defined in abbrev.el.gz.
Signature
(abbrev-insert ABBREV &optional NAME WORDSTART WORDEND)
Documentation
Insert abbrev ABBREV at point.
If non-nil, NAME is the name by which this abbrev was found.
If non-nil, WORDSTART is the buffer position where to insert the abbrev.
If WORDEND is non-nil, it is a buffer position; the abbrev replaces the
previous text between WORDSTART and WORDEND.
Return ABBREV if the expansion should be considered as having taken place.
The return value can be influenced by a no-self-insert property;
see define-abbrev for details.
Probably introduced at or before Emacs version 23.1.
Source Code
;; Defined in /usr/src/emacs/lisp/abbrev.el.gz
(defun abbrev-insert (abbrev &optional name wordstart wordend)
"Insert abbrev ABBREV at point.
If non-nil, NAME is the name by which this abbrev was found.
If non-nil, WORDSTART is the buffer position where to insert the abbrev.
If WORDEND is non-nil, it is a buffer position; the abbrev replaces the
previous text between WORDSTART and WORDEND.
Return ABBREV if the expansion should be considered as having taken place.
The return value can be influenced by a `no-self-insert' property;
see `define-abbrev' for details."
(unless name (setq name (symbol-name abbrev)))
(unless wordstart (setq wordstart (point)))
(unless wordend (setq wordend wordstart))
;; Increment use count.
(abbrev-put abbrev :count (1+ (abbrev-get abbrev :count)))
(let ((value abbrev))
;; If this abbrev has an expansion, delete the abbrev
;; and insert the expansion.
(when (stringp (symbol-value abbrev))
(goto-char wordstart)
;; Insert at beginning so that markers at the end (e.g. point)
;; are preserved.
(insert (symbol-value abbrev))
(delete-char (- wordend wordstart))
(let ((case-fold-search nil))
;; If the abbrev's name is different from the buffer text (the
;; only difference should be capitalization), then we may want
;; to adjust the capitalization of the expansion.
(when (and (not (equal name (symbol-name abbrev)))
(string-match "[[:upper:]]" name))
(if (not (string-match "[[:lower:]]" name))
;; Abbrev was all caps. If expansion is multiple words,
;; normally capitalize each word.
(if (and (not abbrev-all-caps)
(save-excursion
(> (progn (backward-word 1) (point))
(progn (goto-char wordstart)
(forward-word 1) (point)))))
(upcase-initials-region wordstart (point))
(upcase-region wordstart (point)))
;; Abbrev included some caps. Cap first initial of expansion.
(let ((end (point)))
;; Find the initial.
(goto-char wordstart)
(skip-syntax-forward "^w" (1- end))
;; Change just that.
(upcase-initials-region (point) (1+ (point)))
(goto-char end))))))
;; Now point is at the end of the expansion and the beginning is
;; in last-abbrev-location.
(when (symbol-function abbrev)
(let* ((hook (symbol-function abbrev))
(expanded
;; If the abbrev has a hook function, run it.
(funcall hook)))
;; In addition, if the hook function is a symbol with
;; a non-nil `no-self-insert' property, let the value it
;; returned specify whether we consider that an expansion took
;; place. If it returns nil, no expansion has been done.
(if (and (symbolp hook)
(null expanded)
(get hook 'no-self-insert))
(setq value nil))))
value))