Skip to content
Emacs incremental completion and selection narrowing framework
Emacs Lisp Other
Failed to load latest commit information.
doc Delete now unneeded .gif file.
.gitignore Add ID to .gitignore
COPYING Add full GPLv3 license.
Makefile * Makefile: Sort files list (#874). Add a note on README about helm external packages. Update help in
helm-adaptive.el * helm-adaptive.el: Add autoload cookie for helm-adaptive-mode
helm-apt.el Keep adding helm-only prop where missing.
helm-bookmark.el Remove also the search function which is wrong in helm-bookmark.
helm-buffers.el Add helm-only property to helm actions.
helm-color.el Add helm-only property to helm actions.
helm-command.el Add helm-only property to helm actions.
helm-config.el Remove last references to helm-do-grep that is not existing anymore (#…
helm-core-pkg.el Prepare *pkg.el files for bump to 1.9.2.
helm-dabbrev.el Unquote lambda's.
helm-easymenu.el Remove last references to helm-do-grep that is not existing anymore (#…
helm-elisp-package.el Add helm-only property to helm actions.
helm-elisp.el Add commands to `helm-apropos` for faces (#1318)
helm-elscreen.el Add helm-elscreen-history (#1175).
helm-eshell.el Shutup byte compiler on melpa install in helm-eshell.el.
helm-eval.el make calculation message include result (#1110)
helm-external.el Unquote lambda's.
helm-files.el Make helm gid bindings more consistents with other grep commands.
helm-font.el Add a space after code in ucs (#1365).
helm-grep.el Merge branch 'master' of
helm-help.el Update help for *-read-file-name.
helm-id-utils.el Allow customization of truncate-lines in several places.
helm-imenu.el Fix default in imenu.
helm-info.el Check existence of directory in `helm-get-info-files` (#1330).
helm-lib.el Make some more functions helm-only.
helm-locate.el Fix typo, thanks Michael (#1360).
helm-man.el Require helm-help in several places.
helm-misc.el Require helm-help in several places.
helm-mode.el Don't use the generic sort fn when fuzzy matching.
helm-multi-match.el Fix docstring of helm-mm-matching-method (#1283).
helm-net.el Unquote lambda's.
helm-org.el Merge branch 'org_heading_class' into optimize_org
helm-pkg.el Prepare *pkg.el files for bump to 1.9.2.
helm-plugin.el Update copyrights.
helm-regexp.el Add helm-only property to helm actions.
helm-ring.el Fix undo-tree action in registers.
helm-semantic.el Remove allow-dups from semantic and imenu (#1250).
helm-source.el Fix again local source after and before init hooks (#1310).
helm-sys.el Require helm-help in several places.
helm-tags.el Don't query user when TAGS file is modified and visiting a buffer (#1374
helm-types.el Add keymap and help-message to helm-type-file.
helm-utils.el Use directly require in helm-popup-tip-mode.
helm.el Add documentation to hook variables.

License GPL 3 MELPA MELPA Stable



You can Donate to help this project.

Table of Contents


Helm is incremental completion and selection narrowing framework for Emacs. It will help steer you in the right direction when you're looking for stuff in Emacs (like buffers, files, etc).

Helm is a fork of anything.el originally written by Tamas Patrovic and can be considered to be its successor. Helm sets out to clean up the legacy code in anything.el and provide a cleaner, leaner and more modular tool, that's not tied in the trap of backward compatibility.


You need a recent Emacs to use latest helm, at least Emacs-24.3.

async will be installed as dependency when installing from melpa but is facultative when installing from git (recommended though as it may fix installation of all packages from (m)elpa and will allow you to copy/rename asynchronously your files from helm and/or dired if needed).

Getting Started

Quick install from git

  1. Clone the helm repository to some directory:

    $ git clone /path/to/helm/directory
  2. Clone the async repository to some directory (facultative)

    $ git clone /path/to/async/directory
  3. Run make from the helm directory.

  4. Add to .emacs.el (or equivalent):

    ;; [Facultative] Only if you have installed async.
    (add-to-list 'load-path "/path/to/async/directory")
    (add-to-list 'load-path "/path/to/helm/directory")
    (require 'helm-config)

NOTE: Installing helm like this (i.e from git+make) is the safest way.

You can have a quick try to helm by launching from the helm directory:


It is also recommended to use this when reporting bug.

NOTE: That this will not work on Windows systems.

Install from Emacs packaging system

Helm is now available on Melpa at You will find there instructions to install. See also to startup correctly with the emacs packaging system. Then you should need only in your init file:

(require 'helm-config)

WARNING: Due to a bad concept of package.el which is in charge of fetching helm files and compiling them, users had errors most of the time when upgrading from melpa and list-package. To avoid this Async have been added as dependency to helm to force package.el compiling its files in a clean environment. People installing from git and using the make file will not suffer from this problem and don't need Async though it is recommended as it fix installation of all other packages you may install with package.el from (m)elpa. See FAQ for more infos.

Note: After upgrading from the emacs packaging system you should restart emacs for the changes take effect.

Note to Linux Distributions Maintainers

Only the extensions present in the github emacs-helm organisation are supported.

Install and use only helm-core package

Third party helm packages can use only helm-core package if they don't need more helm libraries for their packages. It is available at

All you need to add in your packages is

 (require 'helm)

This will provide the necessary code to build and run helm sources with multiple regexp matching or fuzzy matching.

See wiki for more infos.

Alternate install warning

Some people are installing helm with their own config using diverses require, autoload and other hacks, not using helm-config. Expect failures and slowdown at startup unless you really know what you are doing when you do so.


For a minimal helm configuration, run the startup script ./ and look at the file /tmp/helm-cfg.el.

The full configuration I use (helm maintainer) can be found here.

Don't hesitate also to visit all helm customizable variables with the customize interface. Enabling helm-mode will give you completion in the diverse customize commands.

Also you will find some packages like Emacs Prelude that have Helm built-in and properly set-up.

Basic usage

Just type M-x helm-M-x RET helm-, you will have completion on all helm commands.

You can bind this to M-x like this:

(global-set-key (kbd "M-x") 'helm-M-x)


Once you are in the helm session (of helm-M-x or any one else) you can hit either C-h m or C-c ?, the former is will popup a general info buffer about helm while the second will popup a specialized info of the current source you are into. Sometime C-c ? is not available, in this case you will see in mode-line C-h m instead of C-c ?. PLEASE USE and ABUSE of these helm embeded infos before reporting a bug about how to do things in helm, you will find also useful infos in mode-line.

You can also start with M-x helm-mode and enjoy helm completion in your favourites Emacs commands (e.g M-x, C-x C-f, etc...). You can enable this by adding in your init file:

(helm-mode 1)
  • NOTE that the helmized emacs commands are different and much more basic than the helm ones.

As a startup point you can also look at the helm section in Emacs menu to discover some of the commands provided by helm.

For those who have a system able to run shell scripts, a convenient way to discover helm is to run ./ from the helm directory, you will find interesting infos in your scratch buffer. accept all emacs command line options, see -h for more infos.

Advanced usage

Helm is capable of a lot. Here is a demo of helm-buffers-list used with helm-moccur:


The demo starts when you see Eval: START in the minibuffer.

  • All the C buffers are selected using the regexp *C. In the demo, I also select Tcl buffers with *Tcl and then switched back to C buffers with *C.
  • I only want to have buffers that contains only the string "crash". To do that, I add a space, then add the pattern @crash.
  • After the initial search pattern, I hand over the current matching buffers to helm-moccur - moccur with Helm interface. In the above demo, I only switch to one file, that is kexec.c. However, you can select multiple buffers with C-SPC or select all buffers with M-a.
  • Candidates can be filtered gradually by adding more pattern, i.e. I added memory to filtered down to buffers that contain the string "memory" among the buffers that are containing "crash".

As you can see, as you filtered out, the number of candidates decreases, as displayed in the modeline. At the end, there were 12 buffers remained as the result of filtering, down from the total 253 buffers.

You can read this guide to quickly get started with Helm.

You can find all the gory details on the Helm Wiki.

Create your own helm source (overview)

Here a quick example using sync method with candidates generated by a simple list, a function can be used instead of course (see helm wiki for more infos).

(helm :sources (helm-build-sync-source "test"
                 :candidates '(foo foa fob bar baz)
                 :fuzzy-match t)
      :buffer "*helm test*")

Fuzzy matching

Helm has a built-in fuzzy matcher that is activated for some commands. Fuzzy matching is disabled by default. Currently these commands supports fuzzy matching:

  • helm-recentf: Enable by setting helm-recentf-fuzzy-match to t.
  • helm-mini: Enable by setting helm-buffers-fuzzy-matching and helm-recentf-fuzzy-match to t.
  • helm-buffers-list: Enable by setting helm-buffers-fuzzy-matching to t.
  • helm-find-files: Enable by default.
  • helm-locate: Enable by setting helm-locate-fuzzy-match to t.
  • helm-M-x: Enable by setting helm-M-x-fuzzy-match to t.
  • helm-semantic: Enable by setting helm-semantic-fuzzy-match to t.
  • helm-imenu: Enable by setting helm-imenu-fuzzy-match to t.
  • helm-apropos: Enable by setting helm-apropos-fuzzy-match to t.
  • helm-lisp-completion-at-point: Enable by setting helm-lisp-fuzzy-completion to t.

You can also enable fuzzy matching globally in all functions helmized by helm-mode with helm-mode-fuzzy-match and helm-completion-in-region-fuzzy-match.

IMPORTANT: To make fuzzy-matching fast, you must not set helm-candidate-number-limit too high. It is recommended that you leave the variable with its default value 100. The higher you set helm-candidate-number-limit, the slower fuzzy-matching will be.


Helm can now resize according to the number of candidates with helm-autoresize-mode:

(helm-autoresize-mode 1)

You can customize the minimum and maximum height that Helm can resize with these two variables:

  • helm-autoresize-max-height
  • helm-autoresize-min-height

By default, helm-autoresize-max-height is set to 40, which makes Helm candidate buffer has the maximum height of 40% of current frame height. Similarly, helm-autoresize-min-height specifies the minimum height that Helm candidate buffer cannot be smaller.

If you don't want the Helm window to be resized, but a smaller Helm window, you can set helm-autoresize-min-height equal to helm-autoresize-max-height.


Applications (not exhaustive)

  • helm-mode: Allow turning on helm in all completions provided by emacs, when available you should use instead the same feature provided natively by helm.
  • helm-find-files: Replace in one command all the files related commands (Bind it to C-x C-f!).
  • helm-buffers-list: Enhanced buffers listing.
  • helm-browse-project: Show all buffers and files related to project or current directory (Usable everywhere with helm-find-files) you will want to install helm-ls-git, helm-ls-hg and helm-ls-svn for a better experience.
  • helm-dabbrev: Enhanced dabbrev with helm completion (Own implementation of dabbrev for helm, don't reuse emacs code).
  • helm-moccur: Enhanced occur for one or more buffers, launch it from helm-buffers-list or current-buffer(Own implementation).
  • helm-M-x: Enhanced version of execute-extended-command (Bind it to M-x!).
  • helm-imenu and helm-imenu-in-all-buffers: Imenu in current-buffer or in all your buffers.
  • helm-etags-select: Enhanced version of etags with helm-completion (Usable everywhere with helm-find-files).
  • helm-apropos: Description of functions, variables, etc... Use it instead of Most C-h commands.
  • Grep: You can launch it (recursively or not) from any files related helm commands, support as backends grep, ack-grep, git-grep, ag and pt (Own implementation).
  • helm-gid: Helm interface to gid from id-utils.
  • helm-show-kill-ring: A kill ring browser for helm.
  • helm-all-mark-rings: A mark ring for helm, allow retrieving your last position(s) in a buffer.
  • helm-filtered-bookmarks: An enhanced bookmark listing.
  • helm-list-elisp-packages: Manage emacs packages with helm.

Helm extensions you should install

Warning You will find many extensions outside of emacs-helm that provide nothing more than what is provided natively by helm and may not be in sync will helm core. So generally prefer what is provided natively in helm instead of its counterpart provided externally. Actually more than 20 unuseful or deprecated packages you can find on MELPA, be aware.

Known issues

Check out the project's issue list a list of unresolved issues. By the way - feel free to fix any of them and send us a pull request. :-)


Here's a list of all the people who have contributed to the development of Helm.

Bugs & Improvements

Bug reports and suggestions for improvements are always welcome, be sure though they are related to helm, many bugs are coming from emacs itself or other packages. GitHub pull requests are even better! :-)

NOTE: When trying if something is working or not, be sure to start helm from Emacs -Q or even better Start it from your helm directory with ./

Getting help

If Helm Wiki is not enough, you can ask for help on emacs-helm google group.

The Helm Team

Something went wrong with that request. Please try again.