Smex is a M-x enhancement for Emacs. Built on top of Ido, it provides a convenient interface to your recently and most frequently used commands. And to all the other commands, too.
Jump to Changelog.
-
Get Smex
- Via Marmalade or MELPA.
- Or manually download Smex and set-up your load path. (Find out more.)
-
To auto-start Smex every time you open Emacs add these lines to your .emacs file:
(require 'smex) ; Not needed if you use package.el (smex-initialize) ; Can be omitted. This might cause a (minimal) delay ; when Smex is auto-initialized on its first run.
-
Bind some keys:
(global-set-key (kbd "M-x") 'smex) (global-set-key (kbd "M-X") 'smex-major-mode-commands) ;; This is your old M-x. (global-set-key (kbd "C-c C-c M-x") 'execute-extended-command)
-
Run Smex. (Type M-x, if that's your key binding).
The commands are displayed in an Ido completion buffer, ordered by relevance. The 7 most recently executed commands come first, the rest are sorted by frequency of use, command length and in alphabetical order.
Ido completion in 10 seconds: Typing selects matching commands:
e.g. 'lnmd' matches 'line-number-mode'. C-s
/C-r
switches to the
next/previous match. Enter
executes the selected command.
smex-major-mode-commands
runs Smex, limited to commands that
are relevant to the active major mode. Try it with Dired or Magit.
C-h f
, while Smex is active, runs describe-function
on the
currently selected command.
M-.
jumps to the definition of the selected command.
C-h w
shows the key bindings for the selected command. (Via where-is
.)
Before accepting user input, Smex checks for new command definitions
and updates its caches accordingly.
You can disable auto-updating and gain some slight speed improvements
on older systems by setting smex-auto-update
to nil.
To manually update Smex, call it a second time while it is already running.
Additionally, you can teach Smex to auto-update after Emacs has
been idle for 60 seconds: Call (smex-auto-update)
; provide an integer
argument for a custom time period in seconds.
smex-show-unbound-commands
shows frequently used commands that have
no key bindings.
Smex keeps a file to save its state betweens Emacs sessions. The
default path is "~/.smex-items"; you can change it by setting the
variable smex-save-file
.
Set smex-history-length
to change the number of recent commands that
Smex keeps track of.
Set smex-prompt-string
for a custom prompt.
-
Use
execute-extended-command
for running commands. This breaks support for Emacs versions older than 24 and obviates the user optionsmex-key-advice-ignore-menu-bar
. (The default Emacs behaviour is to not show menu bar bindings.)As a result of this change, the variable
suggest-key-bindings
is now honored when executing commands. -
Save command history in
extended-command-history
, like M-x.
- Improved tab completion in the Smex minibuffer
- Add compatibility with command-frequency
- Remove
smex-detect-legacy-save-file
. Only relevant (but a breaking change) when you rely on a long deprecated default value of smex-save-file. - Ignore smex-save-file when it's empty instead of raising an error. Warn on invalid data in smex-save-file. Fixes [issue #23] (#23).
- Allow running
where-is
on the selected command. - Fix compatibility with ido-ubiquitous.
- Add auto-initialization.
- Minor fixes.
Smex is my first venture into Elisp. I'd be glad to receive patches, comments and your considered criticism.
Have fun with Smex!