In Emacs default, <tab> narrows selections in the minibuffer. Typing more keys
followed by <tab> keeps narrowing the selections in the minibuffer. At
anytime, hitting <enter> selects the item from the minibuffer. All the
interactivity happens in the minibuffer.

In Helm, on the other-hand, all the interactivity happens in the completion
window (and not in the minibuffer). The action takes place at currently
highlighted item in the completion window. Typing new keystrokes narrows the
completion window. Finish typing until the desired item is highlighted or
navigate to it using <C-n>. Hitting <enter> at anytime selects the
highlighted item from the completion window.

How do you install and use Helm?

Installing is as easy as installing the base package:

(package-refresh-contents)(package-install 'helm)

Then you can use pieces of helm piecemeal, or enable the entire thing with:

(require 'helm-config)
M-x helm-mode

Note that helm-mode only enables helm for places where Emacs would use
completion already, it doesn't automatically use it everywhere.

For example though, if you only wanted to use helm-M-x instead of the regular
M-x bindings, you would do:

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

I only want to play around with it!

If you don't want to install it and change your settings, you can try out helm
by using the nice emacs-helm.sh script in the helm repo:

Let's use TAB to "execute persistent actions", which changes depending on what
type of helm buffer is open. For example, with helm-find-files it shows the
file, for helm-buffers it shows the buffer. For helm-apropos it shows the
*help* buffer for a symbol.

(define-key helm-map (kbd "<tab>")'helm-execute-persistent-action);; make TAB works in terminal, C-i is tha same as TAB(define-key helm-map (kbd "C-i")'helm-execute-persistent-action)

When a helm buffer is open, we can see what we can actually do with the thing
using C-z

(define-key helm-map (kbd "C-z")'helm-select-action)

There are some nice navigation settings:

;; open helm buffer inside current window, don't occupy the entire other window(setq helm-split-window-in-side-p t);; move to end or beginning of source when reaching top or bottom of source.(setq helm-move-to-line-cycle-in-source t)

I also recommend you set up "helm-resume", which resumes your last helm session
(great for searching)

(global-set-key (kbd "C-M-z")#'helm-resume)

Things you can do in all helm buffers

There are a few things that are common to almost all helm buffers.

Hitting C-h m while helm is open will open the "help" page for that particular
helm command.

C-! will suspend helm's updating until you hit it a second time. This is
useful if you have something like.

Wherever the cursor was when you invoked helm, if you want to "slurp" the word
into the helm completion, you can hit C-w, this is useful when you want to
search things for the symbol at point for instance.

A word about "fuzziness"

While helm is "strict" matching by default, you can configure certain parts of
it to be fuzzy, if you want, here's the configuration I use for fuzziness:

helm-occur

Helm-occur shows the occurrences of some text in the page, you can then hit
TAB to show the occurrence, or hit RET to jump to it.

helm-apropos

One of the most helpful ways to find commands, functions, and variables in
Emacs. I bind mine to C-h a. If you are hovering over a command you can hit
TAB to show the documentation for it without leaving helm.

helm-man-woman

Look up man pages from helm, super useful, I recommend C-h m

helm-info-emacs

Search through the Emacs manual with helm! I bind this to C-h r

helm-show-kill-ring

Shows the contents of your kill ring, really great for things you copied a few
copies ago and want to use. I bind mine to M-y.

helm-all-mark-rings

If you use Emacs marks for popping and pushing, you can look through your
buffer-local and global mark rings with this. I usually bind mind to C-h SPC

helm-semantic-or-imenu

Imenu is a really cool feature, and semantic kicks it up a notch depending on
the type of file you're in, for example, an org-mode file shows imenu

While a .java file shows the semantic overview

If you hit TAB for any it shows you the result without moving there, great way
to see what it looks like without "picking" it.

helm-world-time

Finally, because I work at an all-remote company, I frequently need to know what
time it is other places, so I do something like

;; List of times to show in helm-world-time(setq display-time-world-list '(("PST8PDT""Los Altos")("America/Denver""Denver")("EST5EDT""Boston")("UTC""UTC")("Europe/London""London")("Europe/Amsterdam""Amsterdam")("Asia/Bangkok""Bangkok")("Asia/Tokyo""Tokyo")("Australia/Sydney""Sydney")))

Then, helm-world-times, which I bind to C-h t shows

helm-locate

Helm-locate runs the locate command on OSX/Linux machines and makes the files
found candidates.

Neat Helm extensions and packages

There are a bunch of helm extensions, here are some of the most useful:

This gives a nice overview of files that have different git "statuses" for them,
I usually bind this to C-x C-d. It can be used as a poor-mans helm-projectile
in git repos (there's one for mercurial too).

Writing a custom Helm source/input

Helm isn't just for the built in things, you can define your own helm input
pretty easily.