elisp: Abbrev Expansion

 
 35.4 Looking Up and Expanding Abbreviations
 ===========================================
 
 Abbrevs are usually expanded by certain interactive commands, including
 ‘self-insert-command’.  This section describes the subroutines used in
 writing such commands, as well as the variables they use for
 communication.
 
  -- Function: abbrev-symbol abbrev &optional table
      This function returns the symbol representing the abbrev named
      ABBREV.  It returns ‘nil’ if that abbrev is not defined.  The
      optional second argument TABLE is the abbrev table in which to look
      it up.  If TABLE is ‘nil’, this function tries first the current
      buffer’s local abbrev table, and second the global abbrev table.
 
  -- Function: abbrev-expansion abbrev &optional table
      This function returns the string that ABBREV would expand into (as
      defined by the abbrev tables used for the current buffer).  It
      returns ‘nil’ if ABBREV is not a valid abbrev.  The optional
      argument TABLE specifies the abbrev table to use, as in
      ‘abbrev-symbol’.
 
  -- Command: expand-abbrev
      This command expands the abbrev before point, if any.  If point
      does not follow an abbrev, this command does nothing.  To do the
      expansion, it calls the function that is the value of the
      ‘abbrev-expand-function’ variable, with no arguments, and returns
      whatever that function does.
 
      The default expansion function returns the abbrev symbol if it did
      expansion, and ‘nil’ otherwise.  If the abbrev symbol has a hook
      function that is a symbol whose ‘no-self-insert’ property is
      non-‘nil’, and if the hook function returns ‘nil’ as its value,
      then the default expansion function returns ‘nil’, even though
      expansion did occur.
 
  -- Function: abbrev-insert abbrev &optional name start end
      This function inserts the abbrev expansion of ‘abbrev’, replacing
      the text between ‘start’ and ‘end’.  If ‘start’ is omitted, it
      defaults to point.  ‘name’, if non-‘nil’, should be the name by
      which this abbrev was found (a string); it is used to figure out
      whether to adjust the capitalization of the expansion.  The
      function returns ‘abbrev’ if the abbrev was successfully inserted,
      otherwise it returns ‘nil’.
 
  -- Command: abbrev-prefix-mark &optional arg
      This command marks the current location of point as the beginning
      of an abbrev.  The next call to ‘expand-abbrev’ will use the text
      from here to point (where it is then) as the abbrev to expand,
      rather than using the previous word as usual.
 
      First, this command expands any abbrev before point, unless ARG is
      non-‘nil’.  (Interactively, ARG is the prefix argument.)  Then it
      inserts a hyphen before point, to indicate the start of the next
      abbrev to be expanded.  The actual expansion removes the hyphen.
 
  -- User Option: abbrev-all-caps
      When this is set non-‘nil’, an abbrev entered entirely in upper
      case is expanded using all upper case.  Otherwise, an abbrev
      entered entirely in upper case is expanded by capitalizing each
      word of the expansion.
 
  -- Variable: abbrev-start-location
      The value of this variable is a buffer position (an integer or a
      marker) for ‘expand-abbrev’ to use as the start of the next abbrev
      to be expanded.  The value can also be ‘nil’, which means to use
      the word before point instead.  ‘abbrev-start-location’ is set to
      ‘nil’ each time ‘expand-abbrev’ is called.  This variable is also
      set by ‘abbrev-prefix-mark’.
 
  -- Variable: abbrev-start-location-buffer
      The value of this variable is the buffer for which
      ‘abbrev-start-location’ has been set.  Trying to expand an abbrev
      in any other buffer clears ‘abbrev-start-location’.  This variable
      is set by ‘abbrev-prefix-mark’.
 
  -- Variable: last-abbrev
      This is the ‘abbrev-symbol’ of the most recent abbrev expanded.
      This information is left by ‘expand-abbrev’ for the sake of the
      ‘unexpand-abbrev’ command (SeeExpanding Abbrevs
      (emacs)Expanding Abbrevs.).
 
  -- Variable: last-abbrev-location
      This is the location of the most recent abbrev expanded.  This
      contains information left by ‘expand-abbrev’ for the sake of the
      ‘unexpand-abbrev’ command.
 
  -- Variable: last-abbrev-text
      This is the exact expansion text of the most recent abbrev
      expanded, after case conversion (if any).  Its value is ‘nil’ if
      the abbrev has already been unexpanded.  This contains information
      left by ‘expand-abbrev’ for the sake of the ‘unexpand-abbrev’
      command.
 
  -- Variable: abbrev-expand-function
      The value of this variable is a function that ‘expand-abbrev’ will
      call with no arguments to do the expansion.  The function can do
      anything it wants before and after performing the expansion.  It
      should return the abbrev symbol if expansion took place.
 
    The following sample code shows a simple use of
 ‘abbrev-expand-function’.  It assumes that ‘foo-mode’ is a mode for
 editing certain files in which lines that start with ‘#’ are comments.
 You want to use Text mode abbrevs for those lines.  The regular local
 abbrev table, ‘foo-mode-abbrev-table’ is appropriate for all other
 lines.  SeeStandard Abbrev Tables, for the definitions of
 ‘local-abbrev-table’ and ‘text-mode-abbrev-table’.  SeeAdvising
 Functions, for details of ‘add-function’.
 
      (defun foo-mode-abbrev-expand-function (expand)
        (if (not (save-excursion (forward-line 0) (eq (char-after) ?#)))
            ;; Performs normal expansion.
            (funcall expand)
          ;; We're inside a comment: use the text-mode abbrevs.
          (let ((local-abbrev-table text-mode-abbrev-table))
            (funcall expand))))
 
      (add-hook 'foo-mode-hook
                #'(lambda ()
                    (add-function :around (local 'abbrev-expand-function)
                                  #'foo-mode-abbrev-expand-function)))