fancy-dabbrev

Homepage: https://github.com/jrosdahl/fancy-dabbrev

Author: Joel Rosdahl

Updated:

Summary

Like dabbrev-expand with preview and popup menu

Commentary

fancy-dabbrev essentially wraps the Emacs built-in dabbrev functionality,
with two improvements:

1. Preview: If fancy-dabbrev-mode is enabled, a preview of the first
   expansion candidate will be shown when any text has been entered. If
   fancy-dabbrev-expand then is called, the candidate will be expanded.

2. Popup menu: The first call to fancy-dabbrev-expand will expand the
   entered word prefix just like dabbrev-expand. But the second call will
   show a popup menu with other candidates (with the second candidate
   selected). The third call will advance to the third candidate, etc. It is
   also possible to go back to a previous candidate by calling
   fancy-dabbrev-backward. Selection from the menu can be canceled with C-g.
   Any cursor movement or typing will hide the menu again.


INSTALLATION
============

To load fancy-dabbrev, store fancy-dabbrev.el in your Emacs load path and
put something like this in your Emacs configuration file:

  ;; Load fancy-dabbrev.el:
  (require 'fancy-dabbrev)

  ;; Enable fancy-dabbrev previews everywhere:
  (global-fancy-dabbrev-mode)

  ;; Bind fancy-dabbrev-expand and fancy-dabbrev-backward to your keys of
  ;; choice:
  (global-set-key (kbd "TAB") 'fancy-dabbrev-expand)
  (global-set-key (kbd "") 'fancy-dabbrev-backward)

  ;; If you want TAB to indent the line like it usually does when the cursor
  ;; is not next to an expandable word, use 'fancy-dabbrev-expand-or-indent
  ;; instead:
  (global-set-key (kbd "TAB") 'fancy-dabbrev-expand-or-indent)


CONFIGURATION
============

fancy-dabbrev-expand uses dabbrev-expand under the hood, so most dabbrev-*
configuration options affect fancy-dabbrev-expand as well. For instance, if
you want to use fancy-dabbrev-expand when programming, you probably want to
use these dabbrev settings:

  ;; Let dabbrev searches ignore case and expansions preserve case:
  (setq dabbrev-case-distinction nil)
  (setq dabbrev-case-fold-search t)
  (setq dabbrev-case-replace nil)

Here are fancy-dabbrev's own configuration options:

* fancy-dabbrev-expansion-context (default: 'after-symbol)

  Where to try to perform expansion. If 'after-symbol, only try to expand
  after a symbol (as determined by thing-at-point). If
  'after-symbol-or-space, also make it possible to expand after a space  (the
  first expansion candidate will then be based on the previous symbol). If
  'after-non-space, enable expansion after any non-space character. If
  'almost-everywhere, enable exansion everywhere except at empty lines.

* fancy-dabbrev-expansion-on-preview-only (default: nil)

  Only expand when a preview is shown or expansion ran for the last command.
  This has the advantage that fancy-dabbrev-expand-or-indent always falls
  back to calling fancy-dabbrev-indent-command when there is nothing to
  expand.

* fancy-dabbrev-indent-command (default: 'indent-for-tab-command)

  The indentation command used for fancy-dabbrev-expand-or-indent.

* fancy-dabbrev-menu-height (default: 10)

  How many expansion candidates to show in the menu.

* fancy-dabbrev-no-expansion-for (default: '(multiple-cursors-mode))

  A list of variables which, if bound and non-nil, will inactivate
  fancy-dabbrev expansion. The variables typically represent major or minor
  modes. When inactive, fancy-dabbrev-expand will fall back to running
  dabbrev-expand.

* fancy-dabbrev-no-preview-for (default: '(iedit-mode isearch-mode
  multiple-cursors-mode))

  A list of variables which, if bound and non-nil, will inactivate
  fancy-dabbrev preview. The variables typically represent major or minor
  modes.

* fancy-dabbrev-preview-context (default: 'at-eol)

  When to show the preview. If 'at-eol, only show the preview if no other
  text (except whitespace) is to the right of the cursor. If
  'before-non-word, show the preview whenever the cursor is not immediately
  before (or inside) a word. If 'everywhere, always show the preview after
  typing.

* fancy-dabbrev-preview-delay (default: 0.0)

  How long (in seconds) to wait until displaying the preview after a
  keystroke. Set this to e.g. 0.2 if you think that it's annoying to get a
  preview immediately after writing some text.

* fancy-dabbrev-self-insert-commands (default (self-insert-command
  org-self-insert-command))

  A list of commands after which to show a preview.

* fancy-dabbrev-sort-menu (default nil)

  If nil, the popup menu will show matching candidates in the order that
  repeated calls to dabbrev-expand would return (i.e., first candidates
  before the cursor, then after the cursor and then from other buffers). If
  t, the candidates (except the first one) will be sorted.


WHY?
====

There are many other Emacs packages for doing more or less advanced
auto-completion in different ways. After trying out some of the more popular
ones and not clicking with them, I kept coming back to dabbrev due to its
simplicity. Since I missed the preview feature and a way of selecting
expansions candidates from a menu if the first candidate isn't the right
one, I wrote fancy-dabbrev.

Have fun!

/Joel Rosdahl 

Dependencies