summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.dir-locals.el8
-rw-r--r--.github/FUNDING.yml5
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.md42
-rw-r--r--.github/ISSUE_TEMPLATE/config.yml1
-rw-r--r--.github/issue_template.md33
-rw-r--r--.gitignore4
-rw-r--r--Makefile93
-rw-r--r--debian/changelog14
-rw-r--r--debian/control7
-rw-r--r--debian/elpa-helm.docs2
-rw-r--r--debian/elpa-helm.links1
-rw-r--r--debian/elpa-helm.lintian-overrides2
-rw-r--r--debian/patches/0004-patch-emacs-helm-sh.patch2
-rw-r--r--debian/patches/helm-easymenu.el-autoload-the-easy-menu-add-item-call.patch2
-rw-r--r--debian/patches/patch-the-new-docs-build-for-Debian.patch40
-rw-r--r--debian/patches/patch-upstream-s-.gitignore-for-Debian.patch6
-rw-r--r--debian/patches/series1
-rwxr-xr-xdebian/rules4
-rw-r--r--doc/doc-setup.org38
-rw-r--r--doc/helm-M-x-class.plantuml29
-rw-r--r--doc/helm-absolute-time-timers-class.plantuml25
-rw-r--r--doc/helm-bookmark-find-files-class.plantuml35
-rw-r--r--doc/helm-bookmark-override-inheritor.plantuml14
-rw-r--r--doc/helm-browse-project-override-inheritor.plantuml16
-rw-r--r--doc/helm-browse-project-source.plantuml40
-rw-r--r--doc/helm-bugs.org79
-rw-r--r--doc/helm-classes.org6524
-rw-r--r--doc/helm-classes.plantuml164
-rw-r--r--doc/helm-devel.org495
-rw-r--r--doc/helm-epa.plantuml24
-rw-r--r--doc/helm-esh-source.plantuml26
-rw-r--r--doc/helm-eshell-history-source.plantuml27
-rw-r--r--doc/helm-fd-class.plantuml23
-rw-r--r--doc/helm-figures/helm-M-x-class.pngbin0 -> 23357 bytes
-rw-r--r--doc/helm-figures/helm-M-x-class.svg49
-rw-r--r--doc/helm-figures/helm-M-x.pngbin0 -> 109306 bytes
-rw-r--r--doc/helm-figures/helm-absolute-time-timers-class.pngbin0 -> 22954 bytes
-rw-r--r--doc/helm-figures/helm-absolute-time-timers-class.svg45
-rw-r--r--doc/helm-figures/helm-bookmark-find-files-class.pngbin0 -> 35449 bytes
-rw-r--r--doc/helm-figures/helm-bookmark-find-files-class.svg60
-rw-r--r--doc/helm-figures/helm-bookmark-override-inheritor.pngbin0 -> 17276 bytes
-rw-r--r--doc/helm-figures/helm-bookmark-override-inheritor.svg31
-rw-r--r--doc/helm-figures/helm-browse-project-override-inheritor.pngbin0 -> 21655 bytes
-rw-r--r--doc/helm-figures/helm-browse-project-override-inheritor.svg35
-rw-r--r--doc/helm-figures/helm-browse-project-source.pngbin0 -> 35539 bytes
-rw-r--r--doc/helm-figures/helm-browse-project-source.svg62
-rw-r--r--doc/helm-figures/helm-classes.pngbin0 -> 210405 bytes
-rw-r--r--doc/helm-figures/helm-classes.svg280
-rw-r--r--doc/helm-figures/helm-epa.pngbin0 -> 18562 bytes
-rw-r--r--doc/helm-figures/helm-epa.svg41
-rw-r--r--doc/helm-figures/helm-esh-source.pngbin0 -> 19610 bytes
-rw-r--r--doc/helm-figures/helm-esh-source.svg43
-rw-r--r--doc/helm-figures/helm-eshell-history-source.pngbin0 -> 21656 bytes
-rw-r--r--doc/helm-figures/helm-eshell-history-source.svg44
-rw-r--r--doc/helm-figures/helm-fd-class.pngbin0 -> 17430 bytes
-rw-r--r--doc/helm-figures/helm-fd-class.svg40
-rw-r--r--doc/helm-figures/helm-file-cache.pngbin0 -> 21199 bytes
-rw-r--r--doc/helm-figures/helm-file-cache.svg48
-rw-r--r--doc/helm-figures/helm-files-dired-source.pngbin0 -> 20177 bytes
-rw-r--r--doc/helm-figures/helm-files-dired-source.svg43
-rw-r--r--doc/helm-figures/helm-files-in-current-dir-source.pngbin0 -> 22544 bytes
-rw-r--r--doc/helm-figures/helm-files-in-current-dir-source.svg46
-rw-r--r--doc/helm-figures/helm-gid-source.pngbin0 -> 19170 bytes
-rw-r--r--doc/helm-figures/helm-gid-source.svg43
-rw-r--r--doc/helm-figures/helm-grep-ag-class.pngbin0 -> 19781 bytes
-rw-r--r--doc/helm-figures/helm-grep-ag-class.svg45
-rw-r--r--doc/helm-figures/helm-grep-class.pngbin0 -> 20922 bytes
-rw-r--r--doc/helm-figures/helm-grep-class.svg49
-rw-r--r--doc/helm-figures/helm-idle-time-timers-class.pngbin0 -> 22192 bytes
-rw-r--r--doc/helm-figures/helm-idle-time-timers-class.svg45
-rw-r--r--doc/helm-figures/helm-imenu-source.pngbin0 -> 17460 bytes
-rw-r--r--doc/helm-figures/helm-imenu-source.svg41
-rw-r--r--doc/helm-figures/helm-info-source.pngbin0 -> 16013 bytes
-rw-r--r--doc/helm-figures/helm-info-source.svg37
-rw-r--r--doc/helm-figures/helm-list-el-package-source.pngbin0 -> 20816 bytes
-rw-r--r--doc/helm-figures/helm-list-el-package-source.svg42
-rw-r--r--doc/helm-figures/helm-locate-override-inheritor.pngbin0 -> 19435 bytes
-rw-r--r--doc/helm-figures/helm-locate-override-inheritor.svg35
-rw-r--r--doc/helm-figures/helm-locate-source.pngbin0 -> 28352 bytes
-rw-r--r--doc/helm-figures/helm-locate-source.svg52
-rw-r--r--doc/helm-figures/helm-locate-subdirs-source.pngbin0 -> 17177 bytes
-rw-r--r--doc/helm-figures/helm-locate-subdirs-source.svg36
-rw-r--r--doc/helm-figures/helm-mac-spotlight-source.pngbin0 -> 22635 bytes
-rw-r--r--doc/helm-figures/helm-mac-spotlight-source.svg42
-rw-r--r--doc/helm-figures/helm-moccur-class.pngbin0 -> 15257 bytes
-rw-r--r--doc/helm-figures/helm-moccur-class.svg34
-rw-r--r--doc/helm-figures/helm-recentf-source.pngbin0 -> 21315 bytes
-rw-r--r--doc/helm-figures/helm-recentf-source.svg47
-rw-r--r--doc/helm-figures/helm-semantic-source.pngbin0 -> 17430 bytes
-rw-r--r--doc/helm-figures/helm-semantic-source.svg39
-rw-r--r--doc/helm-figures/helm-source-async.pngbin0 -> 37460 bytes
-rw-r--r--doc/helm-figures/helm-source-async.svg55
-rw-r--r--doc/helm-figures/helm-source-basic-bookmarks.pngbin0 -> 25471 bytes
-rw-r--r--doc/helm-figures/helm-source-basic-bookmarks.svg49
-rw-r--r--doc/helm-figures/helm-source-buffers.pngbin0 -> 24976 bytes
-rw-r--r--doc/helm-figures/helm-source-buffers.svg53
-rw-r--r--doc/helm-figures/helm-source-dummy.pngbin0 -> 14277 bytes
-rw-r--r--doc/helm-figures/helm-source-dummy.svg34
-rw-r--r--doc/helm-figures/helm-source-ffiles.pngbin0 -> 22148 bytes
-rw-r--r--doc/helm-figures/helm-source-ffiles.svg53
-rw-r--r--doc/helm-figures/helm-source-filtered-bookmarks.pngbin0 -> 29566 bytes
-rw-r--r--doc/helm-figures/helm-source-filtered-bookmarks.svg52
-rw-r--r--doc/helm-figures/helm-source-in-buffer.pngbin0 -> 65819 bytes
-rw-r--r--doc/helm-figures/helm-source-in-buffer.svg74
-rw-r--r--doc/helm-figures/helm-source-in-file.pngbin0 -> 19409 bytes
-rw-r--r--doc/helm-figures/helm-source-in-file.svg42
-rw-r--r--doc/helm-figures/helm-source-session-class.pngbin0 -> 17102 bytes
-rw-r--r--doc/helm-figures/helm-source-session-class.svg36
-rw-r--r--doc/helm-figures/helm-source-sync.pngbin0 -> 74071 bytes
-rw-r--r--doc/helm-figures/helm-source-sync.svg78
-rw-r--r--doc/helm-figures/helm-source.pngbin0 -> 95044 bytes
-rw-r--r--doc/helm-figures/helm-source.svg107
-rw-r--r--doc/helm-figures/helm-type-bookmark.pngbin0 -> 22665 bytes
-rw-r--r--doc/helm-figures/helm-type-bookmark.svg39
-rw-r--r--doc/helm-figures/helm-type-buffer.pngbin0 -> 16837 bytes
-rw-r--r--doc/helm-figures/helm-type-buffer.svg34
-rw-r--r--doc/helm-figures/helm-type-command.pngbin0 -> 17726 bytes
-rw-r--r--doc/helm-figures/helm-type-command.svg36
-rw-r--r--doc/helm-figures/helm-type-file.pngbin0 -> 39813 bytes
-rw-r--r--doc/helm-figures/helm-type-file.svg54
-rw-r--r--doc/helm-figures/helm-type-function.pngbin0 -> 14828 bytes
-rw-r--r--doc/helm-figures/helm-type-function.svg33
-rw-r--r--doc/helm-figures/helm-type-timers.pngbin0 -> 21415 bytes
-rw-r--r--doc/helm-figures/helm-type-timers.svg39
-rw-r--r--doc/helm-file-cache.plantuml28
-rw-r--r--doc/helm-files-dired-source.plantuml23
-rw-r--r--doc/helm-files-in-current-dir-source.plantuml26
-rw-r--r--doc/helm-gid-source.plantuml26
-rw-r--r--doc/helm-grep-ag-class.plantuml28
-rw-r--r--doc/helm-grep-class.plantuml32
-rw-r--r--doc/helm-idle-time-timers-class.plantuml25
-rw-r--r--doc/helm-imenu-source.plantuml24
-rw-r--r--doc/helm-info-source.plantuml20
-rw-r--r--doc/helm-list-el-package-source.plantuml25
-rw-r--r--doc/helm-locate-override-inheritor.plantuml16
-rw-r--r--doc/helm-locate-source.plantuml30
-rw-r--r--doc/helm-locate-subdirs-source.plantuml19
-rw-r--r--doc/helm-mac-spotlight-source.plantuml22
-rw-r--r--doc/helm-manual-1.org935
-rw-r--r--doc/helm-manual.org3358
-rw-r--r--doc/helm-moccur-class.plantuml17
-rw-r--r--doc/helm-recentf-source.plantuml27
-rw-r--r--doc/helm-semantic-source.plantuml22
-rw-r--r--doc/helm-source-async.plantuml28
-rw-r--r--doc/helm-source-basic-bookmarks.plantuml29
-rw-r--r--doc/helm-source-buffers.plantuml33
-rw-r--r--doc/helm-source-dummy.plantuml19
-rw-r--r--doc/helm-source-ffiles.plantuml36
-rw-r--r--doc/helm-source-filtered-bookmarks.plantuml30
-rw-r--r--doc/helm-source-in-buffer.plantuml39
-rw-r--r--doc/helm-source-in-file.plantuml25
-rw-r--r--doc/helm-source-session-class.plantuml19
-rw-r--r--doc/helm-source-sync.plantuml37
-rw-r--r--doc/helm-source.plantuml72
-rw-r--r--doc/helm-type-bookmark.plantuml20
-rw-r--r--doc/helm-type-buffer.plantuml17
-rw-r--r--doc/helm-type-command.plantuml19
-rw-r--r--doc/helm-type-file.plantuml25
-rw-r--r--doc/helm-type-function.plantuml18
-rw-r--r--doc/helm-type-timers.plantuml20
-rw-r--r--doc/helm.org14243
-rw-r--r--doc/ox-texinfo+.el20
-rwxr-xr-xemacs-helm.sh2
-rw-r--r--helm-adaptive.el8
-rw-r--r--helm-bookmark.el14
-rw-r--r--helm-buffers.el73
-rw-r--r--helm-color.el11
-rw-r--r--helm-comint.el8
-rw-r--r--helm-command.el77
-rw-r--r--helm-config.el8
-rw-r--r--helm-core-pkg.el2
-rw-r--r--helm-dabbrev.el8
-rw-r--r--helm-easymenu.el8
-rw-r--r--helm-elisp-package.el2
-rw-r--r--helm-elisp.el18
-rw-r--r--helm-epa.el254
-rw-r--r--helm-eshell.el29
-rw-r--r--helm-eval.el18
-rw-r--r--helm-external.el8
-rw-r--r--helm-fd.el24
-rw-r--r--helm-files.el1035
-rw-r--r--helm-find.el8
-rw-r--r--helm-font.el16
-rw-r--r--helm-for-files.el12
-rw-r--r--helm-global-bindings.el8
-rw-r--r--helm-grep.el28
-rw-r--r--helm-help.el842
-rw-r--r--helm-id-utils.el10
-rw-r--r--helm-imenu.el14
-rw-r--r--helm-info.el16
-rw-r--r--helm-lib.el103
-rw-r--r--helm-locate.el18
-rw-r--r--helm-man.el8
-rw-r--r--helm-misc.el199
-rw-r--r--helm-mode.el134
-rw-r--r--helm-multi-match.el12
-rw-r--r--helm-net.el16
-rw-r--r--helm-occur.el115
-rw-r--r--helm-pkg.el4
-rw-r--r--helm-regexp.el8
-rw-r--r--helm-ring.el48
-rw-r--r--helm-semantic.el8
-rw-r--r--helm-shell.el8
-rw-r--r--helm-source.el114
-rw-r--r--helm-sys.el12
-rw-r--r--helm-tags.el8
-rw-r--r--helm-types.el51
-rw-r--r--helm-utils.el36
-rw-r--r--helm-x-files.el12
-rw-r--r--helm.el603
210 files changed, 31904 insertions, 1774 deletions
diff --git a/.dir-locals.el b/.dir-locals.el
new file mode 100644
index 00000000..d5693d6f
--- /dev/null
+++ b/.dir-locals.el
@@ -0,0 +1,8 @@
+;;; Directory Local Variables
+;;; For more information see (info "(emacs) Directory Variables")
+
+((nil . ((bug-reference-bug-regexp . "\\([Ii]ssue ?#?\\|[Bb]ug ?#?\\|[Pp]atch ?#\\|RFE ?#\\|PR [a-z+-]+/\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)")
+ (bug-reference-url-format . "https://github.com/emacs-helm/helm/issues/%s")
+ (byte-compile-warnings . (not obsolete not docstrings))))
+ (emacs-lisp-mode . ((mode . bug-reference-prog)
+ (indent-tabs-mode . nil))))
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 00000000..0cd38adb
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,5 @@
+# These are supported funding model platforms
+
+# github: thierryvolpiatto
+custom: "https://www.paypal.me/tvolpiatto"
+liberapay: thierryvolpiatto
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index cf079efb..bf7174f9 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -7,24 +7,19 @@ assignees: ''
---
-## Expected behavior
-
-## Actual behavior (from `emacs-helm.sh` if possible, see note at the bottom)
-
-## Steps to reproduce (recipe)
-
-## Backtraces if any (`M-x toggle-debug-on-error`)
+# Important! Before filing an issue, please consider the following:
-## Describe versions of Helm, Emacs, operating system, etc.
+ * Try to find if your bug is not already reported.
-## Are you using `emacs-helm.sh` to reproduce this bug? (yes/no):
+ * If you are using a preconfigured Emacs (Spacemacs, Doom etc...) \
+ reproduce your bug out of this environment (see note below).
-## Are you using Spacemacs? (yes/no):
+ * Please follow the below template.
-## IMPORTANT NOTE
+ Thanks!
-Helm provides a script named `emacs-helm.sh` which runs Helm in a neutral
-environment: no other packages and only minimal settings.
+NOTE:
+Helm provides a script named `emacs-helm.sh` which runs Helm in a neutral environment.
When possible, use it to reproduce your Helm issue to ensure no other package is
interfering.
@@ -32,4 +27,23 @@ interfering.
To run it, simply switch to the directory where Helm is installed and call `./emacs-helm.sh`.
If necessary you can specify emacs executable path on command line with "-P" option.
-Thanks.
+For people using straight to manage their packages you have to specify
+the path to you emacs-async installation:
+
+cd ~/.emacs.d/straight/repos/helm
+EMACSLOADPATH="../emacs-async:" ./emacs-helm.sh
+
+
+
+## Expected behavior
+
+## Actual behavior (from `emacs-helm.sh` if possible, see note above)
+
+## Steps to reproduce (recipe)
+
+## Backtraces if any (`M-x toggle-debug-on-error`)
+
+## Describe versions of Helm, Emacs, operating system, etc.
+
+## Are you using `emacs-helm.sh` to reproduce this bug? (yes/no):
+
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 00000000..3ba13e0c
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1 @@
+blank_issues_enabled: false
diff --git a/.github/issue_template.md b/.github/issue_template.md
deleted file mode 100644
index 0d5e3af2..00000000
--- a/.github/issue_template.md
+++ /dev/null
@@ -1,33 +0,0 @@
-## Expected behavior
-
-## Actual behavior (from `emacs-helm.sh` if possible, see note at the bottom)
-
-## Steps to reproduce (recipe)
-
-## Backtraces if any (`M-x toggle-debug-on-error`)
-
-## Describe versions of Helm, Emacs, operating system, etc.
-
-## Are you using `emacs-helm.sh` to reproduce this bug? (yes/no):
-
-## Are you using Spacemacs? (yes/no):
-
-## IMPORTANT NOTE
-
-Helm provides a script named `emacs-helm.sh` which runs Helm in a neutral
-environment: no other packages and only minimal settings.
-
-When possible, use it to reproduce your Helm issue to ensure no other package is
-interfering.
-
-To run it, simply switch to the directory where Helm is installed and
-call `./emacs-helm.sh`. If necessary you can specify emacs executable
-path on command line with "-P" option. For people using straight to
-manage their packages you have to specify the path to you emacs-async
-installation:
-
-cd ~/.emacs.d/straight/repos/helm
-EMACSLOADPATH="../emacs-async:" ./emacs-helm.sh
-
-
-Thanks.
diff --git a/.gitignore b/.gitignore
index 9b2dfd81..709b2231 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,9 @@
*.elc
Home.md
+*.info
+*.html
+ox-texinfo.el
TAGS
helm-autoloads.el
ID
+doc/*
diff --git a/Makefile b/Makefile
index accc8baf..9149a902 100644
--- a/Makefile
+++ b/Makefile
@@ -66,11 +66,64 @@ EL := $(sort $(wildcard helm*.el))
# Compiled files
ELC := $(EL:.el=.elc)
+# How to make a pdf file from a texinfo file
+TEXI2PDF = texi2pdf --batch --clean --expand
-.PHONY: clean autoloads batch-compile
+# How to make a pdf file from a tex file
+PDFTEX = pdftex
+
+# How to create directories with leading path components
+MKDIR = mkdir -m 755 -p # try this if you have no install
+# MKDIR = install -m 755 -d
+
+# How to create the info files from the texinfo file
+MAKEINFO = makeinfo
+
+# How to create the HTML file
+TEXI2HTML = makeinfo --html --number-sections --css-ref "https://www.gnu.org/software/emacs/manual.css"
+
+# Name of the program to install info files
+# INSTALL_INFO = ginstall-info # Debian: avoid harmless warning message
+INSTALL_INFO = install-info
+
+ORGFILES := doc/helm-bugs.org doc/helm-devel.org doc/helm-manual-1.org doc/helm-manual.org doc/helm.org doc/helm-classes.org
+TEXIFILES := $(ORGFILES:.org=.texi)
+INFOFILES := $(ORGFILES:.org=.info)
+HTMLFILES := $(ORGFILES:.org=.html)
+PDFFILES := $(ORGFILES:.org=.pdf)
+
+.PHONY: clean autoloads batch-compile clean-doc
all: clean autoloads batch-compile
+doc: info
+doc: html
+# doc: pdf
+
+pdf: $(PDFFILES)
+html: $(HTMLFILES)
+info: $(INFOFILES)
+texi: $(TEXIFILES)
+
+%.texi: %.org
+ $(EMACS) -f package-initialize \
+ -l ox-texinfo+ -l doc/ox-texinfo+.el \
+ --file=$< --eval '(org-texinfo-export-to-texinfo+)'
+
+%.info: %.texi
+ $(MAKEINFO) --no-split $< -o $@
+
+# the following two lines work around a bug in some versions of texi2dvi
+%.pdf: LC_ALL=C
+%.pdf: LANG=C
+%.pdf: %.texi
+ $(TEXI2PDF) $<
+%.pdf: %.tex
+ PDFLATEX=$(PDFTEX) $(TEXI2PDF) $<
+
+%.html: %.texi
+ $(TEXI2HTML) --no-split -o $@ $<
+
$(ELC): %.elc: %.el
$(EMACS) $(LOADPATH) -f batch-byte-compile $<
@@ -82,7 +135,11 @@ batch-compile:
$(EMACS) $(LOADPATH) -f batch-byte-compile $(EL)
# Remove all generated files
-clean:
+clean-doc:
+ rm -f doc/ox-texinfo.el $(TEXIFILES) $(INFOFILES) $(HTMLFILES) $(PDFFILES)
+
+clean : clean-doc
+clean: clean-doc
rm -f $(ELC)
# Make autoloads file
@@ -93,6 +150,20 @@ autoloads:
PREFIX=/usr/local/
BIN=${PREFIX}bin/
DESTDIR=${PREFIX}share/emacs/site-lisp/helm/
+
+# On Debian, paths in `Info-default-directory-list' are in the order
+# as below:
+
+# INFODIR = /usr/local/share/info
+# INFODIR = /usr/local/info
+INFODIR = /usr/share/info
+# INFODIR = /usr/local/share/info
+
+# /usr/share/info is where Debian puts the info file for EMMS. So,
+# just mimic it.
+
+# For non-standard value of INFODIR, see `Info-directory-list'.
+
install:
test -d ${DESTDIR} || mkdir ${DESTDIR}
rm -f ${DESTDIR}*.el
@@ -107,3 +178,21 @@ uninstall:
rm -vf ${DESTDIR}*.el
rm -vf ${DESTDIR}emacs-helm.sh
rm -vf ${BIN}helm
+
+$(DESTDIR)$(infodir)/%.info: doc/%.info
+
+install-info: $(INFOFILES)
+ if [ ! -d $(INFODIR) ]; then $(MKDIR) $(INFODIR); else true; fi ;
+ if [ ! -d $(INFODIR)/helm-figures ]; then $(MKDIR) $(INFODIR)/helm-figures; else true; fi ;
+ cp -r doc/helm-figures $(INFODIR);
+ for f in $(INFOFILES:doc/%=%) ; do \
+ cp doc/$$f $(INFODIR); \
+ $(INSTALL_INFO) --info-dir=$(INFODIR) $(INFODIR)/$$f; \
+ done
+
+clean-install-info:
+ $(RM) -r $(INFODIR)/helm-figures;
+ for f in $(INFOFILES:doc/%=%) ; do \
+ $(INSTALL_INFO) --remove --info-dir=$(INFODIR) --remove $(INFODIR)/$$f; \
+ $(RM) $(INFODIR)/$$f; \
+ done
diff --git a/debian/changelog b/debian/changelog
index 9ace61b8..3ec04989 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,17 @@
+helm (3.8.0-1) unstable; urgency=medium
+
+ * Update to new upstream version 3.8.0.
+ * Patch new docs build in Makefile for Debian.
+ * Build and install new HTML and info docs.
+ - Add d/elpa-helm.links.
+ - Drop d/elpa-helm.docs.
+ - Build the docs in override_dh_auto_build.
+ - Install the docs in override_dh_auto_install.
+ - Add build-deps on elpa-org >= 9.5.2, elpa-ox-texinfo+ and texinfo.
+ * Override Lintian tag info-document-not-compressed for helm-figures symlink.
+
+ -- Sean Whitton <spwhitton@spwhitton.name> Mon, 27 Dec 2021 12:56:20 -0700
+
helm (3.7.0-2) unstable; urgency=medium
* Team upload
diff --git a/debian/control b/debian/control
index 37d533c3..54cc41a8 100644
--- a/debian/control
+++ b/debian/control
@@ -3,7 +3,12 @@ Section: lisp
Priority: optional
Maintainer: Debian Emacsen team <debian-emacsen@lists.debian.org>
Uploaders: Sean Whitton <spwhitton@spwhitton.name>
-Build-Depends: debhelper (>= 10), dh-elpa (>= 0.0.18)
+Build-Depends:
+ debhelper (>= 10),
+ dh-elpa (>= 0.0.18),
+ elpa-org (>= 9.5.2),
+ elpa-ox-texinfo+,
+ texinfo,
Standards-Version: 4.1.1
Homepage: https://emacs-helm.github.io/helm/
Vcs-Git: https://salsa.debian.org/emacsen-team/helm.git/
diff --git a/debian/elpa-helm.docs b/debian/elpa-helm.docs
deleted file mode 100644
index f8767e13..00000000
--- a/debian/elpa-helm.docs
+++ /dev/null
@@ -1,2 +0,0 @@
-README.md
-images/helm-grep-ag-persistent.png
diff --git a/debian/elpa-helm.links b/debian/elpa-helm.links
new file mode 100644
index 00000000..e14db22b
--- /dev/null
+++ b/debian/elpa-helm.links
@@ -0,0 +1 @@
+/usr/share/doc/elpa-helm/html /usr/share/info/helm-figures
diff --git a/debian/elpa-helm.lintian-overrides b/debian/elpa-helm.lintian-overrides
new file mode 100644
index 00000000..90fd4d69
--- /dev/null
+++ b/debian/elpa-helm.lintian-overrides
@@ -0,0 +1,2 @@
+# it's not a document
+info-document-not-compressed usr/share/info/helm-figures
diff --git a/debian/patches/0004-patch-emacs-helm-sh.patch b/debian/patches/0004-patch-emacs-helm-sh.patch
index 0fc98ea1..64a0d946 100644
--- a/debian/patches/0004-patch-emacs-helm-sh.patch
+++ b/debian/patches/0004-patch-emacs-helm-sh.patch
@@ -7,7 +7,7 @@ Subject: patch emacs-helm.sh for Debian
1 file changed, 1 insertion(+), 24 deletions(-)
diff --git a/emacs-helm.sh b/emacs-helm.sh
-index 5f9afc9..5120658 100755
+index 9c41716..c6514ab 100755
--- a/emacs-helm.sh
+++ b/emacs-helm.sh
@@ -135,22 +135,6 @@ done
diff --git a/debian/patches/helm-easymenu.el-autoload-the-easy-menu-add-item-call.patch b/debian/patches/helm-easymenu.el-autoload-the-easy-menu-add-item-call.patch
index 421c1a5e..23cf1541 100644
--- a/debian/patches/helm-easymenu.el-autoload-the-easy-menu-add-item-call.patch
+++ b/debian/patches/helm-easymenu.el-autoload-the-easy-menu-add-item-call.patch
@@ -12,7 +12,7 @@ Reported-by: Aaron M. Ucko <ucko@debian.org>
1 file changed, 1 insertion(+)
diff --git a/helm-easymenu.el b/helm-easymenu.el
-index 8785412..f0b26c3 100644
+index c30bc05..4156555 100644
--- a/helm-easymenu.el
+++ b/helm-easymenu.el
@@ -19,6 +19,7 @@
diff --git a/debian/patches/patch-the-new-docs-build-for-Debian.patch b/debian/patches/patch-the-new-docs-build-for-Debian.patch
new file mode 100644
index 00000000..d3ce6260
--- /dev/null
+++ b/debian/patches/patch-the-new-docs-build-for-Debian.patch
@@ -0,0 +1,40 @@
+From: Sean Whitton <spwhitton@spwhitton.name>
+Date: Mon, 27 Dec 2021 11:00:18 -0700
+Subject: patch the new docs build for Debian
+
+---
+ Makefile | 13 +++----------
+ 1 file changed, 3 insertions(+), 10 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 9cf52b4..9149a90 100644
+--- a/Makefile
++++ b/Makefile
+@@ -96,7 +96,6 @@ PDFFILES := $(ORGFILES:.org=.pdf)
+
+ all: clean autoloads batch-compile
+
+-doc: doc/ox-texinfo.el
+ doc: info
+ doc: html
+ # doc: pdf
+@@ -106,16 +105,10 @@ html: $(HTMLFILES)
+ info: $(INFOFILES)
+ texi: $(TEXIFILES)
+
+-$(TEXIFILES): | doc/ox-texinfo.el
+-
+-doc/ox-texinfo.el:
+- wget https://code.orgmode.org/bzg/org-mode/raw/maint/lisp/ox-texinfo.el -O $@
+- # test -f doc/ox-texinfo.el || wget https://code.orgmode.org/bzg/org-mode/raw/maint/lisp/ox-texinfo.el -O $@
+-
+-%.texi: doc/ox-texinfo.el
+-
+ %.texi: %.org
+- $(EMACS) $(LOADPATH) -l doc/ox-texinfo.el -l doc/ox-texinfo+.el --file=$< --eval '(org-texinfo-export-to-texinfo+)'
++ $(EMACS) -f package-initialize \
++ -l ox-texinfo+ -l doc/ox-texinfo+.el \
++ --file=$< --eval '(org-texinfo-export-to-texinfo+)'
+
+ %.info: %.texi
+ $(MAKEINFO) --no-split $< -o $@
diff --git a/debian/patches/patch-upstream-s-.gitignore-for-Debian.patch b/debian/patches/patch-upstream-s-.gitignore-for-Debian.patch
index 9d8b887b..074536d2 100644
--- a/debian/patches/patch-upstream-s-.gitignore-for-Debian.patch
+++ b/debian/patches/patch-upstream-s-.gitignore-for-Debian.patch
@@ -11,7 +11,7 @@ dgit and git-debrebase break if debian/patches is ignored by
1 file changed, 3 deletions(-)
diff --git a/.gitignore b/.gitignore
-index 9860044..9b2dfd8 100644
+index 85e53f4..709b223 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,4 @@
@@ -20,5 +20,5 @@ index 9860044..9b2dfd8 100644
-*.patch
-*.diff
Home.md
- TAGS
- helm-autoloads.el
+ *.info
+ *.html
diff --git a/debian/patches/series b/debian/patches/series
index 621af4d0..01adc030 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -3,3 +3,4 @@
0004-patch-emacs-helm-sh.patch
patch-upstream-s-.gitignore-for-Debian.patch
helm-easymenu.el-autoload-the-easy-menu-add-item-call.patch
+patch-the-new-docs-build-for-Debian.patch
diff --git a/debian/rules b/debian/rules
index ca47f8c9..b6453321 100755
--- a/debian/rules
+++ b/debian/rules
@@ -4,5 +4,9 @@
dh $@ --with elpa
override_dh_auto_build:
+ make doc
override_dh_auto_install:
+ mkdir -p debian/elpa-helm/usr/share/doc/elpa-helm/html
+ cp doc/*.html doc/helm-figures/*.png \
+ debian/elpa-helm/usr/share/doc/elpa-helm/html
diff --git a/doc/doc-setup.org b/doc/doc-setup.org
new file mode 100644
index 00000000..db7ef349
--- /dev/null
+++ b/doc/doc-setup.org
@@ -0,0 +1,38 @@
+# SETUPFILE for manuals
+
+# XXX: We cannot use TODO keyword as a node starts with "TODO".
+#+todo: REVIEW FIXME | DONE
+#+property: header-args :eval no
+#+startup: overview nologdone
+
+# Use proper quote and backtick for code sections in PDF output
+# Cf. Texinfo manual 14.2
+#+texinfo_header: @set txicodequoteundirected
+#+texinfo_header: @set txicodequotebacktick
+
+# Contact Info
+#+texinfo_header: @set MAINTAINERSITE @uref{https://github.com/thierryvolpiatto webpage}
+#+texinfo_header: @set MAINTAINER Thierry Volpiatto
+#+texinfo_header: @set MAINTAINEREMAIL @email{thierry.volpiatto@gmail.com}
+#+texinfo_header: @set MAINTAINERCONTACT @uref{mailto:thierry.volpiatto@gmail.com,contact the maintainer}
+
+#+options: H:3 num:t toc:t author:t \n:nil ::t |:t ^:nil -:t f:t *:t <:t e:t ':t
+#+options: d:nil todo:nil pri:nil tags:not-in-toc stat:nil broken-links:mark
+#+select_tags: export
+#+exclude_tags: noexport
+
+#+macro: cite @@texinfo:@cite{@@$1@@texinfo:}@@
+#+macro: var @@texinfo:@var{@@$1@@texinfo:}@@
+
+# The "version" macro extracts "Version" keyword from "org.el". It
+# returns major.minor version number. This is sufficient since bugfix
+# releases are not expected to add features and therefore imply manual
+# modifications.
+#+macro: version (eval (with-current-buffer (find-file-noselect "../helm.el") (org-with-point-at 1 (if (re-search-forward "Version: +\\([0-9.]+\\)" nil t) (mapconcat #'identity (cl-subseq (split-string (match-string-no-properties 1) "\\.") 0 3) ".") (error "Missing \"Version\" keyword in \"helm.el\"")))))
+
+# The "kbd" macro turns KBD into @kbd{KBD}. Additionally, it
+# encloses case-sensitive special keys (SPC, RET...) within @key{...}.
+#+macro: kbd (eval (let ((case-fold-search nil) (regexp (regexp-opt '("SPC" "RET" "LFD" "TAB" "BS" "ESC" "DELETE" "SHIFT" "Ctrl" "Meta" "Alt" "Cmd" "Super" "UP" "LEFT" "RIGHT" "DOWN") 'words))) (format "@@texinfo:@kbd{@@%s@@texinfo:}@@" (replace-regexp-in-string regexp "@@texinfo:@key{@@\\&@@texinfo:}@@" $1 t))))
+
+#+macro: samp @@texinfo:@samp{@@$1@@texinfo:}@@
+#+macro: unicode @@texinfo:@U{@@$1@@texinfo:}@@
diff --git a/doc/helm-M-x-class.plantuml b/doc/helm-M-x-class.plantuml
new file mode 100644
index 00000000..a90f96ca
--- /dev/null
+++ b/doc/helm-M-x-class.plantuml
@@ -0,0 +1,29 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-M-x-class'**\n\n
+"helm-source-sync" <|-- "helm-M-x-class"
+"helm-type-command" <|-- "helm-M-x-class"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-type-command"
+"helm-source" <|-- "helm-type-command"
+class "helm-source"
+class "helm-M-x-class" {
+ __ some interesting slots __
+ candidates
+ filtered-candidate-transformer
+ help-message
+ keymap
+ match-dynamic
+ match-strict
+ migemo
+ must-match
+ nomark
+ persistent-help
+}
+note right of "helm-M-x-class"
+ **helm-M-x-class**
+end note
+@enduml
diff --git a/doc/helm-absolute-time-timers-class.plantuml b/doc/helm-absolute-time-timers-class.plantuml
new file mode 100644
index 00000000..8f7cd5ff
--- /dev/null
+++ b/doc/helm-absolute-time-timers-class.plantuml
@@ -0,0 +1,25 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-absolute-time-timers-class'**\n\n
+"helm-source-sync" <|-- "helm-absolute-time-timers-class"
+"helm-type-timers" <|-- "helm-absolute-time-timers-class"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-type-timers"
+"helm-source" <|-- "helm-type-timers"
+class "helm-source"
+class "helm-absolute-time-timers-class" {
+ __ some interesting slots __
+ allow-dups
+ candidate-transformer
+ candidates
+ match-dynamic
+ match-strict
+ migemo
+}
+note right of "helm-absolute-time-timers-class"
+ **helm-absolute-time-timers-class**
+end note
+@enduml
diff --git a/doc/helm-bookmark-find-files-class.plantuml b/doc/helm-bookmark-find-files-class.plantuml
new file mode 100644
index 00000000..571df225
--- /dev/null
+++ b/doc/helm-bookmark-find-files-class.plantuml
@@ -0,0 +1,35 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-bookmark-find-files-class'**\n\n
+"helm-source-filtered-bookmarks" <|-- "helm-bookmark-find-files-class"
+"helm-bookmark-override-inheritor" <|-- "helm-bookmark-find-files-class"
+class "helm-source-filtered-bookmarks"
+"helm-source-in-buffer" <|-- "helm-source-filtered-bookmarks"
+"helm-type-bookmark" <|-- "helm-source-filtered-bookmarks"
+class "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-type-bookmark"
+"helm-source" <|-- "helm-type-bookmark"
+class "helm-source"
+class "helm-bookmark-override-inheritor"
+"helm-source" <|-- "helm-bookmark-override-inheritor"
+class "helm-source"
+class "helm-bookmark-find-files-class" {
+ __ some interesting slots __
+ init
+ candidates
+ data
+ filtered-candidate-transformer
+ get-line
+ match
+ migemo
+ search
+ search-strict
+ volatile
+}
+note right of "helm-bookmark-find-files-class"
+ **helm-bookmark-find-files-class**
+end note
+@enduml
diff --git a/doc/helm-bookmark-override-inheritor.plantuml b/doc/helm-bookmark-override-inheritor.plantuml
new file mode 100644
index 00000000..cf683e6c
--- /dev/null
+++ b/doc/helm-bookmark-override-inheritor.plantuml
@@ -0,0 +1,14 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-bookmark-override-inheritor'**\n\n
+"helm-source" <|-- "helm-bookmark-override-inheritor"
+class "helm-source"
+class "helm-bookmark-override-inheritor" {
+ __ some interesting slots __
+}
+note right of "helm-bookmark-override-inheritor"
+ **helm-bookmark-override-inheritor**
+end note
+"helm-bookmark-override-inheritor" <|-- "helm-bookmark-find-files-class"
+@enduml
diff --git a/doc/helm-browse-project-override-inheritor.plantuml b/doc/helm-browse-project-override-inheritor.plantuml
new file mode 100644
index 00000000..4f99b135
--- /dev/null
+++ b/doc/helm-browse-project-override-inheritor.plantuml
@@ -0,0 +1,16 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-browse-project-override-inheritor'**\n\n
+"helm-type-file" <|-- "helm-browse-project-override-inheritor"
+class "helm-type-file"
+"helm-source" <|-- "helm-type-file"
+class "helm-source"
+class "helm-browse-project-override-inheritor" {
+ __ some interesting slots __
+}
+note right of "helm-browse-project-override-inheritor"
+ **helm-browse-project-override-inheritor**
+end note
+"helm-browse-project-override-inheritor" <|-- "helm-browse-project-source"
+@enduml
diff --git a/doc/helm-browse-project-source.plantuml b/doc/helm-browse-project-source.plantuml
new file mode 100644
index 00000000..1b83defe
--- /dev/null
+++ b/doc/helm-browse-project-source.plantuml
@@ -0,0 +1,40 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-browse-project-source'**\n\n
+"helm-source-in-buffer" <|-- "helm-browse-project-source"
+"helm-browse-project-override-inheritor" <|-- "helm-browse-project-source"
+class "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-browse-project-override-inheritor"
+"helm-type-file" <|-- "helm-browse-project-override-inheritor"
+class "helm-type-file"
+"helm-source" <|-- "helm-type-file"
+class "helm-source"
+class "helm-browse-project-source" {
+ Class to define a source in
+ `helm-browse-project' handling
+ non
+ ==
+ __ some interesting slots __
+ init
+ candidates
+ data
+ filter-one-by-one
+ get-line
+ match
+ match-part
+ migemo
+ root-dir
+ search
+ search-strict
+ volatile
+}
+note right of "helm-browse-project-source"
+ **helm-browse-project-source**:
+ Class to define a source in
+ `helm-browse-project' handling
+ non
+end note
+@enduml
diff --git a/doc/helm-bugs.org b/doc/helm-bugs.org
new file mode 100644
index 00000000..2ca6030b
--- /dev/null
+++ b/doc/helm-bugs.org
@@ -0,0 +1,79 @@
+#+title: How to report Helm Bugs
+# #+subtitle: Release {{{version}}}
+#+subtitle: Release 3.6.2
+#+author: The Helm Developers
+# #+date: {{{modification-time}}}
+#+language: en
+
+# #+texinfo: @insertcopying
+
+** Confirming bugs
+
+To confirm that a bug is, in fact, a Helm problem, it is important to
+/replicate the behavior with a minimal Emacs configuration/. This
+precludes the possibility that the bug is caused by factors outside of
+Helm.
+
+The easiest and recommended way to do so is through the
+=emacs-helm.sh= script.
+
+*** =emacs-helm.sh=
+
+If your system supports it, you should run the =emacs-helm.sh= script
+to start an Emacs instance with minimal, Helm-specific configuration.
+
+This is useful for debugging, and easier than starting Emacs with
+=emacs -Q= and configuring Helm from scratch.
+
+If Helm is installed via MELPA, the =emacs-helm.sh= script should be
+located at =~/.emacs.d/elpa/helm-<version>/emacs-helm.sh=.
+
+Of course you have to cd to your helm directory and run the script
+from there, an alternative is symlinking it to somewhere in your
+=PATH= e.g. "~/bin" (See note at bottom for those that have installed
+from source with =make=).
+
+You can use the -h argument for help:
+
+ : $ helm -h
+ : Usage: helm [-P} Emacs path [-h} help [--] EMACS ARGS
+
+If your emacs binary is not in a standard place i.e. "emacs", you can
+specify the path with "-P".
+
+~Note~: If you have installed Helm from Git and used =make && sudo
+make install= you can run directly =helm= at command line from any
+place i.e. no need to cd to helm directory.
+
+*** =emacs -Q=
+
+If you cannot run the =emacs-helm.sh= script, be sure to reproduce the
+problem with =emacs -Q=, then installing Helm as described in the
+Install section.
+
+** Reporting bugs
+
+To report a bug, [[https://github.com/emacs-helm/helm/issues][open an
+issue]]. Be sure that you've confirmed the bug as described in the
+previous section, and include relevant information for the maintainer
+to identify the bug.
+
+*** Version info
+
+When reporting bugs, it is important to include the Helm version
+number, which can be found in the
+[[https://github.com/emacs-helm/helm/blob/master/helm-pkg.el][helm-pkg.el]]
+file.
+
+* Export Setup :noexport:
+
+#+setupfile: doc-setup.org
+# #+options: H:4
+
+#+export_file_name: helm-bugs.texi
+
+#+texinfo_dir_category: Emacs Add-ons
+#+texinfo_dir_title: Report Helm Bugs: (helm-bugs)
+#+texinfo_dir_desc: Report Helm Bugs
+
+* Footnotes
diff --git a/doc/helm-classes.org b/doc/helm-classes.org
new file mode 100644
index 00000000..2818161a
--- /dev/null
+++ b/doc/helm-classes.org
@@ -0,0 +1,6524 @@
+#+title: The Helm Classes Manual
+# #+subtitle: Release {{{version}}}
+#+subtitle: Release 3.6.2
+#+author: The Helm Classes Developers
+# #+date: {{{modification-time}}}
+#+language: en
+
+# #+texinfo: @insertcopying
+
+#+texinfo: @defindex hc
+
+* Table Of Contents :TOC_4:
+
+* Overview of Helm Classes
+
+[[./helm-figures/helm-classes.png]]
+
+* class: helm-source
+
+Main interface to define helm sources.
+
+[[./helm-figures/helm-source.png]]
+
+#+hcindex: helm-source
+
+#+hcindex: helm-bookmark-override-inheritor
+
+#+hcindex: helm-type-timers
+
+#+hcindex: helm-type-command
+
+#+hcindex: helm-type-function
+
+#+hcindex: helm-type-buffer
+
+#+hcindex: helm-type-bookmark
+
+#+hcindex: helm-type-file
+
+#+hcindex: helm-source-dummy
+
+#+hcindex: helm-source-in-buffer
+
+#+hcindex: helm-source-async
+
+#+hcindex: helm-source-sync
+
+- *parents* ::
+
+- *children* ::
+
+ - [[*class: helm-bookmark-override-inheritor]]
+
+ - [[*class: helm-type-timers]]
+
+ - [[*class: helm-type-command]]
+
+ - [[*class: helm-type-function]]
+
+ - [[*class: helm-type-buffer]]
+
+ - [[*class: helm-type-bookmark]]
+
+ - [[*class: helm-type-file]]
+
+ - [[*class: helm-source-dummy]]
+
+ - [[*class: helm-source-in-buffer]]
+
+ - [[*class: helm-source-async]]
+
+ - [[*class: helm-source-sync]]
+
+This class has following slots.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Function called with no parameters when helm is started.
+ It is useful for collecting current state information which can be
+ used to create the list of candidates later.
+ Initialization of ~candidates-in-buffer~ is done here
+ with ~helm-init-candidates-in-buffer~.
+
+** name
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ The name of the source.
+ A string which is also the heading which appears
+ above the list of matches from the source. Must be unique.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'identity
+
+- :documentation
+
+ An alist of (DISPLAY . FUNCTION) pairs, a variable name or a function.
+ FUNCTION is called with one parameter: the selected candidate.
+
+ An action other than the default can be chosen from this list
+ of actions for the currently selected candidate (by default
+ with TAB). The DISPLAY string is shown in the completions
+ buffer and the FUNCTION is invoked when an action is
+ selected. The first action of the list is the default.
+
+ You should use ~helm-make-actions~ to build this alist easily.
+
+** action-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ It's a function or a list of functions called with two
+ arguments when the action list from the source is
+ assembled. The first argument is the list of actions, the
+ second is the current selection. If it is a list of functions,
+ it calls each function sequentially.
+
+ The function should return a transformed action list.
+
+ This can be used to customize the list of actions based on the
+ currently selected candidate.
+
+** after-init-hook
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ A local hook that run at end of initilization of this source.
+ i.e After the creation of ~helm-buffer~.
+
+ Should be a variable.
+ Can be also an anonymous function or a list of functions
+ directly added to slot, this is not recommended though.
+
+** allow-dups
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Allow helm collecting duplicates candidates.
+
+** before-init-hook
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ A local hook that run at beginning of initilization of this source.
+ i.e Before the creation of ~helm-buffer~.
+
+ Should be a variable (defined with defvar).
+ Can be also an anonymous function or a list of functions
+ directly added to slot, this is not recommended though.
+
+** candidate-number-limit
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Override ~helm-candidate-number-limit~ only for this source.
+
+** candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ It's a function or a list of functions called with one argument
+ when the completion list from the source is built. The argument
+ is the list of candidates retrieved from the source. The
+ function should return a transformed list of candidates which
+ will be used for the actual completion. If it is a list of
+ functions, it calls each function sequentially.
+
+ This can be used to transform or remove items from the list of
+ candidates.
+
+ Note that ~candidates~ is run already, so the given transformer
+ function should also be able to handle candidates with (DISPLAY
+ . REAL) format.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Specifies how to retrieve candidates from the source.
+ It can either be a variable name, a function called with no parameters
+ or the actual list of candidates.
+
+ Do NOT use this for asynchronous sources, use ~candidates-process~
+ instead.
+
+ The list must be a list whose members are strings, symbols
+ or (DISPLAY . REAL) pairs.
+
+ In case of (DISPLAY . REAL) pairs, the DISPLAY string is shown
+ in the Helm buffer, but the REAL one is used as action
+ argument when the candidate is selected. This allows a more
+ readable presentation for candidates which would otherwise be,
+ for example, too long or have a common part shared with other
+ candidates which can be safely replaced with an abbreviated
+ string for display purposes.
+
+ Note that if the (DISPLAY . REAL) form is used then pattern
+ matching is done on the displayed string, not on the real
+ value.
+
+ This function, generally should not compute candidates according to
+ ~helm-pattern~ which defeat all the Helm's matching mechanism
+ i.e. multiple pattern matching and/or fuzzy matching.
+ If you want to do so, use :match-dynamic slot to be sure matching
+ occur only in :candidates function and there is no conflict with
+ other match functions.
+
+** cleanup
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Function called with no parameters when *helm* buffer is
+ closed. It is useful for killing unneeded candidates buffer.
+
+ Note that the function is executed BEFORE performing action.
+
+** coerce
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ It's a function called with one argument: the selected candidate.
+ This function is intended for type convertion. In normal case,
+ the selected candidate (string) is passed to action
+ function. If coerce function is specified, it is called just
+ before action function.
+
+ Example: converting string to symbol
+ (coerce . intern)
+
+** delayed
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ This slot have no more effect and is just kept for backward compatibility.
+ Please don't use it.
+
+** display-to-real
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Transform the selected candidate when passing it to action.
+
+ Function called with one parameter, the selected candidate.
+
+ Avoid recomputing all candidates with candidate-transformer
+ or filtered-candidate-transformer to give a new value to REAL,
+ instead the selected candidate is transformed only when passing it
+ to action.
+ Example:
+
+ (helm :sources (helm-build-sync-source "test"
+ :candidates '(a b c d e)
+ :display-to-real (lambda (c) (concat c ":modified by d-t-r")))
+ :buffer "*helm test*")
+
+ Note that this is NOT a transformer,
+ so the display will not be modified by this function.
+
+** filter-one-by-one
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ A transformer function that treat candidates one by one.
+ It is called with one arg the candidate.
+ It is faster than ~filtered-candidate-transformer~ or
+ ~candidate-transformer~, but should be used only in sources
+ that recompute constantly their candidates, e.g ~helm-source-find-files~.
+ Filtering happen early and candidates are treated
+ one by one instead of re-looping on the whole list.
+ If used with ~filtered-candidate-transformer~ or ~candidate-transformer~
+ these functions should treat the candidates transformed by the
+ ~filter-one-by-one~ function in consequence.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ It has the same format as ~candidate-transformer~, except the
+ function is called with two parameters: the candidate list and
+ the source.
+
+ This transformer is run on the candidate list which is already
+ filtered by the current pattern. While ~candidate-transformer~
+ is run only once, it is run every time the input pattern is
+ changed.
+
+ It can be used to transform the candidate list dynamically, for
+ example, based on the current pattern.
+
+ In some cases it may also be more efficent to perform candidate
+ transformation here, instead of with ~candidate-transformer~
+ even if this transformation is done every time the pattern is
+ changed. For example, if a candidate set is very large then
+ ~candidate-transformer~ transforms every candidate while only
+ some of them will actually be displayed due to the limit
+ imposed by ~helm-candidate-number-limit~.
+
+ Note that ~candidates~ and ~candidate-transformer~ is run
+ already, so the given transformer function should also be able
+ to handle candidates with (DISPLAY . REAL) format.
+
+** follow
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Enable ~helm-follow-mode~ for this source only.
+ With a value of 1 enable, a value of -1 or nil disable the mode.
+ See ~helm-follow-mode~ for more infos.
+
+** follow-delay
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ ~helm-follow-mode~ will execute persistent-action after this delay.
+ Otherwise value of ~helm-follow-input-idle-delay~ is used if non--nil,
+ If none of these are found fallback to ~helm-input-idle-delay~.
+
+** fuzzy-match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Enable fuzzy matching in this source.
+ This will overwrite settings in MATCH slot, and for
+ sources built with child class ~helm-source-in-buffer~ the SEARCH slot.
+ This is an easy way of enabling fuzzy matching, but you can use the MATCH
+ or SEARCH slots yourself if you want something more elaborated, mixing
+ different type of match (See ~helm-source-buffers~ class for example).
+
+ This attribute is not supported for asynchronous sources
+ since they perform pattern matching themselves.
+
+** group
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm
+
+- :documentation
+
+ The current source group, default to ~helm~ when not specified.
+
+** header-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Source local ~header-line-format~.
+ It will be displayed in ~header-line~ or in ~minibuffer~ depending
+ of value of ~helm-echo-input-in-header-line~ and ~helm-display-header-line~.
+ It accepts also variable/function name.
+
+** header-name
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ A function returning the display string of the header.
+ Its argument is the name of the source. This attribute is useful to
+ add an additional information with the source name.
+ It doesn't modify the name of the source.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Help message for this source.
+ If not present, ~helm-help-message~ value will be used.
+
+** history
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Allow passing history variable to helm from source.
+ It should be a quoted symbol.
+ Passing the history variable here have no effect
+ so add it also in the ~helm~ call with the :history keyword.
+ The main point of adding the variable here
+ is to make it available when resuming.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-map
+
+- :documentation
+
+ Specific keymap for this source.
+ default value is ~helm-map~.
+
+** marked-with-props
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Get candidates with their properties in ~helm-marked-candidates~.
+ Allow using the FORCE-DISPLAY-PART of ~helm-get-selection~ in marked
+ candidates, use t or 'withprop to pass it to ~helm-get-selection~.
+
+** match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ List of functions called with one parameter: a candidate. The
+ function should return non-nil if the candidate matches the
+ current pattern (see variable ~helm-pattern~).
+
+ When using ~candidates-in-buffer~ its default value is ~identity~ and
+ don't have to be changed, use the ~search~ slot instead.
+
+ This attribute allows the source to override the default
+ pattern matching based on ~string-match~. It can be used, for
+ example, to implement a source for file names and do the
+ pattern matching on the basename of files, since it's more
+ likely one is typing part of the basename when searching for a
+ file, instead of some string anywhere else in its path.
+
+ If the list contains more than one function then the list of
+ matching candidates from the source is constructed by appending
+ the results after invoking the first function on all the
+ potential candidates, then the next function, and so on. The
+ matching candidates supplied by the first function appear first
+ in the list of results and then results from the other
+ functions, respectively.
+
+ This attribute has no effect for asynchronous sources (see
+ attribute ~candidates~), and sources using ~match-dynamic~
+ since they perform pattern matching themselves.
+
+ Note that FUZZY-MATCH slot will overhide value of this slot.
+
+** match-on-real
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Match the real value of candidates when non nil.
+
+** match-part
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Allow matching only one part of candidate.
+ If source contain match-part attribute, match is computed only
+ on part of candidate returned by the call of function provided
+ by this attribute. The function should have one arg, candidate,
+ and return only a specific part of candidate.
+ On async sources, as matching is done by the backend, this have
+ no effect apart for highlighting matches.
+
+** mode-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Source local ~helm-mode-line-string~ (included in
+ ~mode-line-format~). It accepts also variable/function name.
+
+** multiline
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Allow multiline candidates.
+ When non-nil candidates will be separated by ~helm-candidate-separator~.
+ You can customize the color of this separator with ~helm-separator~ face.
+ Value of multiline can be an integer which specify the maximum size of the
+ multiline string to display, if multiline string is longer than this value
+ it will be truncated.
+
+** multimatch
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ Use the multi-match algorithm when non-nil.
+ I.e Allow specifying multiple patterns separated by spaces.
+ When a pattern is prefixed by "!" the negation of this pattern is used,
+ i.e match anything but this pattern.
+ It is the standard way of matching in helm and is enabled by default.
+ It can be used with fuzzy-matching enabled, but as soon helm detect a space,
+ each pattern will match by regexp and will not be fuzzy.
+
+** must-match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Same as ~completing-read~ require-match arg.
+ Possible values are:
+ - ~t~ which prevent exiting with an empty helm-buffer i.e. no matches.
+ - ~confirm~ which ask for confirmation i.e. need to press a second
+ time RET.
+ - ~nil~ is the default and is doing nothing i.e. returns nil when
+ pressing RET with an empty helm-buffer.
+ - Any other non nil values e.g. ~ignore~ allow exiting with
+ minibuffer contents as candidate value (in this case helm-buffer
+ is empty).
+
+** nohighlight
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Disable highlighting matches in this source.
+ This will disable generic highlighting of matches,
+ but some specialized highlighting can be done from elsewhere,
+ i.e from ~filtered-candidate-transformer~ or ~filter-one-by-one~ slots.
+ So use this to either disable completely highlighting in your source,
+ or to disable highlighting and use a specialized highlighting matches
+ function for this source.
+ Remember that this function should run AFTER all filter functions if those
+ filter functions are modifying face properties, though it is possible to
+ avoid this by using new ~add-face-text-property~ in your filter functions.
+
+** nomark
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Don't allow marking candidates when this attribute is present.
+
+** pattern-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ It's a function or a list of functions called with one argument
+ before computing matches. Its argument is ~helm-pattern~.
+ Functions should return transformed ~helm-pattern~.
+
+ It is useful to change interpretation of ~helm-pattern~.
+
+** persistent-action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Can be a either a Function called with one parameter (the
+ selected candidate) or a cons cell where first element is this
+ same function and second element a symbol (e.g never-split)
+ that inform ~helm-execute-persistent-action~ to not split his
+ window to execute this persistent action.
+ Example:
+
+ (defun foo-persistent-action (candidate)
+ (do-something candidate))
+
+ :persistent-action '(foo-persistent-action . never-split) ; Don't split
+ or
+ :persistent-action 'foo-persistent-action ; Split
+
+ When specifying :persistent-action by slot directly, foo-persistent-action
+ will be executed without quitting helm when hitting ~C-j~.
+
+ Note that other persistent actions can be defined using other
+ bindings than ~C-j~ by simply defining an interactive function bound
+ to a key in the keymap source.
+ The function should create a new attribute in source before calling
+ ~helm-execute-persistent-action~ on this attribute.
+ Example:
+
+ (defun helm-ff-persistent-delete ()
+ "Delete current candidate without quitting."
+ (interactive)
+ (with-helm-alive-p
+ (helm-set-attr 'quick-delete '(helm-ff-quick-delete . never-split))
+ (helm-execute-persistent-action 'quick-delete)))
+
+ This function is then bound in ~helm-find-files-map~.
+
+** persistent-action-if
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Similar from persistent action but it is a function that should
+ return an object suitable for persistent action when called , i.e. a
+ function or a cons cell.
+ Example:
+
+ (defun foo-persistent-action (candidate)
+ (cond (something
+ ;; Don't split helm-window.
+ (cons (lambda (_ignore)
+ (do-something candidate))
+ 'no-split))
+ ;; Split helm-window.
+ (something-else
+ (lambda (_ignore)
+ (do-something-else candidate)))))
+
+ :persistent-action-if 'foo-persistent-action
+
+ Here when hitting ~C-j~ one of the lambda's will be executed
+ depending on something or something-else condition, splitting or not
+ splitting as needed.
+ See ~helm-find-files-persistent-action-if~ definition as another example.
+
+** persistent-help
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ A string to explain persistent-action of this source. It also
+ accepts a function or a variable name.
+ It will be displayed in ~header-line~ or in ~minibuffer~ depending
+ of value of ~helm-echo-input-in-header-line~ and ~helm-display-header-line~.
+
+** real-to-display
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Recompute all candidates computed previously with other transformers.
+
+ Function called with one parameter, the selected candidate.
+
+ The real value of candidates will be shown in display and of course
+ be used by action.
+ Example:
+
+ (helm :sources (helm-build-sync-source "test"
+ :candidates '(("foo" . 1) ("bar" . 2) ("baz". 3))
+ :real-to-display (lambda (c) (format "%s" (1+ c))))
+ :buffer "*helm test*")
+
+ Mostly deprecated, kept only for backward compatibility.
+
+** redisplay
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'identity
+
+- :documentation
+
+ A function or a list of functions to apply to current list
+ of candidates when redisplaying buffer with ~helm-redisplay-buffer~.
+ This is only interesting for modifying and redisplaying the whole list
+ of candidates in async sources.
+ It uses ~identity~ by default for when async sources are mixed with
+ normal sources, in this case these normal sources are not modified and
+ redisplayed as they are.
+
+** requires-pattern
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 0
+
+- :documentation
+
+ If present matches from the source are shown only if the
+ pattern is not empty. Optionally, it can have an integer
+ parameter specifying the required length of input which is
+ useful in case of sources with lots of candidates.
+
+** resume
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Function called with no parameters at end of initialization
+ when ~helm-resume~ is started.
+ If this function try to do something against ~helm-buffer~, (e.g updating,
+ searching etc...) probably you should run it in a timer to ensure
+ ~helm-buffer~ is ready.
+
+** update
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Function called with no parameters at before "init" function
+ when ~helm-force-update~ is called.
+
+** volatile
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Indicates the source assembles the candidate list dynamically,
+ so it shouldn't be cached within a single Helm
+ invocation. It is only applicable to synchronous sources,
+ because asynchronous sources are not cached.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-source-sync
+
+Use this class to make helm sources using a list of candidates.
+This list should be given as a normal list, a variable handling a list
+or a function returning a list.
+Matching is done basically with ~string-match~ against each candidate.
+
+[[./helm-figures/helm-source-sync.png]]
+
+#+hcindex: helm-source-sync
+
+#+hcindex: helm-source
+
+#+hcindex: helm-source-session-class
+
+#+hcindex: helm-files-dired-source
+
+#+hcindex: helm-imenu-source
+
+#+hcindex: helm-files-in-current-dir-source
+
+#+hcindex: helm-recentf-source
+
+#+hcindex: helm-eshell-history-source
+
+#+hcindex: helm-esh-source
+
+#+hcindex: helm-epa
+
+#+hcindex: helm-M-x-class
+
+#+hcindex: helm-idle-time-timers-class
+
+#+hcindex: helm-absolute-time-timers-class
+
+#+hcindex: helm-source-ffiles
+
+#+hcindex: helm-source-buffers
+
+- *parents* ::
+
+ - [[*class: helm-source]]
+
+- *children* ::
+
+ - [[*class: helm-source-session-class]]
+
+ - [[*class: helm-files-dired-source]]
+
+ - [[*class: helm-imenu-source]]
+
+ - [[*class: helm-files-in-current-dir-source]]
+
+ - [[*class: helm-recentf-source]]
+
+ - [[*class: helm-eshell-history-source]]
+
+ - [[*class: helm-esh-source]]
+
+ - [[*class: helm-epa]]
+
+ - [[*class: helm-M-x-class]]
+
+ - [[*class: helm-idle-time-timers-class]]
+
+ - [[*class: helm-absolute-time-timers-class]]
+
+ - [[*class: helm-source-ffiles]]
+
+ - [[*class: helm-source-buffers]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '("ERROR: You must specify the ~candidates~ slot, either with a list or a function")
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-dynamic
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Disable all helm matching functions when non nil.
+ The :candidates function in this case is in charge of fetching
+ candidates dynamically according to ~helm-pattern~.
+ Note that :volatile is automatically enabled when using this, so no
+ need to specify it.
+
+** match-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ When specifying a match function within a source and
+ helm-multi-match is enabled, the result of all matching
+ functions will be concatened, which in some cases is not what
+ is wanted. When using ~match-strict~ only this or these
+ functions will be used. You can specify those functions as a
+ list of functions or a single symbol function.
+
+ NOTE: This have the same effect as using :MULTIMATCH nil.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Enable migemo.
+ When multimatch is disabled, you can give the symbol 'nomultimatch as value
+ to force not using generic migemo matching function.
+ In this case you have to provide your own migemo matching funtion
+ that kick in when ~helm-migemo-mode~ is enabled.
+ Otherwise it will be available for this source once ~helm-migemo-mode~
+ is enabled when non-nil.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-source-async
+
+Use this class to define a helm source calling an external process.
+The external process is called typically in a ~start-process~ call to be
+asynchronous.
+
+Note that using multiples asynchronous sources is not fully working,
+expect weird behavior if you try this.
+
+The :candidates slot is not allowed even if described because this class
+inherit from ~helm-source~.
+
+[[./helm-figures/helm-source-async.png]]
+
+#+hcindex: helm-source-async
+
+#+hcindex: helm-source
+
+#+hcindex: helm-mac-spotlight-source
+
+#+hcindex: helm-gid-source
+
+#+hcindex: helm-fd-class
+
+#+hcindex: helm-locate-source
+
+#+hcindex: helm-grep-ag-class
+
+#+hcindex: helm-grep-class
+
+- *parents* ::
+
+ - [[*class: helm-source]]
+
+- *children* ::
+
+ - [[*class: helm-mac-spotlight-source]]
+
+ - [[*class: helm-gid-source]]
+
+ - [[*class: helm-fd-class]]
+
+ - [[*class: helm-locate-source]]
+
+ - [[*class: helm-grep-ag-class]]
+
+ - [[*class: helm-grep-class]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** candidates-process
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ This attribute is used to define a process as candidate.
+ The function called with no arguments must return a process
+ i.e. ~processp~, it use typically ~start-process~ or ~make-process~,
+ see (info "(elisp) Asynchronous Processes").
+
+ NOTE:
+ When building the source at runtime you can give directly a process
+ as value, otherwise wrap the process call into a function.
+ The process buffer should be nil, otherwise, if you use
+ ~helm-buffer~ give to the process a sentinel.
+
+** multimatch
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-async))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-source-in-buffer
+
+Use this source to make helm sources storing candidates inside a buffer.
+
+The buffer storing candidates is generated by ~helm-candidate-buffer~ function
+and all search are done in this buffer, results are transfered to the ~helm-buffer~
+when done.
+Contrarily to ~helm-source-sync~ candidates are matched using a function
+like ~re-search-forward~ (see below documentation of ~:search~ slot) which makes
+the search much faster than matching candidates one by one.
+If you want to add search functions to your sources, don't use ~:match~ which
+will raise an error, but ~:search~.
+See ~helm-candidates-in-buffer~ for more infos.
+
+[[./helm-figures/helm-source-in-buffer.png]]
+
+#+hcindex: helm-source-in-buffer
+
+#+hcindex: helm-source
+
+#+hcindex: helm-semantic-source
+
+#+hcindex: helm-file-cache
+
+#+hcindex: helm-list-el-package-source
+
+#+hcindex: helm-source-filtered-bookmarks
+
+#+hcindex: helm-source-basic-bookmarks
+
+#+hcindex: helm-info-source
+
+#+hcindex: helm-browse-project-source
+
+#+hcindex: helm-moccur-class
+
+#+hcindex: helm-locate-subdirs-source
+
+#+hcindex: helm-source-in-file
+
+- *parents* ::
+
+ - [[*class: helm-source]]
+
+- *children* ::
+
+ - [[*class: helm-semantic-source]]
+
+ - [[*class: helm-file-cache]]
+
+ - [[*class: helm-list-el-package-source]]
+
+ - [[*class: helm-source-filtered-bookmarks]]
+
+ - [[*class: helm-source-basic-bookmarks]]
+
+ - [[*class: helm-info-source]]
+
+ - [[*class: helm-browse-project-source]]
+
+ - [[*class: helm-moccur-class]]
+
+ - [[*class: helm-locate-subdirs-source]]
+
+ - [[*class: helm-source-in-file]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-default-init-source-in-buffer-function
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-candidates-in-buffer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** data
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ A string, a list or a buffer that will be used to feed the ~helm-candidates-buffer~.
+ This data will be passed in a function added to the init slot and
+ the buffer will be build with ~helm-init-candidates-in-buffer~ or directly
+ with ~helm-candidates-buffer~ if data is a buffer.
+ This is an easy and fast method to build a ~candidates-in-buffer~ source.
+
+** get-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'buffer-substring-no-properties
+
+- :documentation
+
+ A function like ~buffer-substring-no-properties~ or ~buffer-substring~.
+ This function converts region from point at line-beginning and point
+ at line-end in the ~helm-candidate-buffer~ to a string which will be displayed
+ in the ~helm-buffer~, it takes two args BEG and END.
+ By default, ~helm-candidates-in-buffer~ uses
+ ~buffer-substring-no-properties~ which does no conversion and doesn't carry
+ text properties.
+
+** match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(identity)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Enable migemo.
+ When multimatch is disabled, you can give the symbol 'nomultimatch as value
+ to force not using generic migemo matching function.
+ In this case you have to provide your own migemo matching funtion
+ that kick in when ~helm-migemo-mode~ is enabled.
+ Otherwise it will be available for this source once ~helm-migemo-mode~
+ is enabled when non-nil.
+
+** search
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(helm-candidates-in-buffer-search-default-fn)
+
+- :documentation
+
+ List of functions like ~re-search-forward~ or ~search-forward~.
+ Buffer search function used by ~helm-candidates-in-buffer~.
+ By default, ~helm-candidates-in-buffer~ uses ~re-search-forward~.
+ The function should take one arg PATTERN.
+ If your search function needs to handle negation like multimatch,
+ this function should returns in such case a cons cell of two integers defining
+ the beg and end positions to match in the line previously matched by
+ ~re-search-forward~ or similar, and move point to next line
+ (See how the ~helm-mm-3-search-base~ and ~helm-fuzzy-search~ functions are working).
+
+ NOTE: FUZZY-MATCH slot will overhide value of this slot.
+
+** search-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ When specifying a search function within a source and
+ helm-multi-match is enabled, the result of all searching
+ functions will be concatened, which in some cases is not what
+ is wanted. When using ~search-strict~ only this or these
+ functions will be used. You can specify those functions as a
+ list of functions or a single symbol function.
+
+ NOTE: This have the same effect as using a nil value for
+ :MULTIMATCH slot.
+
+** volatile
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-source-dummy
+
+[[./helm-figures/helm-source-dummy.png]]
+
+#+hcindex: helm-source-dummy
+
+#+hcindex: helm-source
+
+- *parents* ::
+
+ - [[*class: helm-source]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** accept-empty
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ Allow exiting with an empty string.
+ You should keep the default value.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '("dummy")
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda
+ (_candidates _source)
+ (list helm-pattern))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'identity
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** multimatch
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** volatile
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-dummy))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-source-in-file
+
+The contents of the FILE will be used as candidates in buffer.
+
+[[./helm-figures/helm-source-in-file.png]]
+
+#+hcindex: helm-source-in-file
+
+#+hcindex: helm-source-in-buffer
+
+- *parents* ::
+
+ - [[*class: helm-source-in-buffer]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (let
+ ((file
+ (helm-get-attr 'candidates-file))
+ (count 1))
+ (with-current-buffer
+ (helm-candidate-buffer 'global)
+ (insert-file-contents file)
+ (goto-char
+ (point-min))
+ (while
+ (not
+ (eobp))
+ (add-text-properties
+ (point-at-bol)
+ (point-at-eol)
+ `(helm-linum ,count))
+ (cl-incf count)
+ (forward-line 1)))))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates-file
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ A filename.
+ Each line number of FILE is accessible with helm-linum property
+ from candidate display part.
+
+** get-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'buffer-substring
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-type-file
+
+A class to define helm type file.
+
+[[./helm-figures/helm-type-file.png]]
+
+#+hcindex: helm-type-file
+
+#+hcindex: helm-source
+
+#+hcindex: helm-mac-spotlight-source
+
+#+hcindex: helm-files-dired-source
+
+#+hcindex: helm-files-in-current-dir-source
+
+#+hcindex: helm-recentf-source
+
+#+hcindex: helm-file-cache
+
+#+hcindex: helm-browse-project-override-inheritor
+
+#+hcindex: helm-locate-override-inheritor
+
+- *parents* ::
+
+ - [[*class: helm-source]]
+
+- *children* ::
+
+ - [[*class: helm-mac-spotlight-source]]
+
+ - [[*class: helm-files-dired-source]]
+
+ - [[*class: helm-files-in-current-dir-source]]
+
+ - [[*class: helm-recentf-source]]
+
+ - [[*class: helm-file-cache]]
+
+ - [[*class: helm-browse-project-override-inheritor]]
+
+ - [[*class: helm-locate-override-inheritor]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-file))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-type-file))
+ :before ((source helm-type-file))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-type-bookmark
+
+A class to define type bookmarks.
+
+[[./helm-figures/helm-type-bookmark.png]]
+
+#+hcindex: helm-type-bookmark
+
+#+hcindex: helm-source
+
+#+hcindex: helm-source-filtered-bookmarks
+
+#+hcindex: helm-source-basic-bookmarks
+
+- *parents* ::
+
+ - [[*class: helm-source]]
+
+- *children* ::
+
+ - [[*class: helm-source-filtered-bookmarks]]
+
+ - [[*class: helm-source-basic-bookmarks]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-bookmark))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-type-bookmark))
+ :before ((source helm-type-bookmark))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-type-buffer
+
+A class to define type buffer.
+
+[[./helm-figures/helm-type-buffer.png]]
+
+#+hcindex: helm-type-buffer
+
+#+hcindex: helm-source
+
+#+hcindex: helm-source-buffers
+
+- *parents* ::
+
+ - [[*class: helm-source]]
+
+- *children* ::
+
+ - [[*class: helm-source-buffers]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-buffer))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-type-buffer))
+ :before ((source helm-type-buffer))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-type-function
+
+A class to define helm type function.
+
+[[./helm-figures/helm-type-function.png]]
+
+#+hcindex: helm-type-function
+
+#+hcindex: helm-source
+
+- *parents* ::
+
+ - [[*class: helm-source]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-function))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-type-function))
+ :before ((source helm-type-function))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-type-command
+
+A class to define helm type command.
+
+[[./helm-figures/helm-type-command.png]]
+
+#+hcindex: helm-type-command
+
+#+hcindex: helm-source
+
+#+hcindex: helm-M-x-class
+
+- *parents* ::
+
+ - [[*class: helm-source]]
+
+- *children* ::
+
+ - [[*class: helm-M-x-class]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-type-command))
+ :before ((source helm-type-command))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-type-timers
+
+A class to define helm type timers.
+
+[[./helm-figures/helm-type-timers.png]]
+
+#+hcindex: helm-type-timers
+
+#+hcindex: helm-source
+
+#+hcindex: helm-idle-time-timers-class
+
+#+hcindex: helm-absolute-time-timers-class
+
+- *parents* ::
+
+ - [[*class: helm-source]]
+
+- *children* ::
+
+ - [[*class: helm-idle-time-timers-class]]
+
+ - [[*class: helm-absolute-time-timers-class]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-type-timers))
+ :before ((source helm-type-timers))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-files-dired-source
+
+[[./helm-figures/helm-files-dired-source.png]]
+
+#+hcindex: helm-files-dired-source
+
+#+hcindex: helm-source-sync
+
+#+hcindex: helm-type-file
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+ - [[*class: helm-type-file]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'helm-files-in-all-dired-candidates
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-dynamic
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-file))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+ ((source helm-type-file))
+ :before ((source helm-type-file))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-source-session-class
+
+[[./helm-figures/helm-source-session-class.png]]
+
+#+hcindex: helm-source-session-class
+
+#+hcindex: helm-source-sync
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-type-file-actions
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (cl-delete-if-not
+ (lambda
+ (f)
+ (or
+ (string-match helm-tramp-file-name-regexp f)
+ (file-exists-p f)))
+ (mapcar 'car session-file-alist)))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-generic-file-help-message
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-generic-files-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-mac-spotlight-source
+
+[[./helm-figures/helm-mac-spotlight-source.png]]
+
+#+hcindex: helm-mac-spotlight-source
+
+#+hcindex: helm-source-async
+
+#+hcindex: helm-type-file
+
+- *parents* ::
+
+ - [[*class: helm-source-async]]
+
+ - [[*class: helm-type-file]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** candidates-process
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (start-process "mdfind-process" nil "mdfind" helm-pattern))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** multimatch
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** requires-pattern
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 3
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-file))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-async))
+ ((source helm-type-file))
+ :before ((source helm-type-file))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-source-basic-bookmarks
+
+[[./helm-figures/helm-source-basic-bookmarks.png]]
+
+#+hcindex: helm-source-basic-bookmarks
+
+#+hcindex: helm-source-in-buffer
+
+#+hcindex: helm-type-bookmark
+
+- *parents* ::
+
+ - [[*class: helm-source-in-buffer]]
+
+ - [[*class: helm-type-bookmark]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (bookmark-maybe-load-default-file)
+ (helm-init-candidates-in-buffer 'global
+ (bookmark-all-names)))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-candidates-in-buffer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** data
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-bookmark-transformer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** get-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'buffer-substring-no-properties
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(identity)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** search
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(helm-candidates-in-buffer-search-default-fn)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** search-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** volatile
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-bookmark))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+ ((source helm-type-bookmark))
+ :before ((source helm-type-bookmark))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-source-filtered-bookmarks
+
+[[./helm-figures/helm-source-filtered-bookmarks.png]]
+
+#+hcindex: helm-source-filtered-bookmarks
+
+#+hcindex: helm-source-in-buffer
+
+#+hcindex: helm-type-bookmark
+
+#+hcindex: helm-bookmark-find-files-class
+
+- *parents* ::
+
+ - [[*class: helm-source-in-buffer]]
+
+ - [[*class: helm-type-bookmark]]
+
+- *children* ::
+
+ - [[*class: helm-bookmark-find-files-class]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-default-init-source-in-buffer-function
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-candidates-in-buffer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** data
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(helm-adaptive-sort helm-highlight-bookmark)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** get-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'buffer-substring-no-properties
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(identity)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** search
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(helm-candidates-in-buffer-search-default-fn)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** search-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** volatile
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-bookmark))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+ ((source helm-type-bookmark))
+ :before ((source helm-type-bookmark))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-bookmark-override-inheritor
+
+[[./helm-figures/helm-bookmark-override-inheritor.png]]
+
+#+hcindex: helm-bookmark-override-inheritor
+
+#+hcindex: helm-source
+
+#+hcindex: helm-bookmark-find-files-class
+
+- *parents* ::
+
+ - [[*class: helm-source]]
+
+- *children* ::
+
+ - [[*class: helm-bookmark-find-files-class]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-bookmark-override-inheritor))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-bookmark-find-files-class
+
+[[./helm-figures/helm-bookmark-find-files-class.png]]
+
+#+hcindex: helm-bookmark-find-files-class
+
+#+hcindex: helm-source-filtered-bookmarks
+
+#+hcindex: helm-bookmark-override-inheritor
+
+- *parents* ::
+
+ - [[*class: helm-source-filtered-bookmarks]]
+
+ - [[*class: helm-bookmark-override-inheritor]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-default-init-source-in-buffer-function
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-candidates-in-buffer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** data
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(helm-adaptive-sort helm-highlight-bookmark)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** get-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'buffer-substring-no-properties
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(identity)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** search
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(helm-candidates-in-buffer-search-default-fn)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** search-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** volatile
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-bookmark))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+ ((source helm-type-bookmark))
+ :before ((source helm-type-bookmark))
+ ((source helm-bookmark-override-inheritor))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-source-buffers
+
+[[./helm-figures/helm-source-buffers.png]]
+
+#+hcindex: helm-source-buffers
+
+#+hcindex: helm-source-sync
+
+#+hcindex: helm-type-buffer
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+ - [[*class: helm-type-buffer]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-buffers-list--init
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** buffer-list
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'helm-buffer-list
+
+- :documentation
+
+ A function with no arguments to create buffer list.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '("ERROR: You must specify the ~candidates~ slot, either with a list or a function")
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-buffer-help-message
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-buffer-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-buffers-match-function
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-dynamic
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'nomultimatch
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** multimatch
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nohighlight
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-buffers-list-persistent-action
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** resume
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (setq helm-buffers-in-project-p nil))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** volatile
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-buffer))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+ ((source helm-type-buffer))
+ :before ((source helm-type-buffer))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-M-x-class
+
+[[./helm-figures/helm-M-x-class.png]]
+
+#+hcindex: helm-M-x-class
+
+#+hcindex: helm-source-sync
+
+#+hcindex: helm-type-command
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+ - [[*class: helm-type-command]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '("ERROR: You must specify the ~candidates~ slot, either with a list or a function")
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-M-x-transformer-no-sort
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-M-x-help-message
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-M-x-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-dynamic
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** must-match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nomark
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-help
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ "Describe this command"
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+ ((source helm-type-command))
+ :before ((source helm-type-command))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-absolute-time-timers-class
+
+[[./helm-figures/helm-absolute-time-timers-class.png]]
+
+#+hcindex: helm-absolute-time-timers-class
+
+#+hcindex: helm-source-sync
+
+#+hcindex: helm-type-timers
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+ - [[*class: helm-type-timers]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** allow-dups
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda
+ (candidates)
+ (cl-loop for timer in candidates collect
+ (cons
+ (helm-elisp--format-timer timer)
+ timer)))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ timer-list
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-dynamic
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+ ((source helm-type-timers))
+ :before ((source helm-type-timers))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-idle-time-timers-class
+
+[[./helm-figures/helm-idle-time-timers-class.png]]
+
+#+hcindex: helm-idle-time-timers-class
+
+#+hcindex: helm-source-sync
+
+#+hcindex: helm-type-timers
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+ - [[*class: helm-type-timers]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** allow-dups
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda
+ (candidates)
+ (cl-loop for timer in candidates collect
+ (cons
+ (helm-elisp--format-timer timer)
+ timer)))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ timer-idle-list
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-dynamic
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+ ((source helm-type-timers))
+ :before ((source helm-type-timers))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-list-el-package-source
+
+[[./helm-figures/helm-list-el-package-source.png]]
+
+#+hcindex: helm-list-el-package-source
+
+#+hcindex: helm-source-in-buffer
+
+- *parents* ::
+
+ - [[*class: helm-source-in-buffer]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-el-package--init
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(("Describe package" . helm-el-package-describe) ("Visit homepage" . helm-el-package-visit-homepage))
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** action-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-el-package--action-transformer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidate-number-limit
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 9999
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-el-package--transformer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** get-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'buffer-substring
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** group
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-el-package
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-el-package-help-message
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-el-package-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** update
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-el-package--update
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-epa
+
+Allow building helm sources for GPG keys.
+
+[[./helm-figures/helm-epa.png]]
+
+#+hcindex: helm-epa
+
+#+hcindex: helm-source-sync
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (require 'epg)
+ (require 'epa))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-epa-get-key-list
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-comp-read-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** mode-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-comp-read-mode-line
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-esh-source
+
+Helm class to define source for Eshell completion.
+
+[[./helm-figures/helm-esh-source.png]]
+
+#+hcindex: helm-esh-source
+
+#+hcindex: helm-source-sync
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (setq pcomplete-current-completions nil pcomplete-last-completion-raw nil)
+ (remove-hook 'minibuffer-setup-hook 'eshell-mode))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-ec-insert
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-esh-get-candidates
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'helm-esh-transformer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nohighlight
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'ignore
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-eshell-history-source
+
+Helm class to define source for Eshell history.
+
+[[./helm-figures/helm-eshell-history-source.png]]
+
+#+hcindex: helm-eshell-history-source
+
+#+hcindex: helm-source-sync
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (remove-hook 'minibuffer-setup-hook 'eshell-mode))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda
+ (candidate)
+ (eshell-kill-input)
+ (insert candidate))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidate-number-limit
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 9999
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (with-helm-current-buffer
+ (cl-loop for c from 0 to
+ (ring-length eshell-history-ring)
+ for elm =
+ (eshell-get-history c)
+ unless
+ (and
+ (member elm lst)
+ eshell-hist-ignoredups)
+ collect elm into lst finally return lst)))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-eshell-history-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** multiline
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nomark
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-fd-class
+
+[[./helm-figures/helm-fd-class.png]]
+
+#+hcindex: helm-fd-class
+
+#+hcindex: helm-source-async
+
+- *parents* ::
+
+ - [[*class: helm-source-async]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-type-file-actions
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidate-number-limit
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 20000
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates-process
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-fd-process
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-fd-fct
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-fd-help-message
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-fd-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nohighlight
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** requires-pattern
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 2
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-async))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-source-ffiles
+
+[[./helm-figures/helm-source-ffiles.png]]
+
+#+hcindex: helm-source-ffiles
+
+#+hcindex: helm-source-sync
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (setq helm-ff-auto-update-flag helm-ff-auto-update-initial-value)
+ (setq helm-ff--auto-update-state helm-ff-auto-update-flag)
+ (helm-set-local-variable 'bookmark-make-record-function #'helm-ff-make-bookmark-record)
+ (require 'helm-external))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-find-files-actions
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** action-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-find-files-action-transformer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** after-init-hook
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-find-files-after-init-hook
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** before-init-hook
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-find-files-before-init-hook
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidate-number-limit
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-ff-candidate-number-limit
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-find-files-get-candidates
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** cleanup
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-find-files-cleanup
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(helm-ff-fct helm-ff-directories-only helm-ff-files-only helm-ff-sort-candidates)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** group
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-files
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** header-name
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda
+ (name)
+ (concat name
+ (substitute-command-keys helm-find-files-doc-header)))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-ff-help-message
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-find-files-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-on-real
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** mode-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (list "File(s)" helm-mode-line-string)
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nohighlight
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-action-if
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-find-files-persistent-action-if
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-help
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ "Hit1 Expand Candidate, Hit2 or (C-u) Find file"
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** update
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (remhash helm-ff-default-directory helm-ff--list-directory-cache))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** volatile
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-browse-project-override-inheritor
+
+[[./helm-figures/helm-browse-project-override-inheritor.png]]
+
+#+hcindex: helm-browse-project-override-inheritor
+
+#+hcindex: helm-type-file
+
+#+hcindex: helm-browse-project-source
+
+- *parents* ::
+
+ - [[*class: helm-type-file]]
+
+- *children* ::
+
+ - [[*class: helm-browse-project-source]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-file))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-type-file))
+ :before ((source helm-type-file))
+ :after ((source helm-browse-project-override-inheritor))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-browse-project-source
+
+Class to define a source in ~helm-browse-project~ handling non
+VC handled directories.
+
+[[./helm-figures/helm-browse-project-source.png]]
+
+#+hcindex: helm-browse-project-source
+
+#+hcindex: helm-source-in-buffer
+
+#+hcindex: helm-browse-project-override-inheritor
+
+- *parents* ::
+
+ - [[*class: helm-source-in-buffer]]
+
+ - [[*class: helm-browse-project-override-inheritor]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-default-init-source-in-buffer-function
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-candidates-in-buffer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** data
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filter-one-by-one
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda
+ (c)
+ (if
+ (with-helm-buffer helm-ff-transformer-show-only-basename)
+ (cons
+ (propertize
+ (helm-basename c)
+ 'face 'helm-ff-file)
+ c)
+ (propertize c 'face 'helm-ff-file)))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** get-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'buffer-substring-no-properties
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(identity)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-part
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda
+ (c)
+ (if
+ (with-helm-buffer helm-ff-transformer-show-only-basename)
+ (helm-basename c)
+ c))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** root-dir
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** search
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(helm-candidates-in-buffer-search-default-fn)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** search-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** volatile
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-file))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+ ((source helm-type-file))
+ :before ((source helm-type-file))
+ :after ((source helm-browse-project-override-inheritor))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-file-cache
+
+[[./helm-figures/helm-file-cache.png]]
+
+#+hcindex: helm-file-cache
+
+#+hcindex: helm-source-in-buffer
+
+#+hcindex: helm-type-file
+
+- *parents* ::
+
+ - [[*class: helm-source-in-buffer]]
+
+ - [[*class: helm-type-file]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (require 'filecache))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-candidates-in-buffer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** data
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** get-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'buffer-substring-no-properties
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(identity)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** search
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(helm-candidates-in-buffer-search-default-fn)
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** search-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** volatile
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-file))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+ ((source helm-type-file))
+ :before ((source helm-type-file))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-recentf-source
+
+[[./helm-figures/helm-recentf-source.png]]
+
+#+hcindex: helm-recentf-source
+
+#+hcindex: helm-source-sync
+
+#+hcindex: helm-type-file
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+ - [[*class: helm-type-file]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (require 'recentf)
+ (when helm-turn-on-recentf
+ (recentf-mode 1)))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil recentf-list)
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-dynamic
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-part
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda
+ (candidate)
+ (if
+ (or helm-ff-transformer-show-only-basename helm-recentf--basename-flag)
+ (helm-basename candidate)
+ candidate))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** pattern-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-recentf-pattern-transformer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-ff-kill-or-find-buffer-fname
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-file))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+ ((source helm-type-file))
+ :before ((source helm-type-file))
+ :after ((source helm-recentf-source))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-files-in-current-dir-source
+
+[[./helm-figures/helm-files-in-current-dir-source.png]]
+
+#+hcindex: helm-files-in-current-dir-source
+
+#+hcindex: helm-source-sync
+
+#+hcindex: helm-type-file
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+ - [[*class: helm-type-file]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (with-helm-current-buffer
+ (let
+ ((dir
+ (helm-current-directory)))
+ (when
+ (file-accessible-directory-p dir)
+ (directory-files dir t)))))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** fuzzy-match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-dynamic
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-part
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda
+ (candidate)
+ (if
+ (or helm-ff-transformer-show-only-basename helm-recentf--basename-flag)
+ (helm-basename candidate)
+ candidate))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** match-strict
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** pattern-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-recentf-pattern-transformer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-file))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+ ((source helm-type-file))
+ :before ((source helm-type-file))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-grep-class
+
+[[./helm-figures/helm-grep-class.png]]
+
+#+hcindex: helm-grep-class
+
+#+hcindex: helm-source-async
+
+- *parents* ::
+
+ - [[*class: helm-source-async]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-actions
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** after-init-hook
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-after-init-hook
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** backend
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ The grep backend that will be used.
+ It is actually used only as an internal flag
+ and doesn't set the backend by itself.
+ You probably don't want to modify this.
+
+** before-init-hook
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-before-init-hook
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidate-number-limit
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 9999
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates-process
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-collect-candidates
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'helm-grep-fc-transformer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** group
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-help-message
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** history
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-history
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-grep-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nohighlight
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nomark
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** pcre
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Backend is using pcre regexp engine when non-nil.
+
+** persistent-action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-persistent-action
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-help
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ "Jump to line (~C-u~ Record in mark ring)"
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** requires-pattern
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 2
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-async))
+ ((source helm-grep-class))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-grep-ag-class
+
+[[./helm-figures/helm-grep-ag-class.png]]
+
+#+hcindex: helm-grep-ag-class
+
+#+hcindex: helm-source-async
+
+- *parents* ::
+
+ - [[*class: helm-source-async]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-actions
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidate-number-limit
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 99999
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'helm-grep-fc-transformer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** group
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-help-message
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** history
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-ag-history
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-grep-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nohighlight
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nomark
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** pcre
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ Backend is using pcre regexp engine when non--nil.
+
+** persistent-action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-persistent-action
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-help
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ "Jump to line (~C-u~ Record in mark ring)"
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** requires-pattern
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 2
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-async))
+ ((source helm-grep-ag-class))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-gid-source
+
+[[./helm-figures/helm-gid-source.png]]
+
+#+hcindex: helm-gid-source
+
+#+hcindex: helm-source-async
+
+- *parents* ::
+
+ - [[*class: helm-source-async]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (helm-make-actions "Find File" 'helm-grep-action "Find file other frame" 'helm-grep-other-frame "Save results in grep buffer" 'helm-grep-save-results "Find file other window" 'helm-grep-other-window)
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidate-number-limit
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 99999
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates-process
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'helm-gid-candidates-process
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** db-dir
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ Location of ID file.
+
+** filtered-candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'helm-gid-filtered-candidate-transformer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** header-name
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda
+ (name)
+ (concat name " ["
+ (helm-get-attr 'db-dir)
+ "]"))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-help-message
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** history
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-history
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nohighlight
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-grep-persistent-action
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** requires-pattern
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 2
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-async))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-imenu-source
+
+[[./helm-figures/helm-imenu-source.png]]
+
+#+hcindex: helm-imenu-source
+
+#+hcindex: helm-source-sync
+
+- *parents* ::
+
+ - [[*class: helm-source-sync]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-imenu-action
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidate-transformer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-imenu-transformer
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-imenu-candidates
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** group
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-imenu
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-imenu-help-message
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ helm-imenu-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** nomark
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ t
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-imenu-persistent-action
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-help
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ "Show this entry"
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-sync))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-info-source
+
+[[./helm-figures/helm-info-source.png]]
+
+#+hcindex: helm-info-source
+
+#+hcindex: helm-source-in-buffer
+
+- *parents* ::
+
+ - [[*class: helm-source-in-buffer]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'helm-info-init
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ '(("Goto node" . helm-info-goto))
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** display-to-real
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'helm-info-display-to-real
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** get-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'buffer-substring
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** info-file
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-locate-override-inheritor
+
+[[./helm-figures/helm-locate-override-inheritor.png]]
+
+#+hcindex: helm-locate-override-inheritor
+
+#+hcindex: helm-type-file
+
+#+hcindex: helm-locate-source
+
+- *parents* ::
+
+ - [[*class: helm-type-file]]
+
+- *children* ::
+
+ - [[*class: helm-locate-source]]
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-file))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-type-file))
+ :before ((source helm-type-file))
+ :after ((source helm-locate-override-inheritor))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-locate-source
+
+[[./helm-figures/helm-locate-source.png]]
+
+#+hcindex: helm-locate-source
+
+#+hcindex: helm-source-async
+
+#+hcindex: helm-locate-override-inheritor
+
+- *parents* ::
+
+ - [[*class: helm-source-async]]
+
+ - [[*class: helm-locate-override-inheritor]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-locate-initial-setup
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidate-number-limit
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 9999
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** candidates-process
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-locate-init
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** group
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-locate
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** history
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-file-name-history
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** multimatch
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-ff-kill-or-find-buffer-fname
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** redisplay
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (progn helm-locate-fuzzy-sort-fn)
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** requires-pattern
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 3
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-source-get-action-from-type~:
+
+ ((object helm-type-file))
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-async))
+ ((source helm-type-file))
+ :before ((source helm-type-file))
+ :after ((source helm-locate-override-inheritor))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-locate-subdirs-source
+
+[[./helm-figures/helm-locate-subdirs-source.png]]
+
+#+hcindex: helm-locate-subdirs-source
+
+#+hcindex: helm-source-in-buffer
+
+- *parents* ::
+
+ - [[*class: helm-source-in-buffer]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** basedir
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** data
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #'helm-locate-init-subdirs
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** group
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-locate
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** subdir
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-moccur-class
+
+[[./helm-figures/helm-moccur-class.png]]
+
+#+hcindex: helm-moccur-class
+
+#+hcindex: helm-source-in-buffer
+
+- *parents* ::
+
+ - [[*class: helm-source-in-buffer]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** buffer-name
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** moccur-buffers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ nil
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* class: helm-semantic-source
+
+[[./helm-figures/helm-semantic-source.png]]
+
+#+hcindex: helm-semantic-source
+
+#+hcindex: helm-source-in-buffer
+
+- *parents* ::
+
+ - [[*class: helm-source-in-buffer]]
+
+- *children* ::
+
+The following are some interesting slots of this class. Note that not all slots are shown here.
+
+** init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda nil
+ (helm-semantic--maybe-set-needs-update)
+ (setq helm-semantic--tags-cache
+ (semantic-fetch-tags))
+ (with-current-buffer
+ (helm-candidate-buffer 'global)
+ (let
+ ((major-mode
+ (with-helm-current-buffer major-mode)))
+ (helm-semantic--fetch-candidates helm-semantic--tags-cache 0))))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-semantic-default-action
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** get-line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'buffer-substring
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** help-message
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-semantic-help-message
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** keymap
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ 'helm-semantic-map
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ #+begin_src emacs-lisp
+ (lambda
+ (elm)
+ (helm-semantic-default-action elm t)
+ (helm-highlight-current-line))
+ #+end_src
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** persistent-help
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- :initform
+
+ "Show this entry"
+
+- :documentation
+
+ See parent class for this slot's documentation.
+
+** Specialized Methods:
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm--setup-source~:
+
+ ((source helm-source))
+ :before ((source helm-source))
+ ((source helm-source-in-buffer))
+
+~helm-setup-user-source~:
+
+ ((source helm-source))
+
+* Main Index
+:PROPERTIES:
+:INDEX: cp
+:DESCRIPTION: An index of Helm-Classes's concepts and features.
+:END:
+
+* Key Index
+:PROPERTIES:
+:DESCRIPTION: Key bindings and where they are described.
+:INDEX: ky
+:END:
+
+* Command and Function Index
+:PROPERTIES:
+:DESCRIPTION: Command names and some internal functions.
+:INDEX: fn
+:END:
+
+* Variable Index
+:PROPERTIES:
+:DESCRIPTION: Variables mentioned in the manual.
+:INDEX: vr
+:END:
+
+This is not a complete index of variables and faces, only the ones
+that are mentioned in the manual. For a more complete list, use
+{{{kbd(M-x org-customize)}}} and then click yourself through the tree.
+
+* Export Setup :noexport:
+
+#+setupfile: doc-setup.org
+#+options: H:4
+#+export_file_name: helm-classes.texi
+#+texinfo_dir_category: Emacs Add-ons
+#+texinfo_dir_title: Helm Classes: (helm-classes)
+#+texinfo_dir_desc: Helm Classes
+
+* Footnotes
+
+#+STARTUP: showeverything
+#+STARTUP: inlineimages
+#+EXCLUDE_TAGS: TOC_4
+
+# (info (org-texinfo-export-to-info))
+
+* Class Index
+:PROPERTIES:
+:DESCRIPTION: Index of Helm Classes
+:INDEX: hc
+:END:
+#+texinfo: @printindex hc
diff --git a/doc/helm-classes.plantuml b/doc/helm-classes.plantuml
new file mode 100644
index 00000000..908b192d
--- /dev/null
+++ b/doc/helm-classes.plantuml
@@ -0,0 +1,164 @@
+@startuml
+skinparam classFontStyle bold
+skinparam classBackGroundColor #fbfb77
+skinparam TitleFontStyle bold
+skinparam TitleFontSize 24
+title Classes in library 'Helm'\n\n
+class "helm-locate-source" {
+}
+"helm-source-async" <|-- "helm-locate-source"
+"helm-locate-override-inheritor" <|-- "helm-locate-source"
+class "helm-locate-override-inheritor" {
+}
+"helm-type-file" <|-- "helm-locate-override-inheritor"
+class "helm-file-cache" {
+}
+"helm-source-in-buffer" <|-- "helm-file-cache"
+"helm-type-file" <|-- "helm-file-cache"
+class "helm-browse-project-source" {
+ Class to define a source in
+ `helm-browse-project' handling
+ non
+ ==
+}
+"helm-source-in-buffer" <|-- "helm-browse-project-source"
+"helm-browse-project-override-inheritor" <|-- "helm-browse-project-source"
+class "helm-browse-project-override-inheritor" {
+}
+"helm-type-file" <|-- "helm-browse-project-override-inheritor"
+class "helm-fd-class" {
+}
+"helm-source-async" <|-- "helm-fd-class"
+class "helm-absolute-time-timers-class" {
+}
+"helm-source-sync" <|-- "helm-absolute-time-timers-class"
+"helm-type-timers" <|-- "helm-absolute-time-timers-class"
+class "helm-M-x-class" {
+}
+"helm-source-sync" <|-- "helm-M-x-class"
+"helm-type-command" <|-- "helm-M-x-class"
+class "helm-source-buffers" {
+}
+"helm-source-sync" <|-- "helm-source-buffers"
+"helm-type-buffer" <|-- "helm-source-buffers"
+class "helm-bookmark-find-files-class" {
+}
+"helm-source-filtered-bookmarks" <|-- "helm-bookmark-find-files-class"
+"helm-bookmark-override-inheritor" <|-- "helm-bookmark-find-files-class"
+class "helm-bookmark-override-inheritor" {
+}
+"helm-source" <|-- "helm-bookmark-override-inheritor"
+class "helm-source-filtered-bookmarks" {
+}
+"helm-source-in-buffer" <|-- "helm-source-filtered-bookmarks"
+"helm-type-bookmark" <|-- "helm-source-filtered-bookmarks"
+class "helm-source-basic-bookmarks" {
+}
+"helm-source-in-buffer" <|-- "helm-source-basic-bookmarks"
+"helm-type-bookmark" <|-- "helm-source-basic-bookmarks"
+class "helm-mac-spotlight-source" {
+}
+"helm-source-async" <|-- "helm-mac-spotlight-source"
+"helm-type-file" <|-- "helm-mac-spotlight-source"
+class "helm-source-session-class" {
+}
+"helm-source-sync" <|-- "helm-source-session-class"
+class "helm-files-dired-source" {
+}
+"helm-source-sync" <|-- "helm-files-dired-source"
+"helm-type-file" <|-- "helm-files-dired-source"
+class "helm-type-timers" {
+ A class to define helm type
+ timers.
+ ==
+}
+"helm-source" <|-- "helm-type-timers"
+class "helm-type-command" {
+ A class to define helm type
+ command.
+ ==
+}
+"helm-source" <|-- "helm-type-command"
+class "helm-type-buffer" {
+ A class to define type buffer.
+ ==
+}
+"helm-source" <|-- "helm-type-buffer"
+class "helm-type-bookmark" {
+ A class to define type
+ bookmarks.
+ ==
+}
+"helm-source" <|-- "helm-type-bookmark"
+class "helm-type-file" {
+ A class to define helm type
+ file.
+ ==
+}
+"helm-source" <|-- "helm-type-file"
+class "helm-source-in-file" {
+ The contents of the FILE will
+ be used as candidates in
+ buffer.
+ ==
+}
+"helm-source-in-buffer" <|-- "helm-source-in-file"
+class "helm-source-dummy" {
+}
+"helm-source" <|-- "helm-source-dummy"
+class "helm-source-in-buffer" {
+ Use this source to make helm
+ sources storing candidates
+ inside a buffer.
+ ==
+}
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source-async" {
+ Use this class to define a
+ helm source calling an
+ external process.
+ ==
+}
+"helm-source" <|-- "helm-source-async"
+class "helm-source-sync" {
+ Use this class to make helm
+ sources using a list of
+ candidates.
+ ==
+}
+"helm-source" <|-- "helm-source-sync"
+class "helm-source" {
+ Main interface to define helm
+ sources.
+ ==
+}
+package "Other classes similar to 'helm-fd-class'" {
+ "helm-fd-class" -down[hidden]-> "helm-grep-class"
+ "helm-grep-class" -down[hidden]-> "helm-grep-ag-class"
+ "helm-grep-ag-class" -down[hidden]-> "helm-gid-source"
+}
+package "Other classes similar to 'helm-absolute-time-timers-class'" {
+ "helm-absolute-time-timers-class" -down[hidden]-> "helm-idle-time-timers-class"
+}
+package "Other classes similar to 'helm-source-session-class'" {
+ "helm-source-session-class" -down[hidden]-> "helm-epa"
+ "helm-epa" -down[hidden]-> "helm-esh-source"
+ "helm-esh-source" -down[hidden]-> "helm-eshell-history-source"
+ "helm-eshell-history-source" -down[hidden]-> "helm-source-ffiles"
+ "helm-source-ffiles" -down[hidden]-> "helm-imenu-source"
+}
+package "Other classes similar to 'helm-files-dired-source'" {
+ "helm-files-dired-source" -down[hidden]-> "helm-recentf-source"
+ "helm-recentf-source" -down[hidden]-> "helm-files-in-current-dir-source"
+}
+package "Other classes similar to 'helm-source-in-file'" {
+ "helm-source-in-file" -down[hidden]-> "helm-list-el-package-source"
+ "helm-list-el-package-source" -down[hidden]-> "helm-info-source"
+ "helm-info-source" -down[hidden]-> "helm-locate-subdirs-source"
+ "helm-locate-subdirs-source" -down[hidden]-> "helm-moccur-class"
+ "helm-moccur-class" -down[hidden]-> "helm-semantic-source"
+}
+package "Other classes similar to 'helm-source-dummy'" {
+ "helm-source-dummy" -down[hidden]-> "helm-type-function"
+}
+@enduml
diff --git a/doc/helm-devel.org b/doc/helm-devel.org
new file mode 100644
index 00000000..c991e833
--- /dev/null
+++ b/doc/helm-devel.org
@@ -0,0 +1,495 @@
+#+title: The Helm Developer's Guide
+# #+subtitle: Release {{{version}}}
+#+subtitle: Release 3.6.2
+#+author: The Helm Developers
+# #+date: {{{modification-time}}}
+#+language: en
+
+# #+texinfo: @insertcopying
+
+* Table Of Contents :TOC_3:
+- [[#introduction][Introduction]]
+- [[#creating-a-helm-buffer][Creating a Helm buffer]]
+- [[#helm-attributes][Helm attributes]]
+ - [[#looking-up-helm-attributes][Looking up Helm attributes]]
+ - [[#mandatory-attributes][Mandatory attributes]]
+ - [[#optional-but-important-attributes][Optional, but important attributes]]
+ - [[#helm-keywords][~helm~ keywords]]
+ - [[#sources][~:sources~]]
+ - [[#buffer][~:buffer~]]
+ - [[#input][~:input~]]
+- [[#customizing-action-lists][Customizing Action Lists]]
+- [[#creating-a-source][Creating a Source]]
+ - [[#helm-source-sync][~helm-source-sync~]]
+ - [[#helm-source-in-buffer][~helm-source-in-buffer~]]
+ - [[#helm-source-async][~helm-source-async~]]
+ - [[#helm-source-dummy][~helm-source-dummy~]]
+ - [[#helm-source-in-file][~helm-source-in-file~]]
+ - [[#help][Help]]
+ - [[#pre-filtering-lines-in-a-buffer][Pre-filtering lines in a buffer]]
+- [[#creating-a-class][Creating a Class]]
+ - [[#create-your-own-class-inheriting-from-one-of-the-main-classes][Create your own class inheriting from one of the main classes]]
+ - [[#create-your-own-class-and-inherit-from-one-of-helm-type-classes][Create your own class and Inherit from one of helm-type classes]]
+ - [[#creating-a-new-class-using-as-parent-a-class-inheriting-itself-from-a-helm-type--class][Creating a new class using as parent a class inheriting itself from a ~helm-type-*~ class]]
+ - [[#create-your-source-from-your-own-class][Create your source from your own class]]
+ - [[#write-your-own-helm-type-class][Write your own helm-type class]]
+- [[#writing-actions][Writing actions]]
+- [[#writing-persistent-actions][Writing persistent actions]]
+- [[#footnotes][Footnotes]]
+
+* Introduction
+
+The best way to learn how to create a custom Helm command is to read
+the source code[fn:1] and look at examples.
+
+A good place to start is the source file =helm-info.el=[fn:2]. This
+source file is fairly short and straightforward.
+
+That being said, we'll try to go over some basic ideas in this manual.
+
+* Creating a Helm buffer
+
+The ~helm~ function creates a Helm buffer with candidates to select
+and/or take action on. The list of candidates is provided by one or
+more *sources*.
+
+An example usage of ~helm~ is below:
+
+#+begin_src emacs-lisp
+ (defun my-first-helm-command ()
+ (interactive)
+ (helm :sources 'my-source
+ :buffer "*helm my command*"))
+#+end_src
+
+~helm~ must be called with several keywords arguments, called
+*attributes*.
+
+* Helm attributes
+
+An *attribute* determines Helm behavior.
+
+There are a large number of attributes in Helm; some are mandatory,
+while others are optional.
+
+NOTE: When creating sources you are using slots which are keywords
+describing how to build attributes, they have generally the same name
+as attributes but not always e.g the slot ~:data~ exists, but there is
+no such attribute.
+
+** Looking up Helm attributes
+
+To learn about /a single/ Helm attribute, use the documentation of the
+class you are using where all slots are documented.
+
+** Mandatory attributes
+
+You have to give at least a name to your source and a list of
+candidates. The list of candidates is given with a variable
+containing candidates, a function returning candidates or a list, the
+attribute depend on which class you are using, e.g candidates for sync
+sources, for in-buffer sources you have to build a buffer using
+~helm-init-candidates-in-buffer~ or for conveniency you can use the
+~:data~ slot which will build the candidate buffer for you. In async
+sources the candidates-process attribute is used which is a function
+with no arg that returns a process.
+
+** Optional, but important attributes
+
+** ~helm~ keywords
+
+*** ~:sources~
+
+Expects a source of the form:
+
+- Single source (alist)
+
+- Symbol naming the source
+
+- List of sources (alist or symbol)
+
+Where alists are the resulting value of functions building sources,
+that is all the ~helm-build-*~ function or the ~helm-make-source~
+function, don't use directly alists when writing sources. See
+examples in next section.
+
+*** ~:buffer~
+
+*Optional but important*.
+
+The value for the ~:buffer~ keyword helps the ~helm-resume~ command
+retrieve the Helm session.
+
+The name of the buffer should be prefixed with =helm= (e.g. =*helm
+Info*=). This is not mandatory, but it is good practice. It will,
+among other things, allow Helm to automatically hide the buffer.
+
+*** ~:input~
+
+The value for the ~:input~ keyword is used to pre-fill the input of
+the helm window.
+
+E.g. if the user is using helm to autocomplete and runs the
+autocomplete command, you could get the word at point and set ~:input~
+to that word. That word will then be pre-filled in the minibuffer.
+
+#+begin_src emacs-lisp
+ (defun my-autocomplete-command ()
+ (interactive)
+ (helm :sources 'my-source
+ :input (word-at-point)
+ :buffer "*helm my autocomplete command*"))
+#+end_src
+
+* Customizing Action Lists
+
+It's possible to change the default list of actions for various
+existing Helm commands. The actions are typically held in variables
+called ~helm-type-foo-actions~, for instance ~helm-type-file-actions~,
+so search apropos for those. Each action in the list is the usual cons
+of action label and action function.
+
+Another higher-level approach is to use a pre-defined function such as
+~helm-add-action-to-source~ or ~helm-add-action-to-source-if~. These
+functions accept an action label, action function, the source to
+modify (as a class symbol name, such as 'helm-source-ffiles), and for
+the latter, a predicate which determines if the action should be made
+available for the candidate under point.
+
+Also see ~helm-delete-action-from-source~, and
+~helm-source-add-action-to-source-if~.
+
+* Creating a Source
+
+Even if you can still create source with alists, helm provides
+convenient basic classes to build sources, and allow you to create
+your own classes that inherit from these basics classes.
+
+Here are the basic classes for creating a Helm source:
+
+- ~helm-source-sync~ :: Put candidates in a list
+
+- ~helm-source-in-buffer~ :: Put candidates in a buffer
+
+- ~helm-source-async~ :: Get candidates asynchronously using the
+ output of a process.
+
+- ~helm-source-dummy~ :: Use ~helm-pattern~ as candidate.
+
+- ~helm-source-in-file~ :: Get candidates from the lines of a named
+ file using ~helm-source-in-buffer~.
+
+For consistency, prefix your source names with =helm-source-=
+(e.g. ~helm-source-info-emacs~).
+
+For convenience, ~helm~ provide macros prefixed by =helm-build-= to
+build your sources quickly, see examples below.
+
+All the different slots are documented in docstring of each classes.
+
+** ~helm-source-sync~
+
+Put candidates in a list
+
+#+begin_src emacs-lisp
+ (helm-build-sync-source "test"
+ :candidates '(a b c d e))
+
+ (helm :sources (helm-build-sync-source "test"
+ :candidates '(a b c d e))
+ :buffer "*helm sync source*")
+#+end_src
+
+** ~helm-source-in-buffer~
+
+Put candidates in a buffer
+
+#+begin_src emacs-lisp
+ (helm-build-in-buffer-source "test1"
+ :data '(a b c d e))
+
+ (helm :sources (helm-build-in-buffer-source "test1"
+ :data '(a b c d e))
+ :buffer "*helm buffer source*")
+#+end_src
+
+** ~helm-source-async~
+
+Get candidates asynchronously using the output of a process.
+
+#+begin_src emacs-lisp
+ (helm :sources (helm-build-async-source "test2"
+ :candidates-process
+ (lambda ()
+ (start-process "echo" nil "echo" "a\nb\nc\nd\ne")))
+ :buffer "*helm async source*")
+#+end_src
+
+** ~helm-source-dummy~
+
+Use ~helm-pattern~ as candidate
+
+#+begin_src emacs-lisp
+ (defun helm/test-default-action (candidate)
+ (browse-url (format
+ "http://www.google.com/search?q=%s"
+ (url-hexify-string candidate))))
+
+ (helm :sources (helm-build-dummy-source "test"
+ :action '(("Google" . helm/test-default-action)))
+ :buffer "*helm test*")
+#+end_src
+
+** ~helm-source-in-file~
+
+Get candidates from the lines of a named file using
+~helm-source-in-buffer~.
+
+#+begin_src emacs-lisp
+ (helm :sources (helm-build-in-file-source
+ "test" "~/.emacs.d/init.el"
+ :action (lambda (candidate)
+ (let ((linum (with-helm-buffer
+ (get-text-property
+ 1 'helm-linum
+ (helm-get-selection nil 'withprop)))))
+ (find-file (with-helm-buffer
+ (helm-attr 'candidates-file)))
+ (goto-line linum))))
+ :buffer "*helm test*")
+
+#+end_src
+
+** Help
+
+To give a specific help to your Helm source, create a variable
+~helm-<my-source>-help-string~ and bind it in your source with the
+~helm-message~ slot. It will then appear when you use {{{kbd(C-h m)}}} or
+{{{kbd(C-c ?=)}}}.
+
+** Pre-filtering lines in a buffer
+
+Here's an example of an in-buffer source that pre-filters lines to
+those matching a certain regular expression. Then the pre-filtered
+lines are narrowed as the user types. This uses
+[[https://github.com/tarsius/hl-todo][hl-todo-mode]] which provide
+=hl-todo-regexp= but you could use any regexp to do the same thing.
+The =:init= function switches to the automatically created buffer,
+which is returned by ~(helm-candidate-buffer 'global)~, then it
+deletes uninteresting lines, after which Helm presents the remaining
+lines to the user. The =:get-line= function is changed to
+=buffer-substring= so that the properties are preserved in the
+=helm-buffer=.
+
+#+begin_src emacs-lisp
+ (defun helm-hl-todo-items ()
+ "Show `hl-todo'-keyword items in buffer."
+ (helm :sources (helm-build-in-buffer-source "hl-todo items"
+ :init (lambda ()
+ (with-current-buffer (helm-candidate-buffer 'global)
+ (insert (with-helm-current-buffer (buffer-string)))
+ (goto-char (point-min))
+ (delete-non-matching-lines hl-todo-regexp)))
+ :get-line #'buffer-substring)
+ :buffer "*helm hl-todo*"))
+#+end_src
+
+And it could be also written using the =:data= slot:
+
+#+begin_src emacs-lisp
+ (defun helm-hl-todo-items ()
+ "Show `hl-todo'-keyword items in buffer."
+ (helm :sources (helm-build-in-buffer-source "hl-todo items"
+ :data (current-buffer)
+ :candidate-transformer (lambda (candidates)
+ (cl-loop for c in candidates
+ when (string-match hl-todo-regexp c)
+ collect c))
+ :get-line #'buffer-substring)
+ :buffer "*helm hl-todo*"))
+#+end_src
+
+* Creating a Class
+
+** Create your own class inheriting from one of the main classes
+
+#+begin_src emacs-lisp
+ (defclass my-helm-class (helm-source-sync)
+ ((candidates :initform '("foo" "bar" "baz"))))
+
+ (helm :sources (helm-make-source "test" 'my-helm-class)
+ :buffer "*helm test*")
+
+#+end_src
+
+This is same as creating your source with:
+
+#+begin_src emacs-lisp
+ (helm :sources (helm-build-sync-source "test"
+ :candidates '("foo" "bar" "baz"))
+ :buffer "*helm test*")
+
+#+end_src
+
+** Create your own class and Inherit from one of helm-type classes
+
+Here an example from a helm user that store a list of favorite files
+in a file =~/.fav= to retrieve them quickly:
+
+#+begin_src emacs-lisp
+ (defclass helm-test-fav (helm-source-in-file helm-type-file)
+ ((candidates-file :initform "~/.fav")))
+
+ (helm :sources (helm-make-source "test" 'helm-test-fav)
+ :buffer "*helm test*")
+
+#+end_src
+
+*** Creating a new class using as parent a class inheriting itself from a ~helm-type-*~ class
+
+Sometimes, you may want to inherit from a class using itself a
+~helm-type-*~ class but with one or more attributes of this class
+slightly modified for your needs. You may think that you only need to
+create your new class inheriting from the class inheriting itself from
+the ~helm-type-*~ class, but this is not enough.
+
+Here how to do, reusing the example above we modify
+the actions predefined by helm-type-file:
+
+1. Create a fake class:
+
+ #+begin_src emacs-lisp
+ (defclass helm-override-test-fav (helm-source) ())
+ #+end_src
+
+2. Create a method for this class
+
+ This method is used as a ~:PRIMARY~ method, which mean that the
+ similar parent method, if some will not be used, in particular the
+ ~helm-source-in-file~ method which calls itself the
+ ~helm-source-in-buffer~ method, so to be sure these important
+ methods are used, use ~call-next-method~, see below.
+
+ #+begin_src emacs-lisp
+ (defmethod helm--setup-source ((source helm-override-test-fav))
+ (call-next-method)
+ (let ((actions (slot-value source 'action)))
+ (setf (slot-value source 'action)
+ (helm-append-at-nth (symbol-value actions)
+ '(("test" . ignore)) 1))))
+
+ #+end_src
+
+3. Create now your main class inheriting from your new overriding
+ class
+
+ #+begin_src emacs-lisp
+ (defclass helm-test-fav (helm-source-in-file helm-type-file helm-override-test-fav)
+ ((candidates-file :initform "~/.fav")))
+ #+end_src
+
+ Now when running helm with a source built from your new class you
+ should see the new action you have added in second position to the
+ other file action.
+
+** Create your source from your own class
+
+Once your class is created, you have to use ~helm-make-source~ to
+build your source.
+
+#+begin_src emacs-lisp
+ (helm-make-source "test" 'my-class :action 'foo [...other slots])
+#+end_src
+
+** Write your own helm-type class
+
+You will find several examples in the =helm-types.el=[fn:3] file.
+
+The main thing to remember is to create an empty class and fill it
+using two =defmethod= s, one empty which should be a primary method and
+one which is a before method, use for this the slots ~:primary~ and
+~:before~ of ~defmethod~. This allows you to override different slots
+of the inheriting type class in your new class.
+
+* Writing actions
+
+Actions are specified in the ~:action~ slot of your class, it is an
+alist composed of (ACTION_NAME . FUNCTION), it can be also a symbol
+defining a customizable action alist.
+
+#+begin_src elisp
+ (defcustom helm-source-foo
+ '(("Do this" . foo)
+ ("Do that" . bar))
+ "A customizable action list."
+ :group 'helm
+ :type '(alist :key-type string :value-type function))
+
+#+end_src
+
+It is recommended however to use ~helm-make-actions~ to define your
+actions easily, it allow also to create actions with condition, e.g
+
+#+begin_src emacs-lisp
+ (helm-make-actions "Do this"
+ 'foo
+ (lambda ()
+ (when (featurep 'something)
+ "Do that"))
+ 'bar)
+#+end_src
+
+* Writing persistent actions
+
+The way to specify persistent-action is to use the slot
+~:persistent-action~ to specify the function Helm will run when using
+{{{kbd(C-j)}}} or {{{kbd(C-z)}}}. If you don't specify this helm will
+run the first action of the action.
+
+You can also specify additional persistent actions, which must be
+bound to keys other than {{{kbd(C-j)}}} or {{{kbd(C-z)}}}.
+
+#+begin_src emacs-lisp
+ (defun helm-foo-persistent-action ()
+ "Bind a new persistent action 'foo-action to foo function.
+ foo function is an action function called with one arg candidate."
+ (interactive)
+ (with-helm-alive-p
+ ;; never split means to not split the helm window when executing
+ ;; this persistent action. If your source is using full frame you
+ ;; will want your helm buffer to split to display a buffer for the
+ ;; persistent action (if it needs one to display something).
+ (helm-attrset 'foo-action '(foo . never-split))
+ (helm-execute-persistent-action 'foo-action)))
+#+end_src
+
+Then you bind your new persistent action to something else than
+{{{kbd(C-j)}}} or {{{kbd(C-z)}}}.
+
+* COMMENT Conventions
+
+** TODO Class names
+
+Class names are currently a mess. Need to come up with a better
+convention.
+
+* Export Setup :noexport:
+
+#+setupfile: doc-setup.org
+# #+options: H:4
+
+#+export_file_name: helm-devel.texi
+
+#+texinfo_dir_category: Emacs Add-ons
+#+texinfo_dir_title: Helm Developer's Guide: (helm-devel)
+#+texinfo_dir_desc: Helm Developer's Guide
+
+* Footnotes
+
+[fn:1] http://blog.codinghorror.com/learn-to-read-the-source-luke/
+
+[fn:2] https://github.com/emacs-helm/helm/blob/master/helm-info.el
+
+[fn:3] https://github.com/emacs-helm/helm/blob/master/helm-types.el
+
+#+EXCLUDE_TAGS: TOC_3
diff --git a/doc/helm-epa.plantuml b/doc/helm-epa.plantuml
new file mode 100644
index 00000000..e36a1d93
--- /dev/null
+++ b/doc/helm-epa.plantuml
@@ -0,0 +1,24 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-epa'**\n\n
+"helm-source-sync" <|-- "helm-epa"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-epa" {
+ Allow building helm sources
+ for GPG keys.
+ ==
+ __ some interesting slots __
+ init
+ candidates
+ keymap
+ mode-line
+}
+note right of "helm-epa"
+ **helm-epa**:
+ Allow building helm sources
+ for GPG keys.
+end note
+@enduml
diff --git a/doc/helm-esh-source.plantuml b/doc/helm-esh-source.plantuml
new file mode 100644
index 00000000..56695822
--- /dev/null
+++ b/doc/helm-esh-source.plantuml
@@ -0,0 +1,26 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-esh-source'**\n\n
+"helm-source-sync" <|-- "helm-esh-source"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-esh-source" {
+ Helm class to define source
+ for Eshell completion.
+ ==
+ __ some interesting slots __
+ init
+ action
+ candidates
+ filtered-candidate-transformer
+ nohighlight
+ persistent-action
+}
+note right of "helm-esh-source"
+ **helm-esh-source**:
+ Helm class to define source
+ for Eshell completion.
+end note
+@enduml
diff --git a/doc/helm-eshell-history-source.plantuml b/doc/helm-eshell-history-source.plantuml
new file mode 100644
index 00000000..705822b6
--- /dev/null
+++ b/doc/helm-eshell-history-source.plantuml
@@ -0,0 +1,27 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-eshell-history-source'**\n\n
+"helm-source-sync" <|-- "helm-eshell-history-source"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-eshell-history-source" {
+ Helm class to define source
+ for Eshell history.
+ ==
+ __ some interesting slots __
+ init
+ action
+ candidate-number-limit
+ candidates
+ keymap
+ multiline
+ nomark
+}
+note right of "helm-eshell-history-source"
+ **helm-eshell-history-source**:
+ Helm class to define source
+ for Eshell history.
+end note
+@enduml
diff --git a/doc/helm-fd-class.plantuml b/doc/helm-fd-class.plantuml
new file mode 100644
index 00000000..7b128253
--- /dev/null
+++ b/doc/helm-fd-class.plantuml
@@ -0,0 +1,23 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-fd-class'**\n\n
+"helm-source-async" <|-- "helm-fd-class"
+class "helm-source-async"
+"helm-source" <|-- "helm-source-async"
+class "helm-source"
+class "helm-fd-class" {
+ __ some interesting slots __
+ action
+ candidate-number-limit
+ candidates-process
+ filtered-candidate-transformer
+ help-message
+ keymap
+ nohighlight
+ requires-pattern
+}
+note right of "helm-fd-class"
+ **helm-fd-class**
+end note
+@enduml
diff --git a/doc/helm-figures/helm-M-x-class.png b/doc/helm-figures/helm-M-x-class.png
new file mode 100644
index 00000000..0cc00239
--- /dev/null
+++ b/doc/helm-figures/helm-M-x-class.png
Binary files differ
diff --git a/doc/helm-figures/helm-M-x-class.svg b/doc/helm-figures/helm-M-x-class.svg
new file mode 100644
index 00000000..8578c890
--- /dev/null
+++ b/doc/helm-figures/helm-M-x-class.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="503px" preserveAspectRatio="none" style="width:453px;height:503px;" version="1.1" viewBox="0 0 453 503" width="453px" zoomAndPan="magnify"><defs><filter height="300%" id="f1h4wo8n7b46tq" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="109.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="163" x="148" y="37.6611">'helm-M-x-class'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="232.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="232.5" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#f1h4wo8n7b46tq)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="35" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="239.8125" y2="239.8125"/><!--MD5=[9bb915cdd04b5f6bf4c2c1633cbdfbdc]
+class helm-M-x-class--><rect fill="#FEFECE" filter="url(#f1h4wo8n7b46tq)" height="184.8516" id="helm-M-x-class" style="stroke: #A80036; stroke-width: 1.5;" width="184" x="92" y="307.8125"/><ellipse cx="128.6" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M131.5688,329.4531 Q130.9906,329.75 130.35,329.8906 Q129.7094,330.0469 129.0063,330.0469 Q126.5063,330.0469 125.1781,328.4063 Q123.8656,326.75 123.8656,323.625 Q123.8656,320.5 125.1781,318.8438 Q126.5063,317.1875 129.0063,317.1875 Q129.7094,317.1875 130.35,317.3438 Q131.0063,317.5 131.5688,317.7969 L131.5688,320.5156 Q130.9438,319.9375 130.35,319.6719 Q129.7563,319.3906 129.1313,319.3906 Q127.7875,319.3906 127.1,320.4688 Q126.4125,321.5313 126.4125,323.625 Q126.4125,325.7188 127.1,326.7969 Q127.7875,327.8594 129.1313,327.8594 Q129.7563,327.8594 130.35,327.5938 Q130.9438,327.3125 131.5688,326.7344 L131.5688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="104" x="147.4" y="327.9668">helm-M-x-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="93" x2="275" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="98" y="370.8276">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="98" y="383.6323">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="98" y="396.437">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="98" y="409.2417">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="98" y="422.0464">match-dynamic</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="98" y="434.8511">match-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="98" y="447.6558">migemo</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="98" y="460.4604">must-match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="43" x="98" y="473.2651">nomark</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="98" y="486.0698">persistent-help</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="93" x2="120.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="120.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="247.5" x2="275" y1="354.2148" y2="354.2148"/><!--MD5=[beabceb98eda0d1152a0edf286dc7000]
+class helm-type-command--><rect fill="#FEFECE" filter="url(#f1h4wo8n7b46tq)" height="48" id="helm-type-command" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="197.5" y="199.8125"/><ellipse cx="212.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M215.4688,221.4531 Q214.8906,221.75 214.25,221.8906 Q213.6094,222.0469 212.9063,222.0469 Q210.4063,222.0469 209.0781,220.4063 Q207.7656,218.75 207.7656,215.625 Q207.7656,212.5 209.0781,210.8438 Q210.4063,209.1875 212.9063,209.1875 Q213.6094,209.1875 214.25,209.3438 Q214.9063,209.5 215.4688,209.7969 L215.4688,212.5156 Q214.8438,211.9375 214.25,211.6719 Q213.6563,211.3906 213.0313,211.3906 Q211.6875,211.3906 211,212.4688 Q210.3125,213.5313 210.3125,215.625 Q210.3125,217.7188 211,218.7969 Q211.6875,219.8594 213.0313,219.8594 Q213.6563,219.8594 214.25,219.5938 Q214.8438,219.3125 215.4688,218.7344 L215.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="226.5" y="219.9668">helm-type-command</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="198.5" x2="371.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="198.5" x2="371.5" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1h4wo8n7b46tq)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="124.5" y="91.8125"/><ellipse cx="139.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M142.4688,113.4531 Q141.8906,113.75 141.25,113.8906 Q140.6094,114.0469 139.9063,114.0469 Q137.4063,114.0469 136.0781,112.4063 Q134.7656,110.75 134.7656,107.625 Q134.7656,104.5 136.0781,102.8438 Q137.4063,101.1875 139.9063,101.1875 Q140.6094,101.1875 141.25,101.3438 Q141.9063,101.5 142.4688,101.7969 L142.4688,104.5156 Q141.8438,103.9375 141.25,103.6719 Q140.6563,103.3906 140.0313,103.3906 Q138.6875,103.3906 138,104.4688 Q137.3125,105.5313 137.3125,107.625 Q137.3125,109.7188 138,110.7969 Q138.6875,111.8594 140.0313,111.8594 Q140.6563,111.8594 141.25,111.5938 Q141.8438,111.3125 142.4688,110.7344 L142.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="153.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="125.5" x2="242.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="125.5" x2="242.5" y1="131.8125" y2="131.8125"/><path d="M311,387.8125 L311,396.3125 L276.25,400.3125 L311,404.3125 L311,412.9453 A0,0 0 0 0 311,412.9453 L441,412.9453 A0,0 0 0 0 441,412.9453 L441,397.8125 L431,387.8125 L311,387.8125 A0,0 0 0 0 311,387.8125 " fill="#FBFB77" filter="url(#f1h4wo8n7b46tq)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M431,387.8125 L431,397.8125 L441,397.8125 L431,387.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="109" x="317" y="404.8794">helm-M-x-class</text><!--MD5=[9f4d7494bd3425cac0331b57ecd466c2]
+reverse link helm-source-sync to helm-M-x-class--><path d="M107.4,265.6325 C114.68,278.3525 123.03,292.9225 131.48,307.6625 " fill="none" id="helm-source-sync&lt;-helm-M-x-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="101.15,268.8225,97.28,247.9825,113.3,261.8525,101.15,268.8225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4ac71f6dd5cea0c13d2b9c31bc00a812]
+reverse link helm-type-command to helm-M-x-class--><path d="M261.37,265.6325 C254.01,278.3525 245.58,292.9225 237.05,307.6625 " fill="none" id="helm-type-command&lt;-helm-M-x-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="255.51,261.7925,271.59,247.9825,267.63,268.8025,255.51,261.7925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M148.38,154.5625 C134.24,169.5525 118.42,186.3225 106,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="143.49,149.5525,162.3,139.8125,153.67,159.1625,143.49,149.5525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[fde896bcedf28e4926ec99232971bb19]
+reverse link helm-source to helm-type-command--><path d="M219.97,154.5625 C234.26,169.5525 250.23,186.3225 262.78,199.4925 " fill="none" id="helm-source&lt;-helm-type-command" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="214.64,159.1225,205.92,139.8125,224.78,149.4625,214.64,159.1225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[fc36af632e2e01f2d6b385b81ddc32d9]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-M-x-class'**\n\n
+"helm-source-sync" <|- - "helm-M-x-class"
+"helm-type-command" <|- - "helm-M-x-class"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-type-command"
+"helm-source" <|- - "helm-type-command"
+class "helm-source"
+class "helm-M-x-class" {
+ __ some interesting slots __
+ candidates
+ filtered-candidate-transformer
+ help-message
+ keymap
+ match-dynamic
+ match-strict
+ migemo
+ must-match
+ nomark
+ persistent-help
+}
+note right of "helm-M-x-class"
+ **helm-M-x-class**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-M-x.png b/doc/helm-figures/helm-M-x.png
new file mode 100644
index 00000000..ed0ea23f
--- /dev/null
+++ b/doc/helm-figures/helm-M-x.png
Binary files differ
diff --git a/doc/helm-figures/helm-absolute-time-timers-class.png b/doc/helm-figures/helm-absolute-time-timers-class.png
new file mode 100644
index 00000000..cc199336
--- /dev/null
+++ b/doc/helm-figures/helm-absolute-time-timers-class.png
Binary files differ
diff --git a/doc/helm-figures/helm-absolute-time-timers-class.svg b/doc/helm-figures/helm-absolute-time-timers-class.svg
new file mode 100644
index 00000000..92c12460
--- /dev/null
+++ b/doc/helm-figures/helm-absolute-time-timers-class.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="452px" preserveAspectRatio="none" style="width:615px;height:452px;" version="1.1" viewBox="0 0 615 452" width="615px" zoomAndPan="magnify"><defs><filter height="300%" id="frhsxyrmuci7j" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="190.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="338" x="141.5" y="37.6611">'helm-absolute-time-timers-class'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="313.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="313.5" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#frhsxyrmuci7j)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="35" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="239.8125" y2="239.8125"/><!--MD5=[b0e60113aba2bebbe59d6cbba30a4a7f]
+class helm-absolute-time-timers-class--><rect fill="#FEFECE" filter="url(#frhsxyrmuci7j)" height="133.6328" id="helm-absolute-time-timers-class" style="stroke: #A80036; stroke-width: 1.5;" width="261" x="48.5" y="307.8125"/><ellipse cx="63.5" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M66.4688,329.4531 Q65.8906,329.75 65.25,329.8906 Q64.6094,330.0469 63.9063,330.0469 Q61.4063,330.0469 60.0781,328.4063 Q58.7656,326.75 58.7656,323.625 Q58.7656,320.5 60.0781,318.8438 Q61.4063,317.1875 63.9063,317.1875 Q64.6094,317.1875 65.25,317.3438 Q65.9063,317.5 66.4688,317.7969 L66.4688,320.5156 Q65.8438,319.9375 65.25,319.6719 Q64.6563,319.3906 64.0313,319.3906 Q62.6875,319.3906 62,320.4688 Q61.3125,321.5313 61.3125,323.625 Q61.3125,325.7188 62,326.7969 Q62.6875,327.8594 64.0313,327.8594 Q64.6563,327.8594 65.25,327.5938 Q65.8438,327.3125 66.4688,326.7344 L66.4688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="229" x="77.5" y="327.9668">helm-absolute-time-timers-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="49.5" x2="308.5" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="61" x="54.5" y="370.8276">allow-dups</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="128" x="54.5" y="383.6323">candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="54.5" y="396.437">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="54.5" y="409.2417">match-dynamic</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="54.5" y="422.0464">match-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="54.5" y="434.8511">migemo</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="49.5" x2="115.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="115.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="242.5" x2="308.5" y1="354.2148" y2="354.2148"/><!--MD5=[d89fbe3a66aa0ad58442d3fbb0e3c04d]
+class helm-type-timers--><rect fill="#FEFECE" filter="url(#frhsxyrmuci7j)" height="48" id="helm-type-timers" style="stroke: #A80036; stroke-width: 1.5;" width="153" x="197.5" y="199.8125"/><ellipse cx="212.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M215.4688,221.4531 Q214.8906,221.75 214.25,221.8906 Q213.6094,222.0469 212.9063,222.0469 Q210.4063,222.0469 209.0781,220.4063 Q207.7656,218.75 207.7656,215.625 Q207.7656,212.5 209.0781,210.8438 Q210.4063,209.1875 212.9063,209.1875 Q213.6094,209.1875 214.25,209.3438 Q214.9063,209.5 215.4688,209.7969 L215.4688,212.5156 Q214.8438,211.9375 214.25,211.6719 Q213.6563,211.3906 213.0313,211.3906 Q211.6875,211.3906 211,212.4688 Q210.3125,213.5313 210.3125,215.625 Q210.3125,217.7188 211,218.7969 Q211.6875,219.8594 213.0313,219.8594 Q213.6563,219.8594 214.25,219.5938 Q214.8438,219.3125 215.4688,218.7344 L215.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="121" x="226.5" y="219.9668">helm-type-timers</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="198.5" x2="349.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="198.5" x2="349.5" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#frhsxyrmuci7j)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="119.5" y="91.8125"/><ellipse cx="134.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M137.4688,113.4531 Q136.8906,113.75 136.25,113.8906 Q135.6094,114.0469 134.9063,114.0469 Q132.4063,114.0469 131.0781,112.4063 Q129.7656,110.75 129.7656,107.625 Q129.7656,104.5 131.0781,102.8438 Q132.4063,101.1875 134.9063,101.1875 Q135.6094,101.1875 136.25,101.3438 Q136.9063,101.5 137.4688,101.7969 L137.4688,104.5156 Q136.8438,103.9375 136.25,103.6719 Q135.6563,103.3906 135.0313,103.3906 Q133.6875,103.3906 133,104.4688 Q132.3125,105.5313 132.3125,107.625 Q132.3125,109.7188 133,110.7969 Q133.6875,111.8594 135.0313,111.8594 Q135.6563,111.8594 136.25,111.5938 Q136.8438,111.3125 137.4688,110.7344 L137.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="148.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="120.5" x2="237.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="120.5" x2="237.5" y1="131.8125" y2="131.8125"/><path d="M345,362.3125 L345,370.8125 L309.5,374.8125 L345,378.8125 L345,387.4453 A0,0 0 0 0 345,387.4453 L603,387.4453 A0,0 0 0 0 603,387.4453 L603,372.3125 L593,362.3125 L345,362.3125 A0,0 0 0 0 345,362.3125 " fill="#FBFB77" filter="url(#frhsxyrmuci7j)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M593,362.3125 L593,372.3125 L603,372.3125 L593,362.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="237" x="351" y="379.3794">helm-absolute-time-timers-class</text><!--MD5=[2dab3ea9bdbd523a70d6b4309b981517]
+reverse link helm-source-sync to helm-absolute-time-timers-class--><path d="M109.73,265.1725 C118.07,278.2525 127.56,293.1325 136.78,307.5925 " fill="none" id="helm-source-sync&lt;-helm-absolute-time-timers-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="103.69,268.7225,98.84,248.0925,115.5,261.1925,103.69,268.7225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[69966f233324ab1b41ca6bc5703528d7]
+reverse link helm-type-timers to helm-absolute-time-timers-class--><path d="M248.27,265.1725 C239.93,278.2525 230.44,293.1325 221.22,307.5925 " fill="none" id="helm-type-timers&lt;-helm-absolute-time-timers-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="242.5,261.1925,259.16,248.0925,254.31,268.7225,242.5,261.1925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M144.74,155.0425 C131.41,169.9125 116.58,186.4625 104.9,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="139.83,150.0325,158.39,139.8125,150.25,159.3825,139.83,150.0325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[687fc8ec140e945488f732dae3c46e2b]
+reverse link helm-source to helm-type-timers--><path d="M213.26,155.0425 C226.59,169.9125 241.42,186.4625 253.1,199.4925 " fill="none" id="helm-source&lt;-helm-type-timers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="207.75,159.3825,199.61,139.8125,218.17,150.0325,207.75,159.3825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[710b4b6be57474b21b724acdc029eeb8]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-absolute-time-timers-class'**\n\n
+"helm-source-sync" <|- - "helm-absolute-time-timers-class"
+"helm-type-timers" <|- - "helm-absolute-time-timers-class"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-type-timers"
+"helm-source" <|- - "helm-type-timers"
+class "helm-source"
+class "helm-absolute-time-timers-class" {
+ __ some interesting slots __
+ allow-dups
+ candidate-transformer
+ candidates
+ match-dynamic
+ match-strict
+ migemo
+}
+note right of "helm-absolute-time-timers-class"
+ **helm-absolute-time-timers-class**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-bookmark-find-files-class.png b/doc/helm-figures/helm-bookmark-find-files-class.png
new file mode 100644
index 00000000..41ed584b
--- /dev/null
+++ b/doc/helm-figures/helm-bookmark-find-files-class.png
Binary files differ
diff --git a/doc/helm-figures/helm-bookmark-find-files-class.svg b/doc/helm-figures/helm-bookmark-find-files-class.svg
new file mode 100644
index 00000000..a6bf3a11
--- /dev/null
+++ b/doc/helm-figures/helm-bookmark-find-files-class.svg
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="611px" preserveAspectRatio="none" style="width:712px;height:611px;" version="1.1" viewBox="0 0 712 611" width="712px" zoomAndPan="magnify"><defs><filter height="300%" id="fmq7r5c9ok2jd" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="239.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="323" x="198" y="37.6611">'helm-bookmark-find-files-class'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="362.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="362.5" y="79.5674"/><!--MD5=[1b5f639ef80bc5f44c8cc4600bf3e2e4]
+class helm-source-filtered-bookmarks--><rect fill="#FEFECE" filter="url(#fmq7r5c9ok2jd)" height="48" id="helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.5;" width="259" x="313.5" y="307.8125"/><ellipse cx="328.5" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M331.4688,329.4531 Q330.8906,329.75 330.25,329.8906 Q329.6094,330.0469 328.9063,330.0469 Q326.4063,330.0469 325.0781,328.4063 Q323.7656,326.75 323.7656,323.625 Q323.7656,320.5 325.0781,318.8438 Q326.4063,317.1875 328.9063,317.1875 Q329.6094,317.1875 330.25,317.3438 Q330.9063,317.5 331.4688,317.7969 L331.4688,320.5156 Q330.8438,319.9375 330.25,319.6719 Q329.6563,319.3906 329.0313,319.3906 Q327.6875,319.3906 327,320.4688 Q326.3125,321.5313 326.3125,323.625 Q326.3125,325.7188 327,326.7969 Q327.6875,327.8594 329.0313,327.8594 Q329.6563,327.8594 330.25,327.5938 Q330.8438,327.3125 331.4688,326.7344 L331.4688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="227" x="342.5" y="327.9668">helm-source-filtered-bookmarks</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="314.5" x2="571.5" y1="339.8125" y2="339.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="314.5" x2="571.5" y1="347.8125" y2="347.8125"/><!--MD5=[f325aa84e92746ce6f670c419a69be3e]
+class helm-bookmark-find-files-class--><rect fill="#FEFECE" filter="url(#fmq7r5c9ok2jd)" height="184.8516" id="helm-bookmark-find-files-class" style="stroke: #A80036; stroke-width: 1.5;" width="249" x="167.5" y="415.8125"/><ellipse cx="182.5" cy="431.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M185.4688,437.4531 Q184.8906,437.75 184.25,437.8906 Q183.6094,438.0469 182.9063,438.0469 Q180.4063,438.0469 179.0781,436.4063 Q177.7656,434.75 177.7656,431.625 Q177.7656,428.5 179.0781,426.8438 Q180.4063,425.1875 182.9063,425.1875 Q183.6094,425.1875 184.25,425.3438 Q184.9063,425.5 185.4688,425.7969 L185.4688,428.5156 Q184.8438,427.9375 184.25,427.6719 Q183.6563,427.3906 183.0313,427.3906 Q181.6875,427.3906 181,428.4688 Q180.3125,429.5313 180.3125,431.625 Q180.3125,433.7188 181,434.7969 Q181.6875,435.8594 183.0313,435.8594 Q183.6563,435.8594 184.25,435.5938 Q184.8438,435.3125 185.4688,434.7344 L185.4688,437.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="217" x="196.5" y="435.9668">helm-bookmark-find-files-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="168.5" x2="415.5" y1="447.8125" y2="447.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="173.5" y="478.8276">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="173.5" y="491.6323">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="25" x="173.5" y="504.437">data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="173.5" y="517.2417">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="173.5" y="530.0464">get-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="173.5" y="542.8511">match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="173.5" y="555.6558">migemo</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="173.5" y="568.4604">search</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="173.5" y="581.2651">search-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="40" x="173.5" y="594.0698">volatile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="168.5" x2="228.5" y1="462.2148" y2="462.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="228.5" y="465.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="355.5" x2="415.5" y1="462.2148" y2="462.2148"/><!--MD5=[1a4f21f1efd4e6c0dd550e1e5e387e5d]
+class helm-bookmark-override-inheritor--><rect fill="#FEFECE" filter="url(#fmq7r5c9ok2jd)" height="48" id="helm-bookmark-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="272" x="6" y="307.8125"/><ellipse cx="21" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,329.4531 Q23.3906,329.75 22.75,329.8906 Q22.1094,330.0469 21.4063,330.0469 Q18.9063,330.0469 17.5781,328.4063 Q16.2656,326.75 16.2656,323.625 Q16.2656,320.5 17.5781,318.8438 Q18.9063,317.1875 21.4063,317.1875 Q22.1094,317.1875 22.75,317.3438 Q23.4063,317.5 23.9688,317.7969 L23.9688,320.5156 Q23.3438,319.9375 22.75,319.6719 Q22.1563,319.3906 21.5313,319.3906 Q20.1875,319.3906 19.5,320.4688 Q18.8125,321.5313 18.8125,323.625 Q18.8125,325.7188 19.5,326.7969 Q20.1875,327.8594 21.5313,327.8594 Q22.1563,327.8594 22.75,327.5938 Q23.3438,327.3125 23.9688,326.7344 L23.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="35" y="327.9668">helm-bookmark-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="277" y1="339.8125" y2="339.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="277" y1="347.8125" y2="347.8125"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#fmq7r5c9ok2jd)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="195.5" y="199.8125"/><ellipse cx="210.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M213.4688,221.4531 Q212.8906,221.75 212.25,221.8906 Q211.6094,222.0469 210.9063,222.0469 Q208.4063,222.0469 207.0781,220.4063 Q205.7656,218.75 205.7656,215.625 Q205.7656,212.5 207.0781,210.8438 Q208.4063,209.1875 210.9063,209.1875 Q211.6094,209.1875 212.25,209.3438 Q212.9063,209.5 213.4688,209.7969 L213.4688,212.5156 Q212.8438,211.9375 212.25,211.6719 Q211.6563,211.3906 211.0313,211.3906 Q209.6875,211.3906 209,212.4688 Q208.3125,213.5313 208.3125,215.625 Q208.3125,217.7188 209,218.7969 Q209.6875,219.8594 211.0313,219.8594 Q211.6563,219.8594 212.25,219.5938 Q212.8438,219.3125 213.4688,218.7344 L213.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="224.5" y="219.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="196.5" x2="379.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="196.5" x2="379.5" y1="239.8125" y2="239.8125"/><!--MD5=[257e0c9decabcf296fc5e077c0fe3da7]
+class helm-type-bookmark--><rect fill="#FEFECE" filter="url(#fmq7r5c9ok2jd)" height="48" id="helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.5;" width="178" x="415" y="199.8125"/><ellipse cx="430" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M432.9688,221.4531 Q432.3906,221.75 431.75,221.8906 Q431.1094,222.0469 430.4063,222.0469 Q427.9063,222.0469 426.5781,220.4063 Q425.2656,218.75 425.2656,215.625 Q425.2656,212.5 426.5781,210.8438 Q427.9063,209.1875 430.4063,209.1875 Q431.1094,209.1875 431.75,209.3438 Q432.4063,209.5 432.9688,209.7969 L432.9688,212.5156 Q432.3438,211.9375 431.75,211.6719 Q431.1563,211.3906 430.5313,211.3906 Q429.1875,211.3906 428.5,212.4688 Q427.8125,213.5313 427.8125,215.625 Q427.8125,217.7188 428.5,218.7969 Q429.1875,219.8594 430.5313,219.8594 Q431.1563,219.8594 431.75,219.5938 Q432.3438,219.3125 432.9688,218.7344 L432.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="146" x="444" y="219.9668">helm-type-bookmark</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="416" x2="592" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="416" x2="592" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fmq7r5c9ok2jd)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="228.5" y="91.8125"/><ellipse cx="243.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M246.4688,113.4531 Q245.8906,113.75 245.25,113.8906 Q244.6094,114.0469 243.9063,114.0469 Q241.4063,114.0469 240.0781,112.4063 Q238.7656,110.75 238.7656,107.625 Q238.7656,104.5 240.0781,102.8438 Q241.4063,101.1875 243.9063,101.1875 Q244.6094,101.1875 245.25,101.3438 Q245.9063,101.5 246.4688,101.7969 L246.4688,104.5156 Q245.8438,103.9375 245.25,103.6719 Q244.6563,103.3906 244.0313,103.3906 Q242.6875,103.3906 242,104.4688 Q241.3125,105.5313 241.3125,107.625 Q241.3125,109.7188 242,110.7969 Q242.6875,111.8594 244.0313,111.8594 Q244.6563,111.8594 245.25,111.5938 Q245.8438,111.3125 246.4688,110.7344 L246.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="257.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="229.5" x2="346.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="229.5" x2="346.5" y1="131.8125" y2="131.8125"/><path d="M451.5,495.8125 L451.5,504.3125 L416.53,508.3125 L451.5,512.3125 L451.5,520.9453 A0,0 0 0 0 451.5,520.9453 L700.5,520.9453 A0,0 0 0 0 700.5,520.9453 L700.5,505.8125 L690.5,495.8125 L451.5,495.8125 A0,0 0 0 0 451.5,495.8125 " fill="#FBFB77" filter="url(#fmq7r5c9ok2jd)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M690.5,495.8125 L690.5,505.8125 L700.5,505.8125 L690.5,495.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="228" x="457.5" y="512.8794">helm-bookmark-find-files-class</text><!--MD5=[97418b6d899cd58bad59cfd77e9ec07d]
+reverse link helm-source-filtered-bookmarks to helm-bookmark-find-files-class--><path d="M409.6,371.4125 C398.15,384.6325 384.81,400.0525 371.31,415.6625 " fill="none" id="helm-source-filtered-bookmarks&lt;-helm-bookmark-find-files-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="404.57,366.5325,422.95,355.9825,415.15,375.6925,404.57,366.5325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[9dfed791578fb3f1a7675a563d26d6dc]
+reverse link helm-bookmark-override-inheritor to helm-bookmark-find-files-class--><path d="M175.18,371.4125 C186.55,384.6325 199.8,400.0525 213.21,415.6625 " fill="none" id="helm-bookmark-override-inheritor&lt;-helm-bookmark-find-files-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="169.65,375.7125,161.92,355.9825,180.26,366.5925,169.65,375.7125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[38d3222c9d6413d0e8be51642b02db5a]
+reverse link helm-source-in-buffer to helm-source-filtered-bookmarks--><path d="M338.47,259.3225 C361.63,275.1625 388.48,293.5225 409.17,307.6725 " fill="none" id="helm-source-in-buffer&lt;-helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="334.19,264.8825,321.63,247.8125,342.09,253.3225,334.19,264.8825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[36bf56344c9fb562b92d13c27d56d2e6]
+reverse link helm-type-bookmark to helm-source-filtered-bookmarks--><path d="M480.63,265.4225 C472.44,279.6625 463.52,295.1625 456.42,307.4925 " fill="none" id="helm-type-bookmark&lt;-helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="474.72,261.6525,490.76,247.8125,486.86,268.6425,474.72,261.6525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M288,159.8325 C288,173.3925 288,187.8525 288,199.4925 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="281,159.8125,288,139.8125,295,159.8125,281,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[b3073f519ff1e7a9af7ffffd7406ad63]
+reverse link helm-source to helm-type-bookmark--><path d="M353.15,148.7825 C386.55,165.1725 426.47,184.7625 456.85,199.6725 " fill="none" id="helm-source&lt;-helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="349.74,154.9125,334.87,139.8125,355.91,142.3425,349.74,154.9125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[116a0e90e894ac99238d97b5f2f654c6]
+reverse link helm-source to helm-bookmark-override-inheritor--><path d="M228.41,150.9325 C209.92,164.0925 191.01,180.6425 178,199.8125 C155.48,232.9925 147,279.8725 143.84,307.6225 " fill="none" id="helm-source&lt;-helm-bookmark-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="224.56,145.0925,245.08,139.8225,232.32,156.7325,224.56,145.0925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ba9011b5edb4004e6afe1680d0692147]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-bookmark-find-files-class'**\n\n
+"helm-source-filtered-bookmarks" <|- - "helm-bookmark-find-files-class"
+"helm-bookmark-override-inheritor" <|- - "helm-bookmark-find-files-class"
+class "helm-source-filtered-bookmarks"
+"helm-source-in-buffer" <|- - "helm-source-filtered-bookmarks"
+"helm-type-bookmark" <|- - "helm-source-filtered-bookmarks"
+class "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-type-bookmark"
+"helm-source" <|- - "helm-type-bookmark"
+class "helm-source"
+class "helm-bookmark-override-inheritor"
+"helm-source" <|- - "helm-bookmark-override-inheritor"
+class "helm-source"
+class "helm-bookmark-find-files-class" {
+ __ some interesting slots __
+ init
+ candidates
+ data
+ filtered-candidate-transformer
+ get-line
+ match
+ migemo
+ search
+ search-strict
+ volatile
+}
+note right of "helm-bookmark-find-files-class"
+ **helm-bookmark-find-files-class**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-bookmark-override-inheritor.png b/doc/helm-figures/helm-bookmark-override-inheritor.png
new file mode 100644
index 00000000..7d6a6123
--- /dev/null
+++ b/doc/helm-figures/helm-bookmark-override-inheritor.png
Binary files differ
diff --git a/doc/helm-figures/helm-bookmark-override-inheritor.svg b/doc/helm-figures/helm-bookmark-override-inheritor.svg
new file mode 100644
index 00000000..ff5b8ff8
--- /dev/null
+++ b/doc/helm-figures/helm-bookmark-override-inheritor.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="377px" preserveAspectRatio="none" style="width:595px;height:377px;" version="1.1" viewBox="0 0 595 377" width="595px" zoomAndPan="magnify"><defs><filter height="300%" id="f103vatub0c3t5" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="180.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="356" x="122.5" y="37.6611">'helm-bookmark-override-inheritor'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="303.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="303.5" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f103vatub0c3t5)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="82.5" y="91.8125"/><ellipse cx="97.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M100.4688,113.4531 Q99.8906,113.75 99.25,113.8906 Q98.6094,114.0469 97.9063,114.0469 Q95.4063,114.0469 94.0781,112.4063 Q92.7656,110.75 92.7656,107.625 Q92.7656,104.5 94.0781,102.8438 Q95.4063,101.1875 97.9063,101.1875 Q98.6094,101.1875 99.25,101.3438 Q99.9063,101.5 100.4688,101.7969 L100.4688,104.5156 Q99.8438,103.9375 99.25,103.6719 Q98.6563,103.3906 98.0313,103.3906 Q96.6875,103.3906 96,104.4688 Q95.3125,105.5313 95.3125,107.625 Q95.3125,109.7188 96,110.7969 Q96.6875,111.8594 98.0313,111.8594 Q98.6563,111.8594 99.25,111.5938 Q99.8438,111.3125 100.4688,110.7344 L100.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="111.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="83.5" x2="200.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="83.5" x2="200.5" y1="131.8125" y2="131.8125"/><!--MD5=[1a4f21f1efd4e6c0dd550e1e5e387e5d]
+class helm-bookmark-override-inheritor--><rect fill="#FEFECE" filter="url(#f103vatub0c3t5)" height="59.207" id="helm-bookmark-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="272" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="35" y="219.9668">helm-bookmark-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="277" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="78.5" y1="246.2148" y2="246.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="78.5" y="249.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="205.5" x2="277" y1="246.2148" y2="246.2148"/><path d="M313,216.8125 L313,225.3125 L278.27,229.3125 L313,233.3125 L313,241.9453 A0,0 0 0 0 313,241.9453 L583,241.9453 A0,0 0 0 0 583,241.9453 L583,226.8125 L573,216.8125 L313,216.8125 A0,0 0 0 0 313,216.8125 " fill="#FBFB77" filter="url(#f103vatub0c3t5)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M573,216.8125 L573,226.8125 L583,226.8125 L573,216.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="249" x="319" y="233.8794">helm-bookmark-override-inheritor</text><!--MD5=[f325aa84e92746ce6f670c419a69be3e]
+class helm-bookmark-find-files-class--><rect fill="#FEFECE" filter="url(#f103vatub0c3t5)" height="48" id="helm-bookmark-find-files-class" style="stroke: #A80036; stroke-width: 1.5;" width="249" x="17.5" y="318.8125"/><ellipse cx="32.5" cy="334.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M35.4688,340.4531 Q34.8906,340.75 34.25,340.8906 Q33.6094,341.0469 32.9063,341.0469 Q30.4063,341.0469 29.0781,339.4063 Q27.7656,337.75 27.7656,334.625 Q27.7656,331.5 29.0781,329.8438 Q30.4063,328.1875 32.9063,328.1875 Q33.6094,328.1875 34.25,328.3438 Q34.9063,328.5 35.4688,328.7969 L35.4688,331.5156 Q34.8438,330.9375 34.25,330.6719 Q33.6563,330.3906 33.0313,330.3906 Q31.6875,330.3906 31,331.4688 Q30.3125,332.5313 30.3125,334.625 Q30.3125,336.7188 31,337.7969 Q31.6875,338.8594 33.0313,338.8594 Q33.6563,338.8594 34.25,338.5938 Q34.8438,338.3125 35.4688,337.7344 L35.4688,340.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="217" x="46.5" y="338.9668">helm-bookmark-find-files-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="18.5" x2="265.5" y1="350.8125" y2="350.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="18.5" x2="265.5" y1="358.8125" y2="358.8125"/><!--MD5=[116a0e90e894ac99238d97b5f2f654c6]
+reverse link helm-source to helm-bookmark-override-inheritor--><path d="M142,160.1125 C142,173.3925 142,187.6525 142,199.6925 " fill="none" id="helm-source&lt;-helm-bookmark-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="135,159.9125,142,139.9125,149,159.9125,135,159.9125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[9dfed791578fb3f1a7675a563d26d6dc]
+reverse link helm-bookmark-override-inheritor to helm-bookmark-find-files-class--><path d="M142,279.0925 C142,292.9125 142,307.3025 142,318.8125 " fill="none" id="helm-bookmark-override-inheritor&lt;-helm-bookmark-find-files-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="135,279.0225,142,259.0225,149,279.0225,135,279.0225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[8386eea9400d4516d3d9e967cd5e0ba1]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-bookmark-override-inheritor'**\n\n
+"helm-source" <|- - "helm-bookmark-override-inheritor"
+class "helm-source"
+class "helm-bookmark-override-inheritor" {
+ __ some interesting slots __
+}
+note right of "helm-bookmark-override-inheritor"
+ **helm-bookmark-override-inheritor**
+end note
+"helm-bookmark-override-inheritor" <|- - "helm-bookmark-find-files-class"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-browse-project-override-inheritor.png b/doc/helm-figures/helm-browse-project-override-inheritor.png
new file mode 100644
index 00000000..1d012974
--- /dev/null
+++ b/doc/helm-figures/helm-browse-project-override-inheritor.png
Binary files differ
diff --git a/doc/helm-figures/helm-browse-project-override-inheritor.svg b/doc/helm-figures/helm-browse-project-override-inheritor.svg
new file mode 100644
index 00000000..ab8d2896
--- /dev/null
+++ b/doc/helm-figures/helm-browse-project-override-inheritor.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="485px" preserveAspectRatio="none" style="width:669px;height:485px;" version="1.1" viewBox="0 0 669 485" width="669px" zoomAndPan="magnify"><defs><filter height="300%" id="f1ozxeey48mq8s" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="217.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="408" x="133.5" y="37.6611">'helm-browse-project-override-inheritor'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="340.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="340.5" y="79.5674"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FEFECE" filter="url(#f1ozxeey48mq8s)" height="48" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="130" x="96" y="199.8125"/><ellipse cx="111" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M113.9688,221.4531 Q113.3906,221.75 112.75,221.8906 Q112.1094,222.0469 111.4063,222.0469 Q108.9063,222.0469 107.5781,220.4063 Q106.2656,218.75 106.2656,215.625 Q106.2656,212.5 107.5781,210.8438 Q108.9063,209.1875 111.4063,209.1875 Q112.1094,209.1875 112.75,209.3438 Q113.4063,209.5 113.9688,209.7969 L113.9688,212.5156 Q113.3438,211.9375 112.75,211.6719 Q112.1563,211.3906 111.5313,211.3906 Q110.1875,211.3906 109.5,212.4688 Q108.8125,213.5313 108.8125,215.625 Q108.8125,217.7188 109.5,218.7969 Q110.1875,219.8594 111.5313,219.8594 Q112.1563,219.8594 112.75,219.5938 Q113.3438,219.3125 113.9688,218.7344 L113.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="125" y="219.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="97" x2="225" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="97" x2="225" y1="239.8125" y2="239.8125"/><!--MD5=[473c7582700aad271b06bfe20c99b25e]
+class helm-browse-project-override-inheritor--><rect fill="#FEFECE" filter="url(#f1ozxeey48mq8s)" height="59.207" id="helm-browse-project-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="310" x="6" y="307.8125"/><ellipse cx="21" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,329.4531 Q23.3906,329.75 22.75,329.8906 Q22.1094,330.0469 21.4063,330.0469 Q18.9063,330.0469 17.5781,328.4063 Q16.2656,326.75 16.2656,323.625 Q16.2656,320.5 17.5781,318.8438 Q18.9063,317.1875 21.4063,317.1875 Q22.1094,317.1875 22.75,317.3438 Q23.4063,317.5 23.9688,317.7969 L23.9688,320.5156 Q23.3438,319.9375 22.75,319.6719 Q22.1563,319.3906 21.5313,319.3906 Q20.1875,319.3906 19.5,320.4688 Q18.8125,321.5313 18.8125,323.625 Q18.8125,325.7188 19.5,326.7969 Q20.1875,327.8594 21.5313,327.8594 Q22.1563,327.8594 22.75,327.5938 Q23.3438,327.3125 23.9688,326.7344 L23.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="278" x="35" y="327.9668">helm-browse-project-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="315" y1="339.8125" y2="339.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="97.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="97.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="224.5" x2="315" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1ozxeey48mq8s)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="101.5" y="91.8125"/><ellipse cx="116.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M119.4688,113.4531 Q118.8906,113.75 118.25,113.8906 Q117.6094,114.0469 116.9063,114.0469 Q114.4063,114.0469 113.0781,112.4063 Q111.7656,110.75 111.7656,107.625 Q111.7656,104.5 113.0781,102.8438 Q114.4063,101.1875 116.9063,101.1875 Q117.6094,101.1875 118.25,101.3438 Q118.9063,101.5 119.4688,101.7969 L119.4688,104.5156 Q118.8438,103.9375 118.25,103.6719 Q117.6563,103.3906 117.0313,103.3906 Q115.6875,103.3906 115,104.4688 Q114.3125,105.5313 114.3125,107.625 Q114.3125,109.7188 115,110.7969 Q115.6875,111.8594 117.0313,111.8594 Q117.6563,111.8594 118.25,111.5938 Q118.8438,111.3125 119.4688,110.7344 L119.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="130.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="102.5" x2="219.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="102.5" x2="219.5" y1="131.8125" y2="131.8125"/><path d="M351,324.8125 L351,333.3125 L316.09,337.3125 L351,341.3125 L351,349.9453 A0,0 0 0 0 351,349.9453 L657,349.9453 A0,0 0 0 0 657,349.9453 L657,334.8125 L647,324.8125 L351,324.8125 A0,0 0 0 0 351,324.8125 " fill="#FBFB77" filter="url(#f1ozxeey48mq8s)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M647,324.8125 L647,334.8125 L657,334.8125 L647,324.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="285" x="357" y="341.8794">helm-browse-project-override-inheritor</text><!--MD5=[c55ffa29bbb752794a043d0ccea5fc00]
+class helm-browse-project-source--><rect fill="#FEFECE" filter="url(#f1ozxeey48mq8s)" height="48" id="helm-browse-project-source" style="stroke: #A80036; stroke-width: 1.5;" width="232" x="45" y="426.8125"/><ellipse cx="60" cy="442.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M62.9688,448.4531 Q62.3906,448.75 61.75,448.8906 Q61.1094,449.0469 60.4063,449.0469 Q57.9063,449.0469 56.5781,447.4063 Q55.2656,445.75 55.2656,442.625 Q55.2656,439.5 56.5781,437.8438 Q57.9063,436.1875 60.4063,436.1875 Q61.1094,436.1875 61.75,436.3438 Q62.4063,436.5 62.9688,436.7969 L62.9688,439.5156 Q62.3438,438.9375 61.75,438.6719 Q61.1563,438.3906 60.5313,438.3906 Q59.1875,438.3906 58.5,439.4688 Q57.8125,440.5313 57.8125,442.625 Q57.8125,444.7188 58.5,445.7969 Q59.1875,446.8594 60.5313,446.8594 Q61.1563,446.8594 61.75,446.5938 Q62.3438,446.3125 62.9688,445.7344 L62.9688,448.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="200" x="74" y="446.9668">helm-browse-project-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="46" x2="276" y1="458.8125" y2="458.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="46" x2="276" y1="466.8125" y2="466.8125"/><!--MD5=[7dce46f1711674df8238e0c6e8679f53]
+reverse link helm-type-file to helm-browse-project-override-inheritor--><path d="M161,268.1125 C161,281.3925 161,295.6525 161,307.6925 " fill="none" id="helm-type-file&lt;-helm-browse-project-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="154,267.9125,161,247.9125,168,267.9125,154,267.9125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M161,159.8325 C161,173.3925 161,187.8525 161,199.4925 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="154,159.8125,161,139.8125,168,159.8125,154,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ae9062e7e7a1f661ae844e732112097a]
+reverse link helm-browse-project-override-inheritor to helm-browse-project-source--><path d="M161,387.0925 C161,400.9125 161,415.3025 161,426.8125 " fill="none" id="helm-browse-project-override-inheritor&lt;-helm-browse-project-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="154,387.0225,161,367.0225,168,387.0225,154,387.0225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[9280fc60a99543fe01d9bf3d768540ab]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-browse-project-override-inheritor'**\n\n
+"helm-type-file" <|- - "helm-browse-project-override-inheritor"
+class "helm-type-file"
+"helm-source" <|- - "helm-type-file"
+class "helm-source"
+class "helm-browse-project-override-inheritor" {
+ __ some interesting slots __
+}
+note right of "helm-browse-project-override-inheritor"
+ **helm-browse-project-override-inheritor**
+end note
+"helm-browse-project-override-inheritor" <|- - "helm-browse-project-source"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-browse-project-source.png b/doc/helm-figures/helm-browse-project-source.png
new file mode 100644
index 00000000..5182ddef
--- /dev/null
+++ b/doc/helm-figures/helm-browse-project-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-browse-project-source.svg b/doc/helm-figures/helm-browse-project-source.svg
new file mode 100644
index 00000000..a28627c6
--- /dev/null
+++ b/doc/helm-figures/helm-browse-project-source.svg
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="683px" preserveAspectRatio="none" style="width:634px;height:683px;" version="1.1" viewBox="0 0 634 683" width="634px" zoomAndPan="magnify"><defs><filter height="300%" id="ftdivzno2782h" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="200" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="295" x="172.5" y="37.6611">'helm-browse-project-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="323" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="323" y="79.5674"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#ftdivzno2782h)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="6" y="307.8125"/><ellipse cx="21" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,329.4531 Q23.3906,329.75 22.75,329.8906 Q22.1094,330.0469 21.4063,330.0469 Q18.9063,330.0469 17.5781,328.4063 Q16.2656,326.75 16.2656,323.625 Q16.2656,320.5 17.5781,318.8438 Q18.9063,317.1875 21.4063,317.1875 Q22.1094,317.1875 22.75,317.3438 Q23.4063,317.5 23.9688,317.7969 L23.9688,320.5156 Q23.3438,319.9375 22.75,319.6719 Q22.1563,319.3906 21.5313,319.3906 Q20.1875,319.3906 19.5,320.4688 Q18.8125,321.5313 18.8125,323.625 Q18.8125,325.7188 19.5,326.7969 Q20.1875,327.8594 21.5313,327.8594 Q22.1563,327.8594 22.75,327.5938 Q23.3438,327.3125 23.9688,326.7344 L23.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="35" y="327.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="339.8125" y2="339.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="347.8125" y2="347.8125"/><!--MD5=[c55ffa29bbb752794a043d0ccea5fc00]
+class helm-browse-project-source--><rect fill="#FEFECE" filter="url(#ftdivzno2782h)" height="256.875" id="helm-browse-project-source" style="stroke: #A80036; stroke-width: 1.5;" width="232" x="123.5" y="415.8125"/><ellipse cx="138.5" cy="431.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M141.4688,437.4531 Q140.8906,437.75 140.25,437.8906 Q139.6094,438.0469 138.9063,438.0469 Q136.4063,438.0469 135.0781,436.4063 Q133.7656,434.75 133.7656,431.625 Q133.7656,428.5 135.0781,426.8438 Q136.4063,425.1875 138.9063,425.1875 Q139.6094,425.1875 140.25,425.3438 Q140.9063,425.5 141.4688,425.7969 L141.4688,428.5156 Q140.8438,427.9375 140.25,427.6719 Q139.6563,427.3906 139.0313,427.3906 Q137.6875,427.3906 137,428.4688 Q136.3125,429.5313 136.3125,431.625 Q136.3125,433.7188 137,434.7969 Q137.6875,435.8594 139.0313,435.8594 Q139.6563,435.8594 140.25,435.5938 Q140.8438,435.3125 141.4688,434.7344 L141.4688,437.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="200" x="152.5" y="435.9668">helm-browse-project-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="124.5" x2="354.5" y1="447.8125" y2="447.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="129.5" y="462.0229">Class to define a source in</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="177" x="129.5" y="474.8276">`helm-browse-project' handling</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="21" x="129.5" y="487.6323">non</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="124.5" x2="354.5" y1="494.2266" y2="494.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="124.5" x2="354.5" y1="496.2266" y2="496.2266"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="129.5" y="525.2417">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="129.5" y="538.0464">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="25" x="129.5" y="550.8511">data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="129.5" y="563.6558">filter-one-by-one</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="129.5" y="576.4604">get-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="129.5" y="589.2651">match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="129.5" y="602.0698">match-part</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="129.5" y="614.8745">migemo</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="129.5" y="627.6792">root-dir</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="129.5" y="640.4839">search</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="129.5" y="653.2886">search-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="40" x="129.5" y="666.0933">volatile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="124.5" x2="176" y1="508.6289" y2="508.6289"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="176" y="511.937">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="303" x2="354.5" y1="508.6289" y2="508.6289"/><!--MD5=[473c7582700aad271b06bfe20c99b25e]
+class helm-browse-project-override-inheritor--><rect fill="#FEFECE" filter="url(#ftdivzno2782h)" height="48" id="helm-browse-project-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="310" x="226.5" y="307.8125"/><ellipse cx="241.5" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M244.4688,329.4531 Q243.8906,329.75 243.25,329.8906 Q242.6094,330.0469 241.9063,330.0469 Q239.4063,330.0469 238.0781,328.4063 Q236.7656,326.75 236.7656,323.625 Q236.7656,320.5 238.0781,318.8438 Q239.4063,317.1875 241.9063,317.1875 Q242.6094,317.1875 243.25,317.3438 Q243.9063,317.5 244.4688,317.7969 L244.4688,320.5156 Q243.8438,319.9375 243.25,319.6719 Q242.6563,319.3906 242.0313,319.3906 Q240.6875,319.3906 240,320.4688 Q239.3125,321.5313 239.3125,323.625 Q239.3125,325.7188 240,326.7969 Q240.6875,327.8594 242.0313,327.8594 Q242.6563,327.8594 243.25,327.5938 Q243.8438,327.3125 244.4688,326.7344 L244.4688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="278" x="255.5" y="327.9668">helm-browse-project-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="227.5" x2="535.5" y1="339.8125" y2="339.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="227.5" x2="535.5" y1="347.8125" y2="347.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#ftdivzno2782h)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="180" y="91.8125"/><ellipse cx="195" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M197.9688,113.4531 Q197.3906,113.75 196.75,113.8906 Q196.1094,114.0469 195.4063,114.0469 Q192.9063,114.0469 191.5781,112.4063 Q190.2656,110.75 190.2656,107.625 Q190.2656,104.5 191.5781,102.8438 Q192.9063,101.1875 195.4063,101.1875 Q196.1094,101.1875 196.75,101.3438 Q197.4063,101.5 197.9688,101.7969 L197.9688,104.5156 Q197.3438,103.9375 196.75,103.6719 Q196.1563,103.3906 195.5313,103.3906 Q194.1875,103.3906 193.5,104.4688 Q192.8125,105.5313 192.8125,107.625 Q192.8125,109.7188 193.5,110.7969 Q194.1875,111.8594 195.5313,111.8594 Q196.1563,111.8594 196.75,111.5938 Q197.3438,111.3125 197.9688,110.7344 L197.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="209" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="181" x2="298" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="181" x2="298" y1="131.8125" y2="131.8125"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FEFECE" filter="url(#ftdivzno2782h)" height="48" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="130" x="274.5" y="199.8125"/><ellipse cx="289.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M292.4688,221.4531 Q291.8906,221.75 291.25,221.8906 Q290.6094,222.0469 289.9063,222.0469 Q287.4063,222.0469 286.0781,220.4063 Q284.7656,218.75 284.7656,215.625 Q284.7656,212.5 286.0781,210.8438 Q287.4063,209.1875 289.9063,209.1875 Q290.6094,209.1875 291.25,209.3438 Q291.9063,209.5 292.4688,209.7969 L292.4688,212.5156 Q291.8438,211.9375 291.25,211.6719 Q290.6563,211.3906 290.0313,211.3906 Q288.6875,211.3906 288,212.4688 Q287.3125,213.5313 287.3125,215.625 Q287.3125,217.7188 288,218.7969 Q288.6875,219.8594 290.0313,219.8594 Q290.6563,219.8594 291.25,219.5938 Q291.8438,219.3125 292.4688,218.7344 L292.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="303.5" y="219.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="275.5" x2="403.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="275.5" x2="403.5" y1="239.8125" y2="239.8125"/><path d="M391,508.8125 L391,540.3125 L355.53,544.3125 L391,548.3125 L391,579.3438 A0,0 0 0 0 391,579.3438 L622,579.3438 A0,0 0 0 0 622,579.3438 L622,518.8125 L612,508.8125 L391,508.8125 A0,0 0 0 0 391,508.8125 " fill="#FBFB77" filter="url(#ftdivzno2782h)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M612,508.8125 L612,518.8125 L622,518.8125 L612,508.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="206" x="397" y="525.8794">helm-browse-project-source</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="603" y="525.8794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="168" x="397" y="541.0122">Class to define a source in</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="199" x="397" y="556.145">`helm-browse-project' handling</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="24" x="397" y="571.2778">non</text><!--MD5=[bab36c04217b3237bb981b2ca6f1bcf5]
+reverse link helm-source-in-buffer to helm-browse-project-source--><path d="M125.42,373.0025 C133.88,385.6225 143.71,400.3025 153.98,415.6425 " fill="none" id="helm-source-in-buffer&lt;-helm-browse-project-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="119.44,376.6525,114.13,356.1425,131.07,368.8625,119.44,376.6525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ae9062e7e7a1f661ae844e732112097a]
+reverse link helm-browse-project-override-inheritor to helm-browse-project-source--><path d="M354.39,373.0025 C345.87,385.6225 335.97,400.3025 325.62,415.6425 " fill="none" id="helm-browse-project-override-inheritor&lt;-helm-browse-project-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="348.77,368.8125,365.76,356.1425,360.38,376.6425,348.77,368.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M213.12,156.8525 C183.86,201.2525 137.67,271.3725 113.84,307.5325 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="207.29,152.9725,224.14,140.1225,218.98,160.6725,207.29,152.9725" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7dce46f1711674df8238e0c6e8679f53]
+reverse link helm-type-file to helm-browse-project-override-inheritor--><path d="M356.16,266.8725 C361.64,280.7025 367.54,295.5725 372.26,307.4925 " fill="none" id="helm-type-file&lt;-helm-browse-project-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="349.47,268.9825,348.61,247.8125,362.49,263.8325,349.47,268.9825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M275.12,154.5625 C289.26,169.5525 305.08,186.3225 317.5,199.4925 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="269.83,159.1625,261.2,139.8125,280.01,149.5525,269.83,159.1625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[28bc3dc24ed232881c88a83b119a839d]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-browse-project-source'**\n\n
+"helm-source-in-buffer" <|- - "helm-browse-project-source"
+"helm-browse-project-override-inheritor" <|- - "helm-browse-project-source"
+class "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-browse-project-override-inheritor"
+"helm-type-file" <|- - "helm-browse-project-override-inheritor"
+class "helm-type-file"
+"helm-source" <|- - "helm-type-file"
+class "helm-source"
+class "helm-browse-project-source" {
+ Class to define a source in
+ `helm-browse-project' handling
+ non
+ ==
+ __ some interesting slots __
+ init
+ candidates
+ data
+ filter-one-by-one
+ get-line
+ match
+ match-part
+ migemo
+ root-dir
+ search
+ search-strict
+ volatile
+}
+note right of "helm-browse-project-source"
+ **helm-browse-project-source**:
+ Class to define a source in
+ `helm-browse-project' handling
+ non
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-classes.png b/doc/helm-figures/helm-classes.png
new file mode 100644
index 00000000..973ef01b
--- /dev/null
+++ b/doc/helm-figures/helm-classes.png
Binary files differ
diff --git a/doc/helm-figures/helm-classes.svg b/doc/helm-figures/helm-classes.svg
new file mode 100644
index 00000000..9823ce7d
--- /dev/null
+++ b/doc/helm-figures/helm-classes.svg
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1063px" preserveAspectRatio="none" style="width:3873px;height:1063px;" version="1.1" viewBox="0 0 3873 1063" width="3873px" zoomAndPan="magnify"><defs><filter height="300%" id="fvi1fky2n6wnd" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="24" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="321" x="1782" y="22.2773">Classes in library 'Helm'</text><text fill="#000000" font-family="sans-serif" font-size="24" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="0" x="1946.5" y="50.2148"/><text fill="#000000" font-family="sans-serif" font-size="24" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="0" x="1946.5" y="78.1523"/><!--MD5=[8ce10cd09361e4167f55d438848e6970]
+cluster Other classes similar to 'helm-fd-class'--><polygon fill="#FFFFFF" filter="url(#fvi1fky2n6wnd)" points="22,501.8125,333,501.8125,340,524.1094,343,524.1094,343,835.8125,22,835.8125,22,501.8125" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="22" x2="340" y1="524.1094" y2="524.1094"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="305" x="26" y="516.8076">Other classes similar to 'helm-fd-class'</text><!--MD5=[1d7d7e4c89e9aed475db4e8e47094d84]
+cluster Other classes similar to 'helm-absolute-time-timers-class'--><polygon fill="#FFFFFF" filter="url(#fvi1fky2n6wnd)" points="2468,501.8125,2927,501.8125,2934,524.1094,2937,524.1094,2937,600.8125,2468,600.8125,2468,501.8125" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="2468" x2="2934" y1="524.1094" y2="524.1094"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="453" x="2472" y="516.8076">Other classes similar to 'helm-absolute-time-timers-class'</text><!--MD5=[64376e55737c45266b98e7ea58f0e433]
+cluster Other classes similar to 'helm-source-session-class'--><polygon fill="#FFFFFF" filter="url(#fvi1fky2n6wnd)" points="2961,501.8125,3378,501.8125,3385,524.1094,3388,524.1094,3388,1051.8125,2961,1051.8125,2961,501.8125" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="2961" x2="3385" y1="524.1094" y2="524.1094"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="411" x="2965" y="516.8076">Other classes similar to 'helm-source-session-class'</text><!--MD5=[5fb8059fef4bce7eccbf3235476dbc4c]
+cluster Other classes similar to 'helm-files-dired-source'--><polygon fill="#FFFFFF" filter="url(#fvi1fky2n6wnd)" points="1786,501.8125,2176,501.8125,2183,524.1094,2186,524.1094,2186,727.8125,1786,727.8125,1786,501.8125" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1786" x2="2183" y1="524.1094" y2="524.1094"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="384" x="1790" y="516.8076">Other classes similar to 'helm-files-dired-source'</text><!--MD5=[909ed6805a604b57f4d669b1baed76e3]
+cluster Other classes similar to 'helm-source-in-file'--><polygon fill="#FFFFFF" filter="url(#fvi1fky2n6wnd)" points="1357,501.8125,1711,501.8125,1718,524.1094,1721,524.1094,1721,1051.8125,1357,1051.8125,1357,501.8125" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="1357" x2="1718" y1="524.1094" y2="524.1094"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="348" x="1361" y="516.8076">Other classes similar to 'helm-source-in-file'</text><!--MD5=[1441e299cd506ca9dbbc97dd119b1228]
+cluster Other classes similar to 'helm-source-dummy'--><polygon fill="#FFFFFF" filter="url(#fvi1fky2n6wnd)" points="3474,355.8125,3841,355.8125,3848,378.1094,3851,378.1094,3851,454.8125,3474,454.8125,3474,355.8125" style="stroke: #000000; stroke-width: 1.5;"/><line style="stroke: #000000; stroke-width: 1.5;" x1="3474" x2="3848" y1="378.1094" y2="378.1094"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="361" x="3478" y="370.8076">Other classes similar to 'helm-source-dummy'</text><!--MD5=[91bb0adfdf7bf369d8d23bbe4e952f89]
+class helm-grep-class--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-grep-class" style="stroke: #A80036; stroke-width: 1.5;" width="145" x="109.5" y="536.8125"/><ellipse cx="124.5" cy="552.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M127.4688,558.4531 Q126.8906,558.75 126.25,558.8906 Q125.6094,559.0469 124.9063,559.0469 Q122.4063,559.0469 121.0781,557.4063 Q119.7656,555.75 119.7656,552.625 Q119.7656,549.5 121.0781,547.8438 Q122.4063,546.1875 124.9063,546.1875 Q125.6094,546.1875 126.25,546.3438 Q126.9063,546.5 127.4688,546.7969 L127.4688,549.5156 Q126.8438,548.9375 126.25,548.6719 Q125.6563,548.3906 125.0313,548.3906 Q123.6875,548.3906 123,549.4688 Q122.3125,550.5313 122.3125,552.625 Q122.3125,554.7188 123,555.7969 Q123.6875,556.8594 125.0313,556.8594 Q125.6563,556.8594 126.25,556.5938 Q126.8438,556.3125 127.4688,555.7344 L127.4688,558.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="113" x="138.5" y="556.9668">helm-grep-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="110.5" x2="253.5" y1="568.8125" y2="568.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="110.5" x2="253.5" y1="576.8125" y2="576.8125"/><!--MD5=[48c627d917d22eb9e4865aed3bf653fb]
+class helm-grep-ag-class--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-grep-ag-class" style="stroke: #A80036; stroke-width: 1.5;" width="168" x="98" y="663.8125"/><ellipse cx="113" cy="679.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M115.9688,685.4531 Q115.3906,685.75 114.75,685.8906 Q114.1094,686.0469 113.4063,686.0469 Q110.9063,686.0469 109.5781,684.4063 Q108.2656,682.75 108.2656,679.625 Q108.2656,676.5 109.5781,674.8438 Q110.9063,673.1875 113.4063,673.1875 Q114.1094,673.1875 114.75,673.3438 Q115.4063,673.5 115.9688,673.7969 L115.9688,676.5156 Q115.3438,675.9375 114.75,675.6719 Q114.1563,675.3906 113.5313,675.3906 Q112.1875,675.3906 111.5,676.4688 Q110.8125,677.5313 110.8125,679.625 Q110.8125,681.7188 111.5,682.7969 Q112.1875,683.8594 113.5313,683.8594 Q114.1563,683.8594 114.75,683.5938 Q115.3438,683.3125 115.9688,682.7344 L115.9688,685.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="136" x="127" y="683.9668">helm-grep-ag-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="99" x2="265" y1="695.8125" y2="695.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="99" x2="265" y1="703.8125" y2="703.8125"/><!--MD5=[d36bc6d3d79507f675f4471be5eaf52f]
+class helm-gid-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-gid-source" style="stroke: #A80036; stroke-width: 1.5;" width="146" x="109" y="771.8125"/><ellipse cx="124" cy="787.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M126.9688,793.4531 Q126.3906,793.75 125.75,793.8906 Q125.1094,794.0469 124.4063,794.0469 Q121.9063,794.0469 120.5781,792.4063 Q119.2656,790.75 119.2656,787.625 Q119.2656,784.5 120.5781,782.8438 Q121.9063,781.1875 124.4063,781.1875 Q125.1094,781.1875 125.75,781.3438 Q126.4063,781.5 126.9688,781.7969 L126.9688,784.5156 Q126.3438,783.9375 125.75,783.6719 Q125.1563,783.3906 124.5313,783.3906 Q123.1875,783.3906 122.5,784.4688 Q121.8125,785.5313 121.8125,787.625 Q121.8125,789.7188 122.5,790.7969 Q123.1875,791.8594 124.5313,791.8594 Q125.1563,791.8594 125.75,791.5938 Q126.3438,791.3125 126.9688,790.7344 L126.9688,793.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="114" x="138" y="791.9668">helm-gid-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="110" x2="254" y1="803.8125" y2="803.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="110" x2="254" y1="811.8125" y2="811.8125"/><!--MD5=[65c9e2a5e033ac2de329b35010304c74]
+class helm-idle-time-timers-class--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-idle-time-timers-class" style="stroke: #A80036; stroke-width: 1.5;" width="224" x="2576" y="536.8125"/><ellipse cx="2591" cy="552.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2593.9688,558.4531 Q2593.3906,558.75 2592.75,558.8906 Q2592.1094,559.0469 2591.4063,559.0469 Q2588.9063,559.0469 2587.5781,557.4063 Q2586.2656,555.75 2586.2656,552.625 Q2586.2656,549.5 2587.5781,547.8438 Q2588.9063,546.1875 2591.4063,546.1875 Q2592.1094,546.1875 2592.75,546.3438 Q2593.4063,546.5 2593.9688,546.7969 L2593.9688,549.5156 Q2593.3438,548.9375 2592.75,548.6719 Q2592.1563,548.3906 2591.5313,548.3906 Q2590.1875,548.3906 2589.5,549.4688 Q2588.8125,550.5313 2588.8125,552.625 Q2588.8125,554.7188 2589.5,555.7969 Q2590.1875,556.8594 2591.5313,556.8594 Q2592.1563,556.8594 2592.75,556.5938 Q2593.3438,556.3125 2593.9688,555.7344 L2593.9688,558.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="192" x="2605" y="556.9668">helm-idle-time-timers-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2577" x2="2799" y1="568.8125" y2="568.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2577" x2="2799" y1="576.8125" y2="576.8125"/><!--MD5=[75687e4369f49c6cba1a6ff12ff0e7fa]
+class helm-epa--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-epa" style="stroke: #A80036; stroke-width: 1.5;" width="98" x="2990" y="536.8125"/><ellipse cx="3005" cy="552.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M3007.9688,558.4531 Q3007.3906,558.75 3006.75,558.8906 Q3006.1094,559.0469 3005.4063,559.0469 Q3002.9063,559.0469 3001.5781,557.4063 Q3000.2656,555.75 3000.2656,552.625 Q3000.2656,549.5 3001.5781,547.8438 Q3002.9063,546.1875 3005.4063,546.1875 Q3006.1094,546.1875 3006.75,546.3438 Q3007.4063,546.5 3007.9688,546.7969 L3007.9688,549.5156 Q3007.3438,548.9375 3006.75,548.6719 Q3006.1563,548.3906 3005.5313,548.3906 Q3004.1875,548.3906 3003.5,549.4688 Q3002.8125,550.5313 3002.8125,552.625 Q3002.8125,554.7188 3003.5,555.7969 Q3004.1875,556.8594 3005.5313,556.8594 Q3006.1563,556.8594 3006.75,556.5938 Q3007.3438,556.3125 3007.9688,555.7344 L3007.9688,558.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="66" x="3019" y="556.9668">helm-epa</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2991" x2="3087" y1="568.8125" y2="568.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2991" x2="3087" y1="576.8125" y2="576.8125"/><!--MD5=[3960967beb69c61591e67bd0b8c5ae1c]
+class helm-esh-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-esh-source" style="stroke: #A80036; stroke-width: 1.5;" width="150" x="2995" y="663.8125"/><ellipse cx="3010" cy="679.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M3012.9688,685.4531 Q3012.3906,685.75 3011.75,685.8906 Q3011.1094,686.0469 3010.4063,686.0469 Q3007.9063,686.0469 3006.5781,684.4063 Q3005.2656,682.75 3005.2656,679.625 Q3005.2656,676.5 3006.5781,674.8438 Q3007.9063,673.1875 3010.4063,673.1875 Q3011.1094,673.1875 3011.75,673.3438 Q3012.4063,673.5 3012.9688,673.7969 L3012.9688,676.5156 Q3012.3438,675.9375 3011.75,675.6719 Q3011.1563,675.3906 3010.5313,675.3906 Q3009.1875,675.3906 3008.5,676.4688 Q3007.8125,677.5313 3007.8125,679.625 Q3007.8125,681.7188 3008.5,682.7969 Q3009.1875,683.8594 3010.5313,683.8594 Q3011.1563,683.8594 3011.75,683.5938 Q3012.3438,683.3125 3012.9688,682.7344 L3012.9688,685.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="118" x="3024" y="683.9668">helm-esh-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2996" x2="3144" y1="695.8125" y2="695.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2996" x2="3144" y1="703.8125" y2="703.8125"/><!--MD5=[282aa25f9d306cf00c48aa2e4e60e732]
+class helm-eshell-history-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-eshell-history-source" style="stroke: #A80036; stroke-width: 1.5;" width="222" x="2977" y="771.8125"/><ellipse cx="2992" cy="787.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2994.9688,793.4531 Q2994.3906,793.75 2993.75,793.8906 Q2993.1094,794.0469 2992.4063,794.0469 Q2989.9063,794.0469 2988.5781,792.4063 Q2987.2656,790.75 2987.2656,787.625 Q2987.2656,784.5 2988.5781,782.8438 Q2989.9063,781.1875 2992.4063,781.1875 Q2993.1094,781.1875 2993.75,781.3438 Q2994.4063,781.5 2994.9688,781.7969 L2994.9688,784.5156 Q2994.3438,783.9375 2993.75,783.6719 Q2993.1563,783.3906 2992.5313,783.3906 Q2991.1875,783.3906 2990.5,784.4688 Q2989.8125,785.5313 2989.8125,787.625 Q2989.8125,789.7188 2990.5,790.7969 Q2991.1875,791.8594 2992.5313,791.8594 Q2993.1563,791.8594 2993.75,791.5938 Q2994.3438,791.3125 2994.9688,790.7344 L2994.9688,793.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="190" x="3006" y="791.9668">helm-eshell-history-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2978" x2="3198" y1="803.8125" y2="803.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2978" x2="3198" y1="811.8125" y2="811.8125"/><!--MD5=[4700ddfab9e311ad1ae5061cdd5496ba]
+class helm-source-ffiles--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-source-ffiles" style="stroke: #A80036; stroke-width: 1.5;" width="159" x="3008.5" y="879.8125"/><ellipse cx="3023.5" cy="895.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M3026.4688,901.4531 Q3025.8906,901.75 3025.25,901.8906 Q3024.6094,902.0469 3023.9063,902.0469 Q3021.4063,902.0469 3020.0781,900.4063 Q3018.7656,898.75 3018.7656,895.625 Q3018.7656,892.5 3020.0781,890.8438 Q3021.4063,889.1875 3023.9063,889.1875 Q3024.6094,889.1875 3025.25,889.3438 Q3025.9063,889.5 3026.4688,889.7969 L3026.4688,892.5156 Q3025.8438,891.9375 3025.25,891.6719 Q3024.6563,891.3906 3024.0313,891.3906 Q3022.6875,891.3906 3022,892.4688 Q3021.3125,893.5313 3021.3125,895.625 Q3021.3125,897.7188 3022,898.7969 Q3022.6875,899.8594 3024.0313,899.8594 Q3024.6563,899.8594 3025.25,899.5938 Q3025.8438,899.3125 3026.4688,898.7344 L3026.4688,901.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="127" x="3037.5" y="899.9668">helm-source-ffiles</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="3009.5" x2="3166.5" y1="911.8125" y2="911.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="3009.5" x2="3166.5" y1="919.8125" y2="919.8125"/><!--MD5=[a7554553637232b99c06721dc00b929c]
+class helm-imenu-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-imenu-source" style="stroke: #A80036; stroke-width: 1.5;" width="167" x="3004.5" y="987.8125"/><ellipse cx="3019.5" cy="1003.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M3022.4688,1009.4531 Q3021.8906,1009.75 3021.25,1009.8906 Q3020.6094,1010.0469 3019.9063,1010.0469 Q3017.4063,1010.0469 3016.0781,1008.4063 Q3014.7656,1006.75 3014.7656,1003.625 Q3014.7656,1000.5 3016.0781,998.8438 Q3017.4063,997.1875 3019.9063,997.1875 Q3020.6094,997.1875 3021.25,997.3438 Q3021.9063,997.5 3022.4688,997.7969 L3022.4688,1000.5156 Q3021.8438,999.9375 3021.25,999.6719 Q3020.6563,999.3906 3020.0313,999.3906 Q3018.6875,999.3906 3018,1000.4688 Q3017.3125,1001.5313 3017.3125,1003.625 Q3017.3125,1005.7188 3018,1006.7969 Q3018.6875,1007.8594 3020.0313,1007.8594 Q3020.6563,1007.8594 3021.25,1007.5938 Q3021.8438,1007.3125 3022.4688,1006.7344 L3022.4688,1009.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="135" x="3033.5" y="1007.9668">helm-imenu-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="3005.5" x2="3170.5" y1="1019.8125" y2="1019.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="3005.5" x2="3170.5" y1="1027.8125" y2="1027.8125"/><!--MD5=[f9787a7e913788f0fbbca93390d6041a]
+class helm-recentf-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-recentf-source" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="1960.5" y="536.8125"/><ellipse cx="1975.5" cy="552.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1978.4688,558.4531 Q1977.8906,558.75 1977.25,558.8906 Q1976.6094,559.0469 1975.9063,559.0469 Q1973.4063,559.0469 1972.0781,557.4063 Q1970.7656,555.75 1970.7656,552.625 Q1970.7656,549.5 1972.0781,547.8438 Q1973.4063,546.1875 1975.9063,546.1875 Q1976.6094,546.1875 1977.25,546.3438 Q1977.9063,546.5 1978.4688,546.7969 L1978.4688,549.5156 Q1977.8438,548.9375 1977.25,548.6719 Q1976.6563,548.3906 1976.0313,548.3906 Q1974.6875,548.3906 1974,549.4688 Q1973.3125,550.5313 1973.3125,552.625 Q1973.3125,554.7188 1974,555.7969 Q1974.6875,556.8594 1976.0313,556.8594 Q1976.6563,556.8594 1977.25,556.5938 Q1977.8438,556.3125 1978.4688,555.7344 L1978.4688,558.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="1989.5" y="556.9668">helm-recentf-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1961.5" x2="2134.5" y1="568.8125" y2="568.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1961.5" x2="2134.5" y1="576.8125" y2="576.8125"/><!--MD5=[b49d18483e901ae1bf6135ad896f4fad]
+class helm-files-in-current-dir-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-files-in-current-dir-source" style="stroke: #A80036; stroke-width: 1.5;" width="253" x="1916.5" y="663.8125"/><ellipse cx="1931.5" cy="679.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1934.4688,685.4531 Q1933.8906,685.75 1933.25,685.8906 Q1932.6094,686.0469 1931.9063,686.0469 Q1929.4063,686.0469 1928.0781,684.4063 Q1926.7656,682.75 1926.7656,679.625 Q1926.7656,676.5 1928.0781,674.8438 Q1929.4063,673.1875 1931.9063,673.1875 Q1932.6094,673.1875 1933.25,673.3438 Q1933.9063,673.5 1934.4688,673.7969 L1934.4688,676.5156 Q1933.8438,675.9375 1933.25,675.6719 Q1932.6563,675.3906 1932.0313,675.3906 Q1930.6875,675.3906 1930,676.4688 Q1929.3125,677.5313 1929.3125,679.625 Q1929.3125,681.7188 1930,682.7969 Q1930.6875,683.8594 1932.0313,683.8594 Q1932.6563,683.8594 1933.25,683.5938 Q1933.8438,683.3125 1934.4688,682.7344 L1934.4688,685.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="221" x="1945.5" y="683.9668">helm-files-in-current-dir-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1917.5" x2="2168.5" y1="695.8125" y2="695.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1917.5" x2="2168.5" y1="703.8125" y2="703.8125"/><!--MD5=[cea65451dee1c19877355cf9a9f1c806]
+class helm-list-el-package-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-list-el-package-source" style="stroke: #A80036; stroke-width: 1.5;" width="229" x="1448.5" y="536.8125"/><ellipse cx="1463.5" cy="552.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1466.4688,558.4531 Q1465.8906,558.75 1465.25,558.8906 Q1464.6094,559.0469 1463.9063,559.0469 Q1461.4063,559.0469 1460.0781,557.4063 Q1458.7656,555.75 1458.7656,552.625 Q1458.7656,549.5 1460.0781,547.8438 Q1461.4063,546.1875 1463.9063,546.1875 Q1464.6094,546.1875 1465.25,546.3438 Q1465.9063,546.5 1466.4688,546.7969 L1466.4688,549.5156 Q1465.8438,548.9375 1465.25,548.6719 Q1464.6563,548.3906 1464.0313,548.3906 Q1462.6875,548.3906 1462,549.4688 Q1461.3125,550.5313 1461.3125,552.625 Q1461.3125,554.7188 1462,555.7969 Q1462.6875,556.8594 1464.0313,556.8594 Q1464.6563,556.8594 1465.25,556.5938 Q1465.8438,556.3125 1466.4688,555.7344 L1466.4688,558.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="197" x="1477.5" y="556.9668">helm-list-el-package-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1449.5" x2="1676.5" y1="568.8125" y2="568.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1449.5" x2="1676.5" y1="576.8125" y2="576.8125"/><!--MD5=[1d6ee517c209485192c7fd1a0dfbbf09]
+class helm-info-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-info-source" style="stroke: #A80036; stroke-width: 1.5;" width="151" x="1487.5" y="663.8125"/><ellipse cx="1502.5" cy="679.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1505.4688,685.4531 Q1504.8906,685.75 1504.25,685.8906 Q1503.6094,686.0469 1502.9063,686.0469 Q1500.4063,686.0469 1499.0781,684.4063 Q1497.7656,682.75 1497.7656,679.625 Q1497.7656,676.5 1499.0781,674.8438 Q1500.4063,673.1875 1502.9063,673.1875 Q1503.6094,673.1875 1504.25,673.3438 Q1504.9063,673.5 1505.4688,673.7969 L1505.4688,676.5156 Q1504.8438,675.9375 1504.25,675.6719 Q1503.6563,675.3906 1503.0313,675.3906 Q1501.6875,675.3906 1501,676.4688 Q1500.3125,677.5313 1500.3125,679.625 Q1500.3125,681.7188 1501,682.7969 Q1501.6875,683.8594 1503.0313,683.8594 Q1503.6563,683.8594 1504.25,683.5938 Q1504.8438,683.3125 1505.4688,682.7344 L1505.4688,685.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="119" x="1516.5" y="683.9668">helm-info-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1488.5" x2="1637.5" y1="695.8125" y2="695.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1488.5" x2="1637.5" y1="703.8125" y2="703.8125"/><!--MD5=[56407064ffc9bf78a0cd848588044ef4]
+class helm-locate-subdirs-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-locate-subdirs-source" style="stroke: #A80036; stroke-width: 1.5;" width="226" x="1450" y="771.8125"/><ellipse cx="1465" cy="787.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1467.9688,793.4531 Q1467.3906,793.75 1466.75,793.8906 Q1466.1094,794.0469 1465.4063,794.0469 Q1462.9063,794.0469 1461.5781,792.4063 Q1460.2656,790.75 1460.2656,787.625 Q1460.2656,784.5 1461.5781,782.8438 Q1462.9063,781.1875 1465.4063,781.1875 Q1466.1094,781.1875 1466.75,781.3438 Q1467.4063,781.5 1467.9688,781.7969 L1467.9688,784.5156 Q1467.3438,783.9375 1466.75,783.6719 Q1466.1563,783.3906 1465.5313,783.3906 Q1464.1875,783.3906 1463.5,784.4688 Q1462.8125,785.5313 1462.8125,787.625 Q1462.8125,789.7188 1463.5,790.7969 Q1464.1875,791.8594 1465.5313,791.8594 Q1466.1563,791.8594 1466.75,791.5938 Q1467.3438,791.3125 1467.9688,790.7344 L1467.9688,793.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="194" x="1479" y="791.9668">helm-locate-subdirs-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1451" x2="1675" y1="803.8125" y2="803.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1451" x2="1675" y1="811.8125" y2="811.8125"/><!--MD5=[073c45925f2697dc8d5dd1a44a8a3365]
+class helm-moccur-class--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-moccur-class" style="stroke: #A80036; stroke-width: 1.5;" width="162" x="1482" y="879.8125"/><ellipse cx="1497" cy="895.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1499.9688,901.4531 Q1499.3906,901.75 1498.75,901.8906 Q1498.1094,902.0469 1497.4063,902.0469 Q1494.9063,902.0469 1493.5781,900.4063 Q1492.2656,898.75 1492.2656,895.625 Q1492.2656,892.5 1493.5781,890.8438 Q1494.9063,889.1875 1497.4063,889.1875 Q1498.1094,889.1875 1498.75,889.3438 Q1499.4063,889.5 1499.9688,889.7969 L1499.9688,892.5156 Q1499.3438,891.9375 1498.75,891.6719 Q1498.1563,891.3906 1497.5313,891.3906 Q1496.1875,891.3906 1495.5,892.4688 Q1494.8125,893.5313 1494.8125,895.625 Q1494.8125,897.7188 1495.5,898.7969 Q1496.1875,899.8594 1497.5313,899.8594 Q1498.1563,899.8594 1498.75,899.5938 Q1499.3438,899.3125 1499.9688,898.7344 L1499.9688,901.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="130" x="1511" y="899.9668">helm-moccur-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1483" x2="1643" y1="911.8125" y2="911.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1483" x2="1643" y1="919.8125" y2="919.8125"/><!--MD5=[6a7a1e548828873723640eef38a6053c]
+class helm-semantic-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-semantic-source" style="stroke: #A80036; stroke-width: 1.5;" width="188" x="1469" y="987.8125"/><ellipse cx="1484" cy="1003.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1486.9688,1009.4531 Q1486.3906,1009.75 1485.75,1009.8906 Q1485.1094,1010.0469 1484.4063,1010.0469 Q1481.9063,1010.0469 1480.5781,1008.4063 Q1479.2656,1006.75 1479.2656,1003.625 Q1479.2656,1000.5 1480.5781,998.8438 Q1481.9063,997.1875 1484.4063,997.1875 Q1485.1094,997.1875 1485.75,997.3438 Q1486.4063,997.5 1486.9688,997.7969 L1486.9688,1000.5156 Q1486.3438,999.9375 1485.75,999.6719 Q1485.1563,999.3906 1484.5313,999.3906 Q1483.1875,999.3906 1482.5,1000.4688 Q1481.8125,1001.5313 1481.8125,1003.625 Q1481.8125,1005.7188 1482.5,1006.7969 Q1483.1875,1007.8594 1484.5313,1007.8594 Q1485.1563,1007.8594 1485.75,1007.5938 Q1486.3438,1007.3125 1486.9688,1006.7344 L1486.9688,1009.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="156" x="1498" y="1007.9668">helm-semantic-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1470" x2="1656" y1="1019.8125" y2="1019.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1470" x2="1656" y1="1027.8125" y2="1027.8125"/><!--MD5=[e7e10cea49efd04a6bea9ed9f44f1841]
+class helm-type-function--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-type-function" style="stroke: #A80036; stroke-width: 1.5;" width="166" x="3492" y="390.8125"/><ellipse cx="3507" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M3509.9688,412.4531 Q3509.3906,412.75 3508.75,412.8906 Q3508.1094,413.0469 3507.4063,413.0469 Q3504.9063,413.0469 3503.5781,411.4063 Q3502.2656,409.75 3502.2656,406.625 Q3502.2656,403.5 3503.5781,401.8438 Q3504.9063,400.1875 3507.4063,400.1875 Q3508.1094,400.1875 3508.75,400.3438 Q3509.4063,400.5 3509.9688,400.7969 L3509.9688,403.5156 Q3509.3438,402.9375 3508.75,402.6719 Q3508.1563,402.3906 3507.5313,402.3906 Q3506.1875,402.3906 3505.5,403.4688 Q3504.8125,404.5313 3504.8125,406.625 Q3504.8125,408.7188 3505.5,409.7969 Q3506.1875,410.8594 3507.5313,410.8594 Q3508.1563,410.8594 3508.75,410.5938 Q3509.3438,410.3125 3509.9688,409.7344 L3509.9688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="134" x="3521" y="410.9668">helm-type-function</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="3493" x2="3657" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="3493" x2="3657" y1="430.8125" y2="430.8125"/><!--MD5=[78e52b23f8e756ae73535f85f4ae9d39]
+class helm-locate-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-locate-source" style="stroke: #A80036; stroke-width: 1.5;" width="168" x="533" y="536.8125"/><ellipse cx="548" cy="552.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M550.9688,558.4531 Q550.3906,558.75 549.75,558.8906 Q549.1094,559.0469 548.4063,559.0469 Q545.9063,559.0469 544.5781,557.4063 Q543.2656,555.75 543.2656,552.625 Q543.2656,549.5 544.5781,547.8438 Q545.9063,546.1875 548.4063,546.1875 Q549.1094,546.1875 549.75,546.3438 Q550.4063,546.5 550.9688,546.7969 L550.9688,549.5156 Q550.3438,548.9375 549.75,548.6719 Q549.1563,548.3906 548.5313,548.3906 Q547.1875,548.3906 546.5,549.4688 Q545.8125,550.5313 545.8125,552.625 Q545.8125,554.7188 546.5,555.7969 Q547.1875,556.8594 548.5313,556.8594 Q549.1563,556.8594 549.75,556.5938 Q550.3438,556.3125 550.9688,555.7344 L550.9688,558.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="136" x="562" y="556.9668">helm-locate-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="534" x2="700" y1="568.8125" y2="568.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="534" x2="700" y1="576.8125" y2="576.8125"/><!--MD5=[12d16a9c65828dace8d907a7ab3ef450]
+class helm-source-async--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="86.4141" id="helm-source-async" style="stroke: #A80036; stroke-width: 1.5;" width="165" x="297.5" y="225.8125"/><ellipse cx="312.5" cy="241.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M315.4688,247.4531 Q314.8906,247.75 314.25,247.8906 Q313.6094,248.0469 312.9063,248.0469 Q310.4063,248.0469 309.0781,246.4063 Q307.7656,244.75 307.7656,241.625 Q307.7656,238.5 309.0781,236.8438 Q310.4063,235.1875 312.9063,235.1875 Q313.6094,235.1875 314.25,235.3438 Q314.9063,235.5 315.4688,235.7969 L315.4688,238.5156 Q314.8438,237.9375 314.25,237.6719 Q313.6563,237.3906 313.0313,237.3906 Q311.6875,237.3906 311,238.4688 Q310.3125,239.5313 310.3125,241.625 Q310.3125,243.7188 311,244.7969 Q311.6875,245.8594 313.0313,245.8594 Q313.6563,245.8594 314.25,245.5938 Q314.8438,245.3125 315.4688,244.7344 L315.4688,247.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="133" x="326.5" y="245.9668">helm-source-async</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="298.5" x2="461.5" y1="257.8125" y2="257.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="141" x="303.5" y="272.0229">Use this class to define a</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="126" x="303.5" y="284.8276">helm source calling an</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="99" x="303.5" y="297.6323">external process.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="298.5" x2="461.5" y1="304.2266" y2="304.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="298.5" x2="461.5" y1="306.2266" y2="306.2266"/><!--MD5=[2e3d3b2922e1daf59c103872c87a469e]
+class helm-locate-override-inheritor--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-locate-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="246" x="608" y="390.8125"/><ellipse cx="623" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M625.9688,412.4531 Q625.3906,412.75 624.75,412.8906 Q624.1094,413.0469 623.4063,413.0469 Q620.9063,413.0469 619.5781,411.4063 Q618.2656,409.75 618.2656,406.625 Q618.2656,403.5 619.5781,401.8438 Q620.9063,400.1875 623.4063,400.1875 Q624.1094,400.1875 624.75,400.3438 Q625.4063,400.5 625.9688,400.7969 L625.9688,403.5156 Q625.3438,402.9375 624.75,402.6719 Q624.1563,402.3906 623.5313,402.3906 Q622.1875,402.3906 621.5,403.4688 Q620.8125,404.5313 620.8125,406.625 Q620.8125,408.7188 621.5,409.7969 Q622.1875,410.8594 623.5313,410.8594 Q624.1563,410.8594 624.75,410.5938 Q625.3438,410.3125 625.9688,409.7344 L625.9688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="214" x="637" y="410.9668">helm-locate-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="609" x2="853" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="609" x2="853" y1="430.8125" y2="430.8125"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="73.6094" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="162" x="1093" y="231.8125"/><ellipse cx="1122.4" cy="247.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1125.3688,253.4531 Q1124.7906,253.75 1124.15,253.8906 Q1123.5094,254.0469 1122.8063,254.0469 Q1120.3063,254.0469 1118.9781,252.4063 Q1117.6656,250.75 1117.6656,247.625 Q1117.6656,244.5 1118.9781,242.8438 Q1120.3063,241.1875 1122.8063,241.1875 Q1123.5094,241.1875 1124.15,241.3438 Q1124.8063,241.5 1125.3688,241.7969 L1125.3688,244.5156 Q1124.7438,243.9375 1124.15,243.6719 Q1123.5563,243.3906 1122.9313,243.3906 Q1121.5875,243.3906 1120.9,244.4688 Q1120.2125,245.5313 1120.2125,247.625 Q1120.2125,249.7188 1120.9,250.7969 Q1121.5875,251.8594 1122.9313,251.8594 Q1123.5563,251.8594 1124.15,251.5938 Q1124.7438,251.3125 1125.3688,250.7344 L1125.3688,253.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="1139.6" y="251.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1094" x2="1254" y1="263.8125" y2="263.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="150" x="1099" y="278.0229">A class to define helm type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="21" x="1099" y="290.8276">file.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="1094" x2="1254" y1="297.4219" y2="297.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1094" x2="1254" y1="299.4219" y2="299.4219"/><!--MD5=[11858bbdb8c329cf3bf1e5498cb0b794]
+class helm-file-cache--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-file-cache" style="stroke: #A80036; stroke-width: 1.5;" width="139" x="1234.5" y="390.8125"/><ellipse cx="1249.5" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1252.4688,412.4531 Q1251.8906,412.75 1251.25,412.8906 Q1250.6094,413.0469 1249.9063,413.0469 Q1247.4063,413.0469 1246.0781,411.4063 Q1244.7656,409.75 1244.7656,406.625 Q1244.7656,403.5 1246.0781,401.8438 Q1247.4063,400.1875 1249.9063,400.1875 Q1250.6094,400.1875 1251.25,400.3438 Q1251.9063,400.5 1252.4688,400.7969 L1252.4688,403.5156 Q1251.8438,402.9375 1251.25,402.6719 Q1250.6563,402.3906 1250.0313,402.3906 Q1248.6875,402.3906 1248,403.4688 Q1247.3125,404.5313 1247.3125,406.625 Q1247.3125,408.7188 1248,409.7969 Q1248.6875,410.8594 1250.0313,410.8594 Q1250.6563,410.8594 1251.25,410.5938 Q1251.8438,410.3125 1252.4688,409.7344 L1252.4688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="107" x="1263.5" y="410.9668">helm-file-cache</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1235.5" x2="1372.5" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1235.5" x2="1372.5" y1="430.8125" y2="430.8125"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="86.4141" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="1590.5" y="225.8125"/><ellipse cx="1605.5" cy="241.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1608.4688,247.4531 Q1607.8906,247.75 1607.25,247.8906 Q1606.6094,248.0469 1605.9063,248.0469 Q1603.4063,248.0469 1602.0781,246.4063 Q1600.7656,244.75 1600.7656,241.625 Q1600.7656,238.5 1602.0781,236.8438 Q1603.4063,235.1875 1605.9063,235.1875 Q1606.6094,235.1875 1607.25,235.3438 Q1607.9063,235.5 1608.4688,235.7969 L1608.4688,238.5156 Q1607.8438,237.9375 1607.25,237.6719 Q1606.6563,237.3906 1606.0313,237.3906 Q1604.6875,237.3906 1604,238.4688 Q1603.3125,239.5313 1603.3125,241.625 Q1603.3125,243.7188 1604,244.7969 Q1604.6875,245.8594 1606.0313,245.8594 Q1606.6563,245.8594 1607.25,245.5938 Q1607.8438,245.3125 1608.4688,244.7344 L1608.4688,247.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="1619.5" y="245.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1591.5" x2="1774.5" y1="257.8125" y2="257.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="1596.5" y="272.0229">Use this source to make helm</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="154" x="1596.5" y="284.8276">sources storing candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="85" x="1596.5" y="297.6323">inside a buffer.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="1591.5" x2="1774.5" y1="304.2266" y2="304.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1591.5" x2="1774.5" y1="306.2266" y2="306.2266"/><!--MD5=[c55ffa29bbb752794a043d0ccea5fc00]
+class helm-browse-project-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="86.4141" id="helm-browse-project-source" style="stroke: #A80036; stroke-width: 1.5;" width="232" x="1018" y="517.8125"/><ellipse cx="1033" cy="533.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1035.9688,539.4531 Q1035.3906,539.75 1034.75,539.8906 Q1034.1094,540.0469 1033.4063,540.0469 Q1030.9063,540.0469 1029.5781,538.4063 Q1028.2656,536.75 1028.2656,533.625 Q1028.2656,530.5 1029.5781,528.8438 Q1030.9063,527.1875 1033.4063,527.1875 Q1034.1094,527.1875 1034.75,527.3438 Q1035.4063,527.5 1035.9688,527.7969 L1035.9688,530.5156 Q1035.3438,529.9375 1034.75,529.6719 Q1034.1563,529.3906 1033.5313,529.3906 Q1032.1875,529.3906 1031.5,530.4688 Q1030.8125,531.5313 1030.8125,533.625 Q1030.8125,535.7188 1031.5,536.7969 Q1032.1875,537.8594 1033.5313,537.8594 Q1034.1563,537.8594 1034.75,537.5938 Q1035.3438,537.3125 1035.9688,536.7344 L1035.9688,539.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="200" x="1047" y="537.9668">helm-browse-project-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1019" x2="1249" y1="549.8125" y2="549.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="149" x="1024" y="564.0229">Class to define a source in</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="177" x="1024" y="576.8276">`helm-browse-project' handling</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="21" x="1024" y="589.6323">non</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="1019" x2="1249" y1="596.2266" y2="596.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1019" x2="1249" y1="598.2266" y2="598.2266"/><!--MD5=[473c7582700aad271b06bfe20c99b25e]
+class helm-browse-project-override-inheritor--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-browse-project-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="310" x="889" y="390.8125"/><ellipse cx="904" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M906.9688,412.4531 Q906.3906,412.75 905.75,412.8906 Q905.1094,413.0469 904.4063,413.0469 Q901.9063,413.0469 900.5781,411.4063 Q899.2656,409.75 899.2656,406.625 Q899.2656,403.5 900.5781,401.8438 Q901.9063,400.1875 904.4063,400.1875 Q905.1094,400.1875 905.75,400.3438 Q906.4063,400.5 906.9688,400.7969 L906.9688,403.5156 Q906.3438,402.9375 905.75,402.6719 Q905.1563,402.3906 904.5313,402.3906 Q903.1875,402.3906 902.5,403.4688 Q901.8125,404.5313 901.8125,406.625 Q901.8125,408.7188 902.5,409.7969 Q903.1875,410.8594 904.5313,410.8594 Q905.1563,410.8594 905.75,410.5938 Q906.3438,410.3125 906.9688,409.7344 L906.9688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="278" x="918" y="410.9668">helm-browse-project-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="890" x2="1198" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="890" x2="1198" y1="430.8125" y2="430.8125"/><!--MD5=[bd2ea1af02554a0352e5fd98d33b66ab]
+class helm-fd-class--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-fd-class" style="stroke: #A80036; stroke-width: 1.5;" width="126" x="119" y="390.8125"/><ellipse cx="134" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M136.9688,412.4531 Q136.3906,412.75 135.75,412.8906 Q135.1094,413.0469 134.4063,413.0469 Q131.9063,413.0469 130.5781,411.4063 Q129.2656,409.75 129.2656,406.625 Q129.2656,403.5 130.5781,401.8438 Q131.9063,400.1875 134.4063,400.1875 Q135.1094,400.1875 135.75,400.3438 Q136.4063,400.5 136.9688,400.7969 L136.9688,403.5156 Q136.3438,402.9375 135.75,402.6719 Q135.1563,402.3906 134.5313,402.3906 Q133.1875,402.3906 132.5,403.4688 Q131.8125,404.5313 131.8125,406.625 Q131.8125,408.7188 132.5,409.7969 Q133.1875,410.8594 134.5313,410.8594 Q135.1563,410.8594 135.75,410.5938 Q136.3438,410.3125 136.9688,409.7344 L136.9688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="94" x="148" y="410.9668">helm-fd-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="120" x2="244" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="120" x2="244" y1="430.8125" y2="430.8125"/><!--MD5=[b0e60113aba2bebbe59d6cbba30a4a7f]
+class helm-absolute-time-timers-class--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-absolute-time-timers-class" style="stroke: #A80036; stroke-width: 1.5;" width="261" x="2557.5" y="390.8125"/><ellipse cx="2572.5" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2575.4688,412.4531 Q2574.8906,412.75 2574.25,412.8906 Q2573.6094,413.0469 2572.9063,413.0469 Q2570.4063,413.0469 2569.0781,411.4063 Q2567.7656,409.75 2567.7656,406.625 Q2567.7656,403.5 2569.0781,401.8438 Q2570.4063,400.1875 2572.9063,400.1875 Q2573.6094,400.1875 2574.25,400.3438 Q2574.9063,400.5 2575.4688,400.7969 L2575.4688,403.5156 Q2574.8438,402.9375 2574.25,402.6719 Q2573.6563,402.3906 2573.0313,402.3906 Q2571.6875,402.3906 2571,403.4688 Q2570.3125,404.5313 2570.3125,406.625 Q2570.3125,408.7188 2571,409.7969 Q2571.6875,410.8594 2573.0313,410.8594 Q2573.6563,410.8594 2574.25,410.5938 Q2574.8438,410.3125 2575.4688,409.7344 L2575.4688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="229" x="2586.5" y="410.9668">helm-absolute-time-timers-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2558.5" x2="2817.5" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2558.5" x2="2817.5" y1="430.8125" y2="430.8125"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="86.4141" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="170" x="2865" y="225.8125"/><ellipse cx="2886.3" cy="241.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2889.2688,247.4531 Q2888.6906,247.75 2888.05,247.8906 Q2887.4094,248.0469 2886.7063,248.0469 Q2884.2063,248.0469 2882.8781,246.4063 Q2881.5656,244.75 2881.5656,241.625 Q2881.5656,238.5 2882.8781,236.8438 Q2884.2063,235.1875 2886.7063,235.1875 Q2887.4094,235.1875 2888.05,235.3438 Q2888.7063,235.5 2889.2688,235.7969 L2889.2688,238.5156 Q2888.6438,237.9375 2888.05,237.6719 Q2887.4563,237.3906 2886.8313,237.3906 Q2885.4875,237.3906 2884.8,238.4688 Q2884.1125,239.5313 2884.1125,241.625 Q2884.1125,243.7188 2884.8,244.7969 Q2885.4875,245.8594 2886.8313,245.8594 Q2887.4563,245.8594 2888.05,245.5938 Q2888.6438,245.3125 2889.2688,244.7344 L2889.2688,247.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="2901.7" y="245.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2866" x2="3034" y1="257.8125" y2="257.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="158" x="2871" y="272.0229">Use this class to make helm</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="124" x="2871" y="284.8276">sources using a list of</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="2871" y="297.6323">candidates.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="2866" x2="3034" y1="304.2266" y2="304.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="2866" x2="3034" y1="306.2266" y2="306.2266"/><!--MD5=[d89fbe3a66aa0ad58442d3fbb0e3c04d]
+class helm-type-timers--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="73.6094" id="helm-type-timers" style="stroke: #A80036; stroke-width: 1.5;" width="162" x="2668" y="231.8125"/><ellipse cx="2687.05" cy="247.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2690.0188,253.4531 Q2689.4406,253.75 2688.8,253.8906 Q2688.1594,254.0469 2687.4563,254.0469 Q2684.9563,254.0469 2683.6281,252.4063 Q2682.3156,250.75 2682.3156,247.625 Q2682.3156,244.5 2683.6281,242.8438 Q2684.9563,241.1875 2687.4563,241.1875 Q2688.1594,241.1875 2688.8,241.3438 Q2689.4563,241.5 2690.0188,241.7969 L2690.0188,244.5156 Q2689.3938,243.9375 2688.8,243.6719 Q2688.2063,243.3906 2687.5813,243.3906 Q2686.2375,243.3906 2685.55,244.4688 Q2684.8625,245.5313 2684.8625,247.625 Q2684.8625,249.7188 2685.55,250.7969 Q2686.2375,251.8594 2687.5813,251.8594 Q2688.2063,251.8594 2688.8,251.5938 Q2689.3938,251.3125 2690.0188,250.7344 L2690.0188,253.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="121" x="2701.95" y="251.9668">helm-type-timers</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2669" x2="2829" y1="263.8125" y2="263.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="150" x="2674" y="278.0229">A class to define helm type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="41" x="2674" y="290.8276">timers.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="2669" x2="2829" y1="297.4219" y2="297.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="2669" x2="2829" y1="299.4219" y2="299.4219"/><!--MD5=[9bb915cdd04b5f6bf4c2c1633cbdfbdc]
+class helm-M-x-class--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-M-x-class" style="stroke: #A80036; stroke-width: 1.5;" width="136" x="3109" y="390.8125"/><ellipse cx="3124" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M3126.9688,412.4531 Q3126.3906,412.75 3125.75,412.8906 Q3125.1094,413.0469 3124.4063,413.0469 Q3121.9063,413.0469 3120.5781,411.4063 Q3119.2656,409.75 3119.2656,406.625 Q3119.2656,403.5 3120.5781,401.8438 Q3121.9063,400.1875 3124.4063,400.1875 Q3125.1094,400.1875 3125.75,400.3438 Q3126.4063,400.5 3126.9688,400.7969 L3126.9688,403.5156 Q3126.3438,402.9375 3125.75,402.6719 Q3125.1563,402.3906 3124.5313,402.3906 Q3123.1875,402.3906 3122.5,403.4688 Q3121.8125,404.5313 3121.8125,406.625 Q3121.8125,408.7188 3122.5,409.7969 Q3123.1875,410.8594 3124.5313,410.8594 Q3125.1563,410.8594 3125.75,410.5938 Q3126.3438,410.3125 3126.9688,409.7344 L3126.9688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="104" x="3138" y="410.9668">helm-M-x-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="3110" x2="3244" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="3110" x2="3244" y1="430.8125" y2="430.8125"/><!--MD5=[beabceb98eda0d1152a0edf286dc7000]
+class helm-type-command--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="73.6094" id="helm-type-command" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="3070.5" y="231.8125"/><ellipse cx="3085.5" cy="247.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M3088.4688,253.4531 Q3087.8906,253.75 3087.25,253.8906 Q3086.6094,254.0469 3085.9063,254.0469 Q3083.4063,254.0469 3082.0781,252.4063 Q3080.7656,250.75 3080.7656,247.625 Q3080.7656,244.5 3082.0781,242.8438 Q3083.4063,241.1875 3085.9063,241.1875 Q3086.6094,241.1875 3087.25,241.3438 Q3087.9063,241.5 3088.4688,241.7969 L3088.4688,244.5156 Q3087.8438,243.9375 3087.25,243.6719 Q3086.6563,243.3906 3086.0313,243.3906 Q3084.6875,243.3906 3084,244.4688 Q3083.3125,245.5313 3083.3125,247.625 Q3083.3125,249.7188 3084,250.7969 Q3084.6875,251.8594 3086.0313,251.8594 Q3086.6563,251.8594 3087.25,251.5938 Q3087.8438,251.3125 3088.4688,250.7344 L3088.4688,253.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="3099.5" y="251.9668">helm-type-command</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="3071.5" x2="3244.5" y1="263.8125" y2="263.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="150" x="3076.5" y="278.0229">A class to define helm type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="60" x="3076.5" y="290.8276">command.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="3071.5" x2="3244.5" y1="297.4219" y2="297.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="3071.5" x2="3244.5" y1="299.4219" y2="299.4219"/><!--MD5=[5e8ec52a80544584992cb03033476cca]
+class helm-source-buffers--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-source-buffers" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="3280.5" y="390.8125"/><ellipse cx="3295.5" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M3298.4688,412.4531 Q3297.8906,412.75 3297.25,412.8906 Q3296.6094,413.0469 3295.9063,413.0469 Q3293.4063,413.0469 3292.0781,411.4063 Q3290.7656,409.75 3290.7656,406.625 Q3290.7656,403.5 3292.0781,401.8438 Q3293.4063,400.1875 3295.9063,400.1875 Q3296.6094,400.1875 3297.25,400.3438 Q3297.9063,400.5 3298.4688,400.7969 L3298.4688,403.5156 Q3297.8438,402.9375 3297.25,402.6719 Q3296.6563,402.3906 3296.0313,402.3906 Q3294.6875,402.3906 3294,403.4688 Q3293.3125,404.5313 3293.3125,406.625 Q3293.3125,408.7188 3294,409.7969 Q3294.6875,410.8594 3296.0313,410.8594 Q3296.6563,410.8594 3297.25,410.5938 Q3297.8438,410.3125 3298.4688,409.7344 L3298.4688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="3309.5" y="410.9668">helm-source-buffers</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="3281.5" x2="3454.5" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="3281.5" x2="3454.5" y1="430.8125" y2="430.8125"/><!--MD5=[44eb50c21698d944c3f7c5a7441762ef]
+class helm-type-buffer--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="60.8047" id="helm-type-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="172" x="3281" y="238.3125"/><ellipse cx="3305.45" cy="254.3125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M3308.4188,259.9531 Q3307.8406,260.25 3307.2,260.3906 Q3306.5594,260.5469 3305.8563,260.5469 Q3303.3563,260.5469 3302.0281,258.9063 Q3300.7156,257.25 3300.7156,254.125 Q3300.7156,251 3302.0281,249.3438 Q3303.3563,247.6875 3305.8563,247.6875 Q3306.5594,247.6875 3307.2,247.8438 Q3307.8563,248 3308.4188,248.2969 L3308.4188,251.0156 Q3307.7938,250.4375 3307.2,250.1719 Q3306.6063,249.8906 3305.9813,249.8906 Q3304.6375,249.8906 3303.95,250.9688 Q3303.2625,252.0313 3303.2625,254.125 Q3303.2625,256.2188 3303.95,257.2969 Q3304.6375,258.3594 3305.9813,258.3594 Q3306.6063,258.3594 3307.2,258.0938 Q3307.7938,257.8125 3308.4188,257.2344 L3308.4188,259.9531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="119" x="3321.55" y="258.4668">helm-type-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="3282" x2="3452" y1="270.3125" y2="270.3125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="160" x="3287" y="284.5229">A class to define type buffer.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="3282" x2="3452" y1="291.1172" y2="291.1172"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="3282" x2="3452" y1="293.1172" y2="293.1172"/><!--MD5=[f325aa84e92746ce6f670c419a69be3e]
+class helm-bookmark-find-files-class--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-bookmark-find-files-class" style="stroke: #A80036; stroke-width: 1.5;" width="249" x="2202.5" y="536.8125"/><ellipse cx="2217.5" cy="552.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2220.4688,558.4531 Q2219.8906,558.75 2219.25,558.8906 Q2218.6094,559.0469 2217.9063,559.0469 Q2215.4063,559.0469 2214.0781,557.4063 Q2212.7656,555.75 2212.7656,552.625 Q2212.7656,549.5 2214.0781,547.8438 Q2215.4063,546.1875 2217.9063,546.1875 Q2218.6094,546.1875 2219.25,546.3438 Q2219.9063,546.5 2220.4688,546.7969 L2220.4688,549.5156 Q2219.8438,548.9375 2219.25,548.6719 Q2218.6563,548.3906 2218.0313,548.3906 Q2216.6875,548.3906 2216,549.4688 Q2215.3125,550.5313 2215.3125,552.625 Q2215.3125,554.7188 2216,555.7969 Q2216.6875,556.8594 2218.0313,556.8594 Q2218.6563,556.8594 2219.25,556.5938 Q2219.8438,556.3125 2220.4688,555.7344 L2220.4688,558.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="217" x="2231.5" y="556.9668">helm-bookmark-find-files-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2203.5" x2="2450.5" y1="568.8125" y2="568.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2203.5" x2="2450.5" y1="576.8125" y2="576.8125"/><!--MD5=[1b5f639ef80bc5f44c8cc4600bf3e2e4]
+class helm-source-filtered-bookmarks--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.5;" width="259" x="2191.5" y="390.8125"/><ellipse cx="2206.5" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2209.4688,412.4531 Q2208.8906,412.75 2208.25,412.8906 Q2207.6094,413.0469 2206.9063,413.0469 Q2204.4063,413.0469 2203.0781,411.4063 Q2201.7656,409.75 2201.7656,406.625 Q2201.7656,403.5 2203.0781,401.8438 Q2204.4063,400.1875 2206.9063,400.1875 Q2207.6094,400.1875 2208.25,400.3438 Q2208.9063,400.5 2209.4688,400.7969 L2209.4688,403.5156 Q2208.8438,402.9375 2208.25,402.6719 Q2207.6563,402.3906 2207.0313,402.3906 Q2205.6875,402.3906 2205,403.4688 Q2204.3125,404.5313 2204.3125,406.625 Q2204.3125,408.7188 2205,409.7969 Q2205.6875,410.8594 2207.0313,410.8594 Q2207.6563,410.8594 2208.25,410.5938 Q2208.8438,410.3125 2209.4688,409.7344 L2209.4688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="227" x="2220.5" y="410.9668">helm-source-filtered-bookmarks</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2192.5" x2="2449.5" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2192.5" x2="2449.5" y1="430.8125" y2="430.8125"/><!--MD5=[1a4f21f1efd4e6c0dd550e1e5e387e5d]
+class helm-bookmark-override-inheritor--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-bookmark-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="272" x="2361" y="244.8125"/><ellipse cx="2376" cy="260.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2378.9688,266.4531 Q2378.3906,266.75 2377.75,266.8906 Q2377.1094,267.0469 2376.4063,267.0469 Q2373.9063,267.0469 2372.5781,265.4063 Q2371.2656,263.75 2371.2656,260.625 Q2371.2656,257.5 2372.5781,255.8438 Q2373.9063,254.1875 2376.4063,254.1875 Q2377.1094,254.1875 2377.75,254.3438 Q2378.4063,254.5 2378.9688,254.7969 L2378.9688,257.5156 Q2378.3438,256.9375 2377.75,256.6719 Q2377.1563,256.3906 2376.5313,256.3906 Q2375.1875,256.3906 2374.5,257.4688 Q2373.8125,258.5313 2373.8125,260.625 Q2373.8125,262.7188 2374.5,263.7969 Q2375.1875,264.8594 2376.5313,264.8594 Q2377.1563,264.8594 2377.75,264.5938 Q2378.3438,264.3125 2378.9688,263.7344 L2378.9688,266.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="2390" y="264.9668">helm-bookmark-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2362" x2="2632" y1="276.8125" y2="276.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2362" x2="2632" y1="284.8125" y2="284.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="73.6094" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="174" x="2536" y="91.8125"/><ellipse cx="2575.75" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2578.7188,113.4531 Q2578.1406,113.75 2577.5,113.8906 Q2576.8594,114.0469 2576.1563,114.0469 Q2573.6563,114.0469 2572.3281,112.4063 Q2571.0156,110.75 2571.0156,107.625 Q2571.0156,104.5 2572.3281,102.8438 Q2573.6563,101.1875 2576.1563,101.1875 Q2576.8594,101.1875 2577.5,101.3438 Q2578.1563,101.5 2578.7188,101.7969 L2578.7188,104.5156 Q2578.0938,103.9375 2577.5,103.6719 Q2576.9063,103.3906 2576.2813,103.3906 Q2574.9375,103.3906 2574.25,104.4688 Q2573.5625,105.5313 2573.5625,107.625 Q2573.5625,109.7188 2574.25,110.7969 Q2574.9375,111.8594 2576.2813,111.8594 Q2576.9063,111.8594 2577.5,111.5938 Q2578.0938,111.3125 2578.7188,110.7344 L2578.7188,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="2595.25" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2537" x2="2709" y1="123.8125" y2="123.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="162" x="2542" y="138.0229">Main interface to define helm</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="50" x="2542" y="150.8276">sources.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="2537" x2="2709" y1="157.4219" y2="157.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="2537" x2="2709" y1="159.4219" y2="159.4219"/><!--MD5=[257e0c9decabcf296fc5e077c0fe3da7]
+class helm-type-bookmark--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="73.6094" id="helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.5;" width="178" x="2148" y="231.8125"/><ellipse cx="2163" cy="247.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2165.9688,253.4531 Q2165.3906,253.75 2164.75,253.8906 Q2164.1094,254.0469 2163.4063,254.0469 Q2160.9063,254.0469 2159.5781,252.4063 Q2158.2656,250.75 2158.2656,247.625 Q2158.2656,244.5 2159.5781,242.8438 Q2160.9063,241.1875 2163.4063,241.1875 Q2164.1094,241.1875 2164.75,241.3438 Q2165.4063,241.5 2165.9688,241.7969 L2165.9688,244.5156 Q2165.3438,243.9375 2164.75,243.6719 Q2164.1563,243.3906 2163.5313,243.3906 Q2162.1875,243.3906 2161.5,244.4688 Q2160.8125,245.5313 2160.8125,247.625 Q2160.8125,249.7188 2161.5,250.7969 Q2162.1875,251.8594 2163.5313,251.8594 Q2164.1563,251.8594 2164.75,251.5938 Q2165.3438,251.3125 2165.9688,250.7344 L2165.9688,253.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="146" x="2177" y="251.9668">helm-type-bookmark</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2149" x2="2325" y1="263.8125" y2="263.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="119" x="2154" y="278.0229">A class to define type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="2154" y="290.8276">bookmarks.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="2149" x2="2325" y1="297.4219" y2="297.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="2149" x2="2325" y1="299.4219" y2="299.4219"/><!--MD5=[bf73905ec5fe3c8fa1d96a26605c7c43]
+class helm-source-basic-bookmarks--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-source-basic-bookmarks" style="stroke: #A80036; stroke-width: 1.5;" width="244" x="1681" y="390.8125"/><ellipse cx="1696" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1698.9688,412.4531 Q1698.3906,412.75 1697.75,412.8906 Q1697.1094,413.0469 1696.4063,413.0469 Q1693.9063,413.0469 1692.5781,411.4063 Q1691.2656,409.75 1691.2656,406.625 Q1691.2656,403.5 1692.5781,401.8438 Q1693.9063,400.1875 1696.4063,400.1875 Q1697.1094,400.1875 1697.75,400.3438 Q1698.4063,400.5 1698.9688,400.7969 L1698.9688,403.5156 Q1698.3438,402.9375 1697.75,402.6719 Q1697.1563,402.3906 1696.5313,402.3906 Q1695.1875,402.3906 1694.5,403.4688 Q1693.8125,404.5313 1693.8125,406.625 Q1693.8125,408.7188 1694.5,409.7969 Q1695.1875,410.8594 1696.5313,410.8594 Q1697.1563,410.8594 1697.75,410.5938 Q1698.3438,410.3125 1698.9688,409.7344 L1698.9688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="212" x="1710" y="410.9668">helm-source-basic-bookmarks</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1682" x2="1924" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1682" x2="1924" y1="430.8125" y2="430.8125"/><!--MD5=[acc538c4de58be324c7884953f9df4c3]
+class helm-mac-spotlight-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-mac-spotlight-source" style="stroke: #A80036; stroke-width: 1.5;" width="221" x="351.5" y="390.8125"/><ellipse cx="366.5" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M369.4688,412.4531 Q368.8906,412.75 368.25,412.8906 Q367.6094,413.0469 366.9063,413.0469 Q364.4063,413.0469 363.0781,411.4063 Q361.7656,409.75 361.7656,406.625 Q361.7656,403.5 363.0781,401.8438 Q364.4063,400.1875 366.9063,400.1875 Q367.6094,400.1875 368.25,400.3438 Q368.9063,400.5 369.4688,400.7969 L369.4688,403.5156 Q368.8438,402.9375 368.25,402.6719 Q367.6563,402.3906 367.0313,402.3906 Q365.6875,402.3906 365,403.4688 Q364.3125,404.5313 364.3125,406.625 Q364.3125,408.7188 365,409.7969 Q365.6875,410.8594 367.0313,410.8594 Q367.6563,410.8594 368.25,410.5938 Q368.8438,410.3125 369.4688,409.7344 L369.4688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="189" x="380.5" y="410.9668">helm-mac-spotlight-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="352.5" x2="571.5" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="352.5" x2="571.5" y1="430.8125" y2="430.8125"/><!--MD5=[47156fd6f6930ad01ab8c92c260b1066]
+class helm-source-session-class--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-source-session-class" style="stroke: #A80036; stroke-width: 1.5;" width="220" x="2854" y="390.8125"/><ellipse cx="2869" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2871.9688,412.4531 Q2871.3906,412.75 2870.75,412.8906 Q2870.1094,413.0469 2869.4063,413.0469 Q2866.9063,413.0469 2865.5781,411.4063 Q2864.2656,409.75 2864.2656,406.625 Q2864.2656,403.5 2865.5781,401.8438 Q2866.9063,400.1875 2869.4063,400.1875 Q2870.1094,400.1875 2870.75,400.3438 Q2871.4063,400.5 2871.9688,400.7969 L2871.9688,403.5156 Q2871.3438,402.9375 2870.75,402.6719 Q2870.1563,402.3906 2869.5313,402.3906 Q2868.1875,402.3906 2867.5,403.4688 Q2866.8125,404.5313 2866.8125,406.625 Q2866.8125,408.7188 2867.5,409.7969 Q2868.1875,410.8594 2869.5313,410.8594 Q2870.1563,410.8594 2870.75,410.5938 Q2871.3438,410.3125 2871.9688,409.7344 L2871.9688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="188" x="2883" y="410.9668">helm-source-session-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2855" x2="3073" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2855" x2="3073" y1="430.8125" y2="430.8125"/><!--MD5=[9c6bffcc58873ff705394a767f912448]
+class helm-files-dired-source--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-files-dired-source" style="stroke: #A80036; stroke-width: 1.5;" width="196" x="1960" y="390.8125"/><ellipse cx="1975" cy="406.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1977.9688,412.4531 Q1977.3906,412.75 1976.75,412.8906 Q1976.1094,413.0469 1975.4063,413.0469 Q1972.9063,413.0469 1971.5781,411.4063 Q1970.2656,409.75 1970.2656,406.625 Q1970.2656,403.5 1971.5781,401.8438 Q1972.9063,400.1875 1975.4063,400.1875 Q1976.1094,400.1875 1976.75,400.3438 Q1977.4063,400.5 1977.9688,400.7969 L1977.9688,403.5156 Q1977.3438,402.9375 1976.75,402.6719 Q1976.1563,402.3906 1975.5313,402.3906 Q1974.1875,402.3906 1973.5,403.4688 Q1972.8125,404.5313 1972.8125,406.625 Q1972.8125,408.7188 1973.5,409.7969 Q1974.1875,410.8594 1975.5313,410.8594 Q1976.1563,410.8594 1976.75,410.5938 Q1977.3438,410.3125 1977.9688,409.7344 L1977.9688,412.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="164" x="1989" y="410.9668">helm-files-dired-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1961" x2="2155" y1="422.8125" y2="422.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1961" x2="2155" y1="430.8125" y2="430.8125"/><!--MD5=[2a25ce0fce2e5578c6c8a1e5bf210dba]
+class helm-source-in-file--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="86.4141" id="helm-source-in-file" style="stroke: #A80036; stroke-width: 1.5;" width="166" x="1480" y="371.8125"/><ellipse cx="1495.9" cy="387.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1498.8688,393.4531 Q1498.2906,393.75 1497.65,393.8906 Q1497.0094,394.0469 1496.3063,394.0469 Q1493.8063,394.0469 1492.4781,392.4063 Q1491.1656,390.75 1491.1656,387.625 Q1491.1656,384.5 1492.4781,382.8438 Q1493.8063,381.1875 1496.3063,381.1875 Q1497.0094,381.1875 1497.65,381.3438 Q1498.3063,381.5 1498.8688,381.7969 L1498.8688,384.5156 Q1498.2438,383.9375 1497.65,383.6719 Q1497.0563,383.3906 1496.4313,383.3906 Q1495.0875,383.3906 1494.4,384.4688 Q1493.7125,385.5313 1493.7125,387.625 Q1493.7125,389.7188 1494.4,390.7969 Q1495.0875,391.8594 1496.4313,391.8594 Q1497.0563,391.8594 1497.65,391.5938 Q1498.2438,391.3125 1498.8688,390.7344 L1498.8688,393.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="132" x="1510.1" y="391.9668">helm-source-in-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1481" x2="1645" y1="403.8125" y2="403.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="154" x="1486" y="418.0229">The contents of the FILE will</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="140" x="1486" y="430.8276">be used as candidates in</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="38" x="1486" y="443.6323">buffer.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="1481" x2="1645" y1="450.2266" y2="450.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1481" x2="1645" y1="452.2266" y2="452.2266"/><!--MD5=[5adfb603e84a1ac071a064f5c8c4d8a3]
+class helm-source-dummy--><rect fill="#FBFB77" filter="url(#fvi1fky2n6wnd)" height="48" id="helm-source-dummy" style="stroke: #A80036; stroke-width: 1.5;" width="174" x="3488" y="244.8125"/><ellipse cx="3503" cy="260.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M3505.9688,266.4531 Q3505.3906,266.75 3504.75,266.8906 Q3504.1094,267.0469 3503.4063,267.0469 Q3500.9063,267.0469 3499.5781,265.4063 Q3498.2656,263.75 3498.2656,260.625 Q3498.2656,257.5 3499.5781,255.8438 Q3500.9063,254.1875 3503.4063,254.1875 Q3504.1094,254.1875 3504.75,254.3438 Q3505.4063,254.5 3505.9688,254.7969 L3505.9688,257.5156 Q3505.3438,256.9375 3504.75,256.6719 Q3504.1563,256.3906 3503.5313,256.3906 Q3502.1875,256.3906 3501.5,257.4688 Q3500.8125,258.5313 3500.8125,260.625 Q3500.8125,262.7188 3501.5,263.7969 Q3502.1875,264.8594 3503.5313,264.8594 Q3504.1563,264.8594 3504.75,264.5938 Q3505.3438,264.3125 3505.9688,263.7344 L3505.9688,266.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="142" x="3517" y="264.9668">helm-source-dummy</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="3489" x2="3661" y1="276.8125" y2="276.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="3489" x2="3661" y1="284.8125" y2="284.8125"/><!--MD5=[7d486a52fcabfa08acb8358ffa257dfe]
+reverse link helm-source-async to helm-locate-source--><path d="M340.4,330.0825 C337.83,335.9025 335.62,341.8625 334,347.8125 C320.54,397.1225 304.29,421.2225 334,462.8125 C378.83,525.5725 466.88,548.1625 532.92,556.0625 " fill="none" id="helm-source-async&lt;-helm-locate-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="334.26,326.7225,349.6,312.1025,346.72,333.1025,334.26,326.7225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[59ec1b2dfc99414670695ca2c7ef7be5]
+reverse link helm-locate-override-inheritor to helm-locate-source--><path d="M700.06,454.9025 C679.31,481.1025 652.71,514.7125 635.27,536.7325 " fill="none" id="helm-locate-override-inheritor&lt;-helm-locate-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="694.78,450.2825,712.68,438.9525,705.76,458.9725,694.78,450.2825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ea3943677655752665563907a8ed1189]
+reverse link helm-type-file to helm-locate-override-inheritor--><path d="M1073.12,290.9425 C1013.75,304.5925 937.67,324.1925 872,347.8125 C838.56,359.8425 802.27,376.9325 774.88,390.7025 " fill="none" id="helm-type-file&lt;-helm-locate-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1071.93,284.0325,1092.98,286.4525,1075.01,297.6925,1071.93,284.0325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[c3c98643be5ce25a89a8fc176b95e73f]
+reverse link helm-source-in-buffer to helm-file-cache--><path d="M1570.73,291.9425 C1517.8,304.5925 1454.65,322.9725 1401,347.8125 C1376.42,359.1925 1351.2,376.5625 1332.63,390.6325 " fill="none" id="helm-source-in-buffer&lt;-helm-file-cache" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1569.4,285.0625,1590.47,287.3725,1572.56,298.7025,1569.4,285.0625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[20fb0892ad389f5d9224faeaf3fbf8f9]
+reverse link helm-type-file to helm-file-cache--><path d="M1220.34,321.1425 C1241.76,344.8625 1266.12,371.8625 1283.01,390.5625 " fill="none" id="helm-type-file&lt;-helm-file-cache" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1215.01,325.6825,1206.8,306.1525,1225.4,316.3025,1215.01,325.6825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[bab36c04217b3237bb981b2ca6f1bcf5]
+reverse link helm-source-in-buffer to helm-browse-project-source--><path d="M1571.06,293.6725 C1533.93,305.5125 1494.15,322.8225 1463,347.8125 C1415.96,385.5425 1437.65,424.6025 1391,462.8125 C1350.51,495.9725 1297.5,518.5325 1250.15,533.4825 " fill="none" id="helm-source-in-buffer&lt;-helm-browse-project-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1569.31,286.8925,1590.48,287.8925,1573.31,300.3125,1569.31,286.8925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ae9062e7e7a1f661ae844e732112097a]
+reverse link helm-browse-project-override-inheritor to helm-browse-project-source--><path d="M1069.09,455.9525 C1081.08,475.1425 1095.44,498.1125 1107.6,517.5625 " fill="none" id="helm-browse-project-override-inheritor&lt;-helm-browse-project-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1063.12,459.6225,1058.46,438.9525,1075,452.2025,1063.12,459.6225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7dce46f1711674df8238e0c6e8679f53]
+reverse link helm-type-file to helm-browse-project-override-inheritor--><path d="M1127.66,321.1425 C1106.24,344.8625 1081.88,371.8625 1064.99,390.5625 " fill="none" id="helm-type-file&lt;-helm-browse-project-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1122.6,316.3025,1141.2,306.1525,1132.99,325.6825,1122.6,316.3025" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[5fa17a1efdd398e28fa7575bea335940]
+reverse link helm-source-async to helm-fd-class--><path d="M305.07,323.8225 C293.97,331.8525 282.68,340.0425 272,347.8125 C252.57,361.9525 230.85,377.8725 213.61,390.5425 " fill="none" id="helm-source-async&lt;-helm-fd-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="301.34,317.8825,321.65,311.8325,309.54,329.2225,301.34,317.8825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[2dab3ea9bdbd523a70d6b4309b981517]
+reverse link helm-source-sync to helm-absolute-time-timers-class--><path d="M2855.77,321.6025 C2812.68,345.2825 2763.81,372.1425 2729.98,390.7425 " fill="none" id="helm-source-sync&lt;-helm-absolute-time-timers-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2852.62,315.3525,2873.51,311.8525,2859.36,327.6225,2852.62,315.3525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[69966f233324ab1b41ca6bc5703528d7]
+reverse link helm-type-timers to helm-absolute-time-timers-class--><path d="M2725.66,324.9025 C2716.02,347.6725 2705.36,372.8425 2697.85,390.5625 " fill="none" id="helm-type-timers&lt;-helm-absolute-time-timers-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2719.36,321.8325,2733.61,306.1525,2732.25,327.2925,2719.36,321.8325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[9f4d7494bd3425cac0331b57ecd466c2]
+reverse link helm-source-sync to helm-M-x-class--><path d="M3049.55,321.8725 C3064.01,330.1925 3078.55,338.9725 3092,347.8125 C3111.99,360.9425 3133.24,377.4425 3149.49,390.6625 " fill="none" id="helm-source-sync&lt;-helm-M-x-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="3046.01,327.9125,3032.03,311.9925,3052.89,315.7225,3046.01,327.9125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4ac71f6dd5cea0c13d2b9c31bc00a812]
+reverse link helm-type-command to helm-M-x-class--><path d="M3165.45,326.2725 C3168.41,348.6825 3171.64,373.1925 3173.93,390.5625 " fill="none" id="helm-type-command&lt;-helm-M-x-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="3158.47,326.8925,3162.79,306.1525,3172.35,325.0625,3158.47,326.8925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[bd9832b2051106d13c2f652e2dc85e4c]
+reverse link helm-source-sync to helm-source-buffers--><path d="M3054.73,311.5125 C3148.09,335.0825 3180.09,316.0825 3263,347.8125 C3290.35,358.2825 3318.27,376.2525 3338.44,390.8025 " fill="none" id="helm-source-sync&lt;-helm-source-buffers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="3052.67,318.2025,3035.21,306.2025,3056.35,304.7025,3052.67,318.2025" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[88c02f9cf13fd6689df37b68aefeb8b8]
+reverse link helm-type-buffer to helm-source-buffers--><path d="M3367.35,319.9525 C3367.52,343.9925 3367.71,371.6225 3367.84,390.6425 " fill="none" id="helm-type-buffer&lt;-helm-source-buffers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="3360.35,319.7025,3367.21,299.6525,3374.35,319.6025,3360.35,319.7025" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[97418b6d899cd58bad59cfd77e9ec07d]
+reverse link helm-source-filtered-bookmarks to helm-bookmark-find-files-class--><path d="M2322.8,459.0725 C2323.87,484.5925 2325.17,515.8625 2326.04,536.7325 " fill="none" id="helm-source-filtered-bookmarks&lt;-helm-bookmark-find-files-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2315.8,459.2225,2321.96,438.9525,2329.79,458.6425,2315.8,459.2225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[9dfed791578fb3f1a7675a563d26d6dc]
+reverse link helm-bookmark-override-inheritor to helm-bookmark-find-files-class--><path d="M2499.98,312.9825 C2500.78,354.4725 2496.39,417.3925 2468,462.8125 C2447.29,495.9425 2410.65,520.6325 2379.91,536.8125 " fill="none" id="helm-bookmark-override-inheritor&lt;-helm-bookmark-find-files-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2492.98,313.1825,2499.15,292.9125,2506.97,312.6125,2492.98,313.1825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[116a0e90e894ac99238d97b5f2f654c6]
+reverse link helm-source to helm-bookmark-override-inheritor--><path d="M2576.21,181.0625 C2556.21,202.9625 2533.88,227.4225 2518.04,244.7725 " fill="none" id="helm-source&lt;-helm-bookmark-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2571.24,176.1225,2589.89,166.0725,2581.58,185.5625,2571.24,176.1225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[38d3222c9d6413d0e8be51642b02db5a]
+reverse link helm-source-in-buffer to helm-source-filtered-bookmarks--><path d="M1795.65,279.1625 C1896.4,289.5325 2047.29,310.0325 2174,347.8125 C2210.19,358.6025 2249.09,376.3725 2277.78,390.7525 " fill="none" id="helm-source-in-buffer&lt;-helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1794.77,286.1125,1775.56,277.1625,1796.16,272.1825,1794.77,286.1125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[36bf56344c9fb562b92d13c27d56d2e6]
+reverse link helm-type-bookmark to helm-source-filtered-bookmarks--><path d="M2268.33,323.5325 C2281.83,346.6525 2296.89,372.4825 2307.44,390.5625 " fill="none" id="helm-type-bookmark&lt;-helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2262.23,326.9525,2258.2,306.1525,2274.32,319.9025,2262.23,326.9525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[560569eff9650cc936c24e2acd6b7c35]
+reverse link helm-source-in-buffer to helm-source-basic-bookmarks--><path d="M1731.08,327.5125 C1749.54,349.6525 1769.55,373.6725 1783.77,390.7425 " fill="none" id="helm-source-in-buffer&lt;-helm-source-basic-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1725.46,331.6925,1718.03,311.8525,1736.21,322.7325,1725.46,331.6925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[d74130942a07ed6c44229600fa80fecc]
+reverse link helm-type-bookmark to helm-source-basic-bookmarks--><path d="M2128.26,293.6725 C2072.18,307.2325 2003.11,325.8725 1943,347.8125 C1909.81,359.9225 1873.77,377.0125 1846.58,390.7625 " fill="none" id="helm-type-bookmark&lt;-helm-source-basic-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2126.83,286.8225,2147.91,289.0025,2130.07,300.4425,2126.83,286.8225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4124b062e967a48c84822db18248b7ac]
+reverse link helm-source-async to helm-mac-spotlight-source--><path d="M413.96,329.4525 C426.26,351.0525 439.43,374.1725 448.86,390.7425 " fill="none" id="helm-source-async&lt;-helm-mac-spotlight-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="407.75,332.6925,403.94,311.8525,419.92,325.7625,407.75,332.6925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[a474bc848475b2374c1d2bb84f271e9b]
+reverse link helm-type-file to helm-mac-spotlight-source--><path d="M1072.93,272.9725 C954.87,279.0125 754.83,296.6025 591,347.8125 C558.22,358.0525 523.73,376.1425 498.66,390.7925 " fill="none" id="helm-type-file&lt;-helm-mac-spotlight-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1072.62,265.9825,1092.93,272.0225,1073.29,279.9625,1072.62,265.9825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[52d97fd4d153f2c53b55b3f398cc83b3]
+reverse link helm-source-sync to helm-source-session-class--><path d="M2956.05,332.0525 C2958.08,352.8925 2960.21,374.8325 2961.76,390.7425 " fill="none" id="helm-source-sync&lt;-helm-source-session-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2949.06,332.4325,2954.09,311.8525,2962.99,331.0825,2949.06,332.4325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[808f17c2ae4c57b94c9dcfc78a1aa516]
+reverse link helm-source-sync to helm-files-dired-source--><path d="M2845.32,311.5625 C2551.27,373.0325 2455.67,265.1925 2174,347.8125 C2143.1,356.8825 2111.55,375.5525 2089.18,390.7325 " fill="none" id="helm-source-sync&lt;-helm-files-dired-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2843.94,304.6925,2864.98,307.2625,2846.93,318.3725,2843.94,304.6925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[05800070c5d625a950fe67b1123c2019]
+reverse link helm-type-file to helm-files-dired-source--><path d="M1275.34,280.7025 C1355.97,289.3125 1471.69,301.5525 1573,311.8125 C1737.38,328.4625 1785.6,297.5625 1943,347.8125 C1973.04,357.4025 2003.87,375.6325 2026.03,390.5025 " fill="none" id="helm-type-file&lt;-helm-files-dired-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1274.51,287.6525,1255.36,278.5625,1276,273.7325,1274.51,287.6525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[687fc8ec140e945488f732dae3c46e2b]
+reverse link helm-source to helm-type-timers--><path d="M2669.75,181.0125 C2685.16,197.8925 2701.96,216.2925 2716.12,231.7925 " fill="none" id="helm-source&lt;-helm-type-timers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2664.42,185.5625,2656.11,166.0725,2674.76,176.1225,2664.42,185.5625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[fde896bcedf28e4926ec99232971bb19]
+reverse link helm-source to helm-type-command--><path d="M2729.91,148.7125 C2817.68,165.4125 2944.7,192.3025 3053,225.8125 C3058.91,227.6425 3064.95,229.6525 3071.01,231.7825 " fill="none" id="helm-source&lt;-helm-type-command" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2728.5,155.5725,2710.14,145.0025,2731.09,141.8125,2728.5,155.5725" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[528fc0d38c023ea499a6c44f22caf734]
+reverse link helm-source to helm-type-buffer--><path d="M2730.44,138.1625 C2858.9,149.9225 3079.53,175.7525 3263,225.8125 C3275.3,229.1725 3288.12,233.5625 3300.38,238.2325 " fill="none" id="helm-source&lt;-helm-type-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2729.55,145.1125,2710.25,136.3625,2730.8,131.1725,2729.55,145.1125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[b3073f519ff1e7a9af7ffffd7406ad63]
+reverse link helm-source to helm-type-bookmark--><path d="M2516.89,165.1325 C2464.64,182.8325 2400.82,204.8925 2344,225.8125 C2338.19,227.9525 2332.23,230.1825 2326.22,232.4625 " fill="none" id="helm-source&lt;-helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2514.76,158.4725,2535.95,158.7025,2519.24,171.7325,2514.76,158.4725" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M2515.67,139.1325 C2325.59,155.7625 1917.33,191.9525 1573,225.8125 C1462.96,236.6325 1335.96,250.1825 1255.35,258.9225 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2515.31,132.1425,2535.84,137.3725,2516.53,146.0925,2515.31,132.1425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[573dc56a4a24525e354df005e91e161f]
+reverse link helm-source-in-buffer to helm-source-in-file--><path d="M1635.03,327.3725 C1622.76,342.1025 1609.79,357.6725 1598.28,371.4725 " fill="none" id="helm-source-in-buffer&lt;-helm-source-in-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1629.79,322.7325,1647.97,311.8525,1640.54,331.6925,1629.79,322.7325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[08cc1f31d63ae7c2a5398bb390fce2ff]
+reverse link helm-source to helm-source-dummy--><path d="M2730.63,132.6925 C2893.3,139.1125 3210.44,159.7625 3471,225.8125 C3489.31,230.4525 3508.67,237.6125 3525.67,244.7025 " fill="none" id="helm-source&lt;-helm-source-dummy" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2729.87,139.6625,2710.15,131.9225,2730.4,125.6725,2729.87,139.6625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M2516.04,145.5125 C2330.24,172.7925 1950.96,228.4725 1775.65,254.2125 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2515.03,138.5925,2535.83,142.6125,2517.06,152.4425,2515.03,138.5925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[894eacf2e17d1c2f4b307c7f81f3aeea]
+reverse link helm-source to helm-source-async--><path d="M2515.6,136.4225 C2128.14,160.2625 806.99,241.5425 462.62,262.7325 " fill="none" id="helm-source&lt;-helm-source-async" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2515.37,129.4225,2535.76,135.1825,2516.23,143.3925,2515.37,129.4225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M2727.05,173.7225 C2771.45,192.4625 2822.62,214.0525 2864.73,231.8225 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="2724.19,180.1125,2708.49,165.8925,2729.64,167.2125,2724.19,180.1125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[1ff86e10578f21ae8b7c2c33ec0b4b37]
+link helm-fd-class to helm-grep-class--><!--MD5=[47763c2a1b2b86ef2e5cabf3ea1dc8e3]
+link helm-grep-class to helm-grep-ag-class--><!--MD5=[7400861ebebd0193d7a8c5b8cf12d9cf]
+link helm-grep-ag-class to helm-gid-source--><!--MD5=[4c84627f8180be92cb025c49c1995b74]
+link helm-absolute-time-timers-class to helm-idle-time-timers-class--><!--MD5=[0121459bc19ca9b3817fd88a0f63b53f]
+link helm-source-session-class to helm-epa--><!--MD5=[77493b019ff1f193b2083288c0aa7870]
+link helm-epa to helm-esh-source--><!--MD5=[14248811f7820f097ffd7d933601bee6]
+link helm-esh-source to helm-eshell-history-source--><!--MD5=[87c4543d29bc52c4081d0e780f2252f0]
+link helm-eshell-history-source to helm-source-ffiles--><!--MD5=[e434868026635c23c12b73aa0f47c6ac]
+link helm-source-ffiles to helm-imenu-source--><!--MD5=[f316749d092a8c76e9bb7295c831b5d0]
+link helm-files-dired-source to helm-recentf-source--><!--MD5=[53fcd5504441ea495b261488ef408624]
+link helm-recentf-source to helm-files-in-current-dir-source--><!--MD5=[9014fc316cbcf9d4bdba39d695ece610]
+link helm-source-in-file to helm-list-el-package-source--><!--MD5=[4ac2637ea05c1f7d30e55ffaf8aec6e4]
+link helm-list-el-package-source to helm-info-source--><!--MD5=[0d1a75ebf8e8ae432e94545a2f4c4527]
+link helm-info-source to helm-locate-subdirs-source--><!--MD5=[d05c8f04ac81bce8613bbc82747cf830]
+link helm-locate-subdirs-source to helm-moccur-class--><!--MD5=[9c0181d7378f27cb4d8a6a4a75598756]
+link helm-moccur-class to helm-semantic-source--><!--MD5=[ef1dcaf54a93132f95b48d757e1b16bd]
+link helm-source-dummy to helm-type-function--><!--MD5=[5b5a5040aa2a50170216d4a0d161b718]
+@startuml
+skinparam classFontStyle bold
+skinparam classBackGroundColor #fbfb77
+skinparam TitleFontStyle bold
+skinparam TitleFontSize 24
+title Classes in library 'Helm'\n\n
+class "helm-locate-source" {
+}
+"helm-source-async" <|- - "helm-locate-source"
+"helm-locate-override-inheritor" <|- - "helm-locate-source"
+class "helm-locate-override-inheritor" {
+}
+"helm-type-file" <|- - "helm-locate-override-inheritor"
+class "helm-file-cache" {
+}
+"helm-source-in-buffer" <|- - "helm-file-cache"
+"helm-type-file" <|- - "helm-file-cache"
+class "helm-browse-project-source" {
+ Class to define a source in
+ `helm-browse-project' handling
+ non
+ ==
+}
+"helm-source-in-buffer" <|- - "helm-browse-project-source"
+"helm-browse-project-override-inheritor" <|- - "helm-browse-project-source"
+class "helm-browse-project-override-inheritor" {
+}
+"helm-type-file" <|- - "helm-browse-project-override-inheritor"
+class "helm-fd-class" {
+}
+"helm-source-async" <|- - "helm-fd-class"
+class "helm-absolute-time-timers-class" {
+}
+"helm-source-sync" <|- - "helm-absolute-time-timers-class"
+"helm-type-timers" <|- - "helm-absolute-time-timers-class"
+class "helm-M-x-class" {
+}
+"helm-source-sync" <|- - "helm-M-x-class"
+"helm-type-command" <|- - "helm-M-x-class"
+class "helm-source-buffers" {
+}
+"helm-source-sync" <|- - "helm-source-buffers"
+"helm-type-buffer" <|- - "helm-source-buffers"
+class "helm-bookmark-find-files-class" {
+}
+"helm-source-filtered-bookmarks" <|- - "helm-bookmark-find-files-class"
+"helm-bookmark-override-inheritor" <|- - "helm-bookmark-find-files-class"
+class "helm-bookmark-override-inheritor" {
+}
+"helm-source" <|- - "helm-bookmark-override-inheritor"
+class "helm-source-filtered-bookmarks" {
+}
+"helm-source-in-buffer" <|- - "helm-source-filtered-bookmarks"
+"helm-type-bookmark" <|- - "helm-source-filtered-bookmarks"
+class "helm-source-basic-bookmarks" {
+}
+"helm-source-in-buffer" <|- - "helm-source-basic-bookmarks"
+"helm-type-bookmark" <|- - "helm-source-basic-bookmarks"
+class "helm-mac-spotlight-source" {
+}
+"helm-source-async" <|- - "helm-mac-spotlight-source"
+"helm-type-file" <|- - "helm-mac-spotlight-source"
+class "helm-source-session-class" {
+}
+"helm-source-sync" <|- - "helm-source-session-class"
+class "helm-files-dired-source" {
+}
+"helm-source-sync" <|- - "helm-files-dired-source"
+"helm-type-file" <|- - "helm-files-dired-source"
+class "helm-type-timers" {
+ A class to define helm type
+ timers.
+ ==
+}
+"helm-source" <|- - "helm-type-timers"
+class "helm-type-command" {
+ A class to define helm type
+ command.
+ ==
+}
+"helm-source" <|- - "helm-type-command"
+class "helm-type-buffer" {
+ A class to define type buffer.
+ ==
+}
+"helm-source" <|- - "helm-type-buffer"
+class "helm-type-bookmark" {
+ A class to define type
+ bookmarks.
+ ==
+}
+"helm-source" <|- - "helm-type-bookmark"
+class "helm-type-file" {
+ A class to define helm type
+ file.
+ ==
+}
+"helm-source" <|- - "helm-type-file"
+class "helm-source-in-file" {
+ The contents of the FILE will
+ be used as candidates in
+ buffer.
+ ==
+}
+"helm-source-in-buffer" <|- - "helm-source-in-file"
+class "helm-source-dummy" {
+}
+"helm-source" <|- - "helm-source-dummy"
+class "helm-source-in-buffer" {
+ Use this source to make helm
+ sources storing candidates
+ inside a buffer.
+ ==
+}
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source-async" {
+ Use this class to define a
+ helm source calling an
+ external process.
+ ==
+}
+"helm-source" <|- - "helm-source-async"
+class "helm-source-sync" {
+ Use this class to make helm
+ sources using a list of
+ candidates.
+ ==
+}
+"helm-source" <|- - "helm-source-sync"
+class "helm-source" {
+ Main interface to define helm
+ sources.
+ ==
+}
+package "Other classes similar to 'helm-fd-class'" {
+ "helm-fd-class" -down[hidden]-> "helm-grep-class"
+ "helm-grep-class" -down[hidden]-> "helm-grep-ag-class"
+ "helm-grep-ag-class" -down[hidden]-> "helm-gid-source"
+}
+package "Other classes similar to 'helm-absolute-time-timers-class'" {
+ "helm-absolute-time-timers-class" -down[hidden]-> "helm-idle-time-timers-class"
+}
+package "Other classes similar to 'helm-source-session-class'" {
+ "helm-source-session-class" -down[hidden]-> "helm-epa"
+ "helm-epa" -down[hidden]-> "helm-esh-source"
+ "helm-esh-source" -down[hidden]-> "helm-eshell-history-source"
+ "helm-eshell-history-source" -down[hidden]-> "helm-source-ffiles"
+ "helm-source-ffiles" -down[hidden]-> "helm-imenu-source"
+}
+package "Other classes similar to 'helm-files-dired-source'" {
+ "helm-files-dired-source" -down[hidden]-> "helm-recentf-source"
+ "helm-recentf-source" -down[hidden]-> "helm-files-in-current-dir-source"
+}
+package "Other classes similar to 'helm-source-in-file'" {
+ "helm-source-in-file" -down[hidden]-> "helm-list-el-package-source"
+ "helm-list-el-package-source" -down[hidden]-> "helm-info-source"
+ "helm-info-source" -down[hidden]-> "helm-locate-subdirs-source"
+ "helm-locate-subdirs-source" -down[hidden]-> "helm-moccur-class"
+ "helm-moccur-class" -down[hidden]-> "helm-semantic-source"
+}
+package "Other classes similar to 'helm-source-dummy'" {
+ "helm-source-dummy" -down[hidden]-> "helm-type-function"
+}
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-epa.png b/doc/helm-figures/helm-epa.png
new file mode 100644
index 00000000..fec09398
--- /dev/null
+++ b/doc/helm-figures/helm-epa.png
Binary files differ
diff --git a/doc/helm-figures/helm-epa.svg b/doc/helm-figures/helm-epa.svg
new file mode 100644
index 00000000..2015c2b8
--- /dev/null
+++ b/doc/helm-figures/helm-epa.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="460px" preserveAspectRatio="none" style="width:417px;height:460px;" version="1.1" viewBox="0 0 417 460" width="417px" zoomAndPan="magnify"><defs><filter height="300%" id="fo7o9xfh1dsy8" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="91.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="105" x="159" y="37.6611">'helm-epa'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="214.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="214.5" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#fo7o9xfh1dsy8)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="12" y="199.8125"/><ellipse cx="27" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M29.9688,221.4531 Q29.3906,221.75 28.75,221.8906 Q28.1094,222.0469 27.4063,222.0469 Q24.9063,222.0469 23.5781,220.4063 Q22.2656,218.75 22.2656,215.625 Q22.2656,212.5 23.5781,210.8438 Q24.9063,209.1875 27.4063,209.1875 Q28.1094,209.1875 28.75,209.3438 Q29.4063,209.5 29.9688,209.7969 L29.9688,212.5156 Q29.3438,211.9375 28.75,211.6719 Q28.1563,211.3906 27.5313,211.3906 Q26.1875,211.3906 25.5,212.4688 Q24.8125,213.5313 24.8125,215.625 Q24.8125,217.7188 25.5,218.7969 Q26.1875,219.8594 27.5313,219.8594 Q28.1563,219.8594 28.75,219.5938 Q29.3438,219.3125 29.9688,218.7344 L29.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="41" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="13" x2="167" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="13" x2="167" y1="239.8125" y2="239.8125"/><!--MD5=[75687e4369f49c6cba1a6ff12ff0e7fa]
+class helm-epa--><rect fill="#FEFECE" filter="url(#fo7o9xfh1dsy8)" height="141.6328" id="helm-epa" style="stroke: #A80036; stroke-width: 1.5;" width="168" x="6" y="307.8125"/><ellipse cx="52.75" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M55.7188,329.4531 Q55.1406,329.75 54.5,329.8906 Q53.8594,330.0469 53.1563,330.0469 Q50.6563,330.0469 49.3281,328.4063 Q48.0156,326.75 48.0156,323.625 Q48.0156,320.5 49.3281,318.8438 Q50.6563,317.1875 53.1563,317.1875 Q53.8594,317.1875 54.5,317.3438 Q55.1563,317.5 55.7188,317.7969 L55.7188,320.5156 Q55.0938,319.9375 54.5,319.6719 Q53.9063,319.3906 53.2813,319.3906 Q51.9375,319.3906 51.25,320.4688 Q50.5625,321.5313 50.5625,323.625 Q50.5625,325.7188 51.25,326.7969 Q51.9375,327.8594 53.2813,327.8594 Q53.9063,327.8594 54.5,327.5938 Q55.0938,327.3125 55.7188,326.7344 L55.7188,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="66" x="73.25" y="327.9668">helm-epa</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="173" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="156" x="12" y="354.0229">Allow building helm sources</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="77" x="12" y="366.8276">for GPG keys.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="7" x2="173" y1="373.4219" y2="373.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="7" x2="173" y1="375.4219" y2="375.4219"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="12" y="404.437">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="417.2417">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="12" y="430.0464">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="12" y="442.8511">mode-line</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="26.5" y1="387.8242" y2="387.8242"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="26.5" y="391.1323">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="153.5" x2="173" y1="387.8242" y2="387.8242"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fo7o9xfh1dsy8)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="30.5" y="91.8125"/><ellipse cx="45.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M48.4688,113.4531 Q47.8906,113.75 47.25,113.8906 Q46.6094,114.0469 45.9063,114.0469 Q43.4063,114.0469 42.0781,112.4063 Q40.7656,110.75 40.7656,107.625 Q40.7656,104.5 42.0781,102.8438 Q43.4063,101.1875 45.9063,101.1875 Q46.6094,101.1875 47.25,101.3438 Q47.9063,101.5 48.4688,101.7969 L48.4688,104.5156 Q47.8438,103.9375 47.25,103.6719 Q46.6563,103.3906 46.0313,103.3906 Q44.6875,103.3906 44,104.4688 Q43.3125,105.5313 43.3125,107.625 Q43.3125,109.7188 44,110.7969 Q44.6875,111.8594 46.0313,111.8594 Q46.6563,111.8594 47.25,111.5938 Q47.8438,111.3125 48.4688,110.7344 L48.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="59.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="31.5" x2="148.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="31.5" x2="148.5" y1="131.8125" y2="131.8125"/><path d="M209,351.3125 L209,374.8125 L174.34,378.8125 L209,382.8125 L209,406.7109 A0,0 0 0 0 209,406.7109 L405,406.7109 A0,0 0 0 0 405,406.7109 L405,361.3125 L395,351.3125 L209,351.3125 A0,0 0 0 0 209,351.3125 " fill="#FBFB77" filter="url(#fo7o9xfh1dsy8)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M395,351.3125 L395,361.3125 L405,361.3125 L395,351.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="69" x="215" y="368.3794">helm-epa</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="284" y="368.3794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="175" x="215" y="383.5122">Allow building helm sources</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="86" x="215" y="398.645">for GPG keys.</text><!--MD5=[7e5f38bd9ae0e1bb94a273709f715bc1]
+reverse link helm-source-sync to helm-epa--><path d="M90,268.2425 C90,280.5125 90,294.1725 90,307.5825 " fill="none" id="helm-source-sync&lt;-helm-epa" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="83,268.0525,90,248.0525,97,268.0525,83,268.0525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M90,159.8325 C90,173.3925 90,187.8525 90,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="83,159.8125,90,139.8125,97,159.8125,83,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7068a30a50db157eca643f07df57529f]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-epa'**\n\n
+"helm-source-sync" <|- - "helm-epa"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-epa" {
+ Allow building helm sources
+ for GPG keys.
+ ==
+ __ some interesting slots __
+ init
+ candidates
+ keymap
+ mode-line
+}
+note right of "helm-epa"
+ **helm-epa**:
+ Allow building helm sources
+ for GPG keys.
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-esh-source.png b/doc/helm-figures/helm-esh-source.png
new file mode 100644
index 00000000..8266ae74
--- /dev/null
+++ b/doc/helm-figures/helm-esh-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-esh-source.svg b/doc/helm-figures/helm-esh-source.svg
new file mode 100644
index 00000000..68e5e6a2
--- /dev/null
+++ b/doc/helm-figures/helm-esh-source.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="486px" preserveAspectRatio="none" style="width:435px;height:486px;" version="1.1" viewBox="0 0 435 486" width="435px" zoomAndPan="magnify"><defs><filter height="300%" id="f19d4rxgbabkl7" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="100.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="179" x="131" y="37.6611">'helm-esh-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="223.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="223.5" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#f19d4rxgbabkl7)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="20" y="199.8125"/><ellipse cx="35" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M37.9688,221.4531 Q37.3906,221.75 36.75,221.8906 Q36.1094,222.0469 35.4063,222.0469 Q32.9063,222.0469 31.5781,220.4063 Q30.2656,218.75 30.2656,215.625 Q30.2656,212.5 31.5781,210.8438 Q32.9063,209.1875 35.4063,209.1875 Q36.1094,209.1875 36.75,209.3438 Q37.4063,209.5 37.9688,209.7969 L37.9688,212.5156 Q37.3438,211.9375 36.75,211.6719 Q36.1563,211.3906 35.5313,211.3906 Q34.1875,211.3906 33.5,212.4688 Q32.8125,213.5313 32.8125,215.625 Q32.8125,217.7188 33.5,218.7969 Q34.1875,219.8594 35.5313,219.8594 Q36.1563,219.8594 36.75,219.5938 Q37.3438,219.3125 37.9688,218.7344 L37.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="49" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="21" x2="175" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="21" x2="175" y1="239.8125" y2="239.8125"/><!--MD5=[3960967beb69c61591e67bd0b8c5ae1c]
+class helm-esh-source--><rect fill="#FEFECE" filter="url(#f19d4rxgbabkl7)" height="167.2422" id="helm-esh-source" style="stroke: #A80036; stroke-width: 1.5;" width="184" x="6" y="307.8125"/><ellipse cx="36.3" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M39.2688,329.4531 Q38.6906,329.75 38.05,329.8906 Q37.4094,330.0469 36.7063,330.0469 Q34.2063,330.0469 32.8781,328.4063 Q31.5656,326.75 31.5656,323.625 Q31.5656,320.5 32.8781,318.8438 Q34.2063,317.1875 36.7063,317.1875 Q37.4094,317.1875 38.05,317.3438 Q38.7063,317.5 39.2688,317.7969 L39.2688,320.5156 Q38.6438,319.9375 38.05,319.6719 Q37.4563,319.3906 36.8313,319.3906 Q35.4875,319.3906 34.8,320.4688 Q34.1125,321.5313 34.1125,323.625 Q34.1125,325.7188 34.8,326.7969 Q35.4875,327.8594 36.8313,327.8594 Q37.4563,327.8594 38.05,327.5938 Q38.6438,327.3125 39.2688,326.7344 L39.2688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="118" x="53.7" y="327.9668">helm-esh-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="189" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="156" x="12" y="354.0229">Helm class to define source</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="122" x="12" y="366.8276">for Eshell completion.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="7" x2="189" y1="373.4219" y2="373.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="7" x2="189" y1="375.4219" y2="375.4219"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="12" y="404.437">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="12" y="417.2417">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="430.0464">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="12" y="442.8511">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="455.6558">nohighlight</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="96" x="12" y="468.4604">persistent-action</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="34.5" y1="387.8242" y2="387.8242"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="34.5" y="391.1323">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="161.5" x2="189" y1="387.8242" y2="387.8242"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f19d4rxgbabkl7)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="38.5" y="91.8125"/><ellipse cx="53.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.4688,113.4531 Q55.8906,113.75 55.25,113.8906 Q54.6094,114.0469 53.9063,114.0469 Q51.4063,114.0469 50.0781,112.4063 Q48.7656,110.75 48.7656,107.625 Q48.7656,104.5 50.0781,102.8438 Q51.4063,101.1875 53.9063,101.1875 Q54.6094,101.1875 55.25,101.3438 Q55.9063,101.5 56.4688,101.7969 L56.4688,104.5156 Q55.8438,103.9375 55.25,103.6719 Q54.6563,103.3906 54.0313,103.3906 Q52.6875,103.3906 52,104.4688 Q51.3125,105.5313 51.3125,107.625 Q51.3125,109.7188 52,110.7969 Q52.6875,111.8594 54.0313,111.8594 Q54.6563,111.8594 55.25,111.5938 Q55.8438,111.3125 56.4688,110.7344 L56.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="67.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="131.8125" y2="131.8125"/><path d="M225,363.8125 L225,387.3125 L190.25,391.3125 L225,395.3125 L225,419.2109 A0,0 0 0 0 225,419.2109 L423,419.2109 A0,0 0 0 0 423,419.2109 L423,373.8125 L413,363.8125 L225,363.8125 A0,0 0 0 0 225,363.8125 " fill="#FBFB77" filter="url(#f19d4rxgbabkl7)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M413,363.8125 L413,373.8125 L423,373.8125 L413,363.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="121" x="231" y="380.8794">helm-esh-source</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="352" y="380.8794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="177" x="231" y="396.0122">Helm class to define source</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="137" x="231" y="411.145">for Eshell completion.</text><!--MD5=[3538d698cbe22ffcb5425ab9a9243391]
+reverse link helm-source-sync to helm-esh-source--><path d="M98,267.9125 C98,280.1625 98,293.9325 98,307.7025 " fill="none" id="helm-source-sync&lt;-helm-esh-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,267.8225,98,247.8225,105,267.8225,91,267.8225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M98,159.8325 C98,173.3925 98,187.8525 98,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,159.8125,98,139.8125,105,159.8125,91,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[5a7135172eed18ac4e7326421ffc73f8]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-esh-source'**\n\n
+"helm-source-sync" <|- - "helm-esh-source"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-esh-source" {
+ Helm class to define source
+ for Eshell completion.
+ ==
+ __ some interesting slots __
+ init
+ action
+ candidates
+ filtered-candidate-transformer
+ nohighlight
+ persistent-action
+}
+note right of "helm-esh-source"
+ **helm-esh-source**:
+ Helm class to define source
+ for Eshell completion.
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-eshell-history-source.png b/doc/helm-figures/helm-eshell-history-source.png
new file mode 100644
index 00000000..43a58cd5
--- /dev/null
+++ b/doc/helm-figures/helm-eshell-history-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-eshell-history-source.svg b/doc/helm-figures/helm-eshell-history-source.svg
new file mode 100644
index 00000000..fb092b66
--- /dev/null
+++ b/doc/helm-figures/helm-eshell-history-source.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="498px" preserveAspectRatio="none" style="width:493px;height:498px;" version="1.1" viewBox="0 0 493 498" width="493px" zoomAndPan="magnify"><defs><filter height="300%" id="f1825r3tjfbznu" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="129.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="282" x="108.5" y="37.6611">'helm-eshell-history-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="252.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="252.5" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#f1825r3tjfbznu)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="39" y="199.8125"/><ellipse cx="54" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.9688,221.4531 Q56.3906,221.75 55.75,221.8906 Q55.1094,222.0469 54.4063,222.0469 Q51.9063,222.0469 50.5781,220.4063 Q49.2656,218.75 49.2656,215.625 Q49.2656,212.5 50.5781,210.8438 Q51.9063,209.1875 54.4063,209.1875 Q55.1094,209.1875 55.75,209.3438 Q56.4063,209.5 56.9688,209.7969 L56.9688,212.5156 Q56.3438,211.9375 55.75,211.6719 Q55.1563,211.3906 54.5313,211.3906 Q53.1875,211.3906 52.5,212.4688 Q51.8125,213.5313 51.8125,215.625 Q51.8125,217.7188 52.5,218.7969 Q53.1875,219.8594 54.5313,219.8594 Q55.1563,219.8594 55.75,219.5938 Q56.3438,219.3125 56.9688,218.7344 L56.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="68" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="40" x2="194" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="40" x2="194" y1="239.8125" y2="239.8125"/><!--MD5=[282aa25f9d306cf00c48aa2e4e60e732]
+class helm-eshell-history-source--><rect fill="#FEFECE" filter="url(#f1825r3tjfbznu)" height="180.0469" id="helm-eshell-history-source" style="stroke: #A80036; stroke-width: 1.5;" width="222" x="6" y="307.8125"/><ellipse cx="21" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,329.4531 Q23.3906,329.75 22.75,329.8906 Q22.1094,330.0469 21.4063,330.0469 Q18.9063,330.0469 17.5781,328.4063 Q16.2656,326.75 16.2656,323.625 Q16.2656,320.5 17.5781,318.8438 Q18.9063,317.1875 21.4063,317.1875 Q22.1094,317.1875 22.75,317.3438 Q23.4063,317.5 23.9688,317.7969 L23.9688,320.5156 Q23.3438,319.9375 22.75,319.6719 Q22.1563,319.3906 21.5313,319.3906 Q20.1875,319.3906 19.5,320.4688 Q18.8125,321.5313 18.8125,323.625 Q18.8125,325.7188 19.5,326.7969 Q20.1875,327.8594 21.5313,327.8594 Q22.1563,327.8594 22.75,327.5938 Q23.3438,327.3125 23.9688,326.7344 L23.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="190" x="35" y="327.9668">helm-eshell-history-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="227" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="156" x="12" y="354.0229">Helm class to define source</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="99" x="12" y="366.8276">for Eshell history.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="7" x2="227" y1="373.4219" y2="373.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="7" x2="227" y1="375.4219" y2="375.4219"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="12" y="404.437">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="12" y="417.2417">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="12" y="430.0464">candidate-number-limit</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="442.8511">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="12" y="455.6558">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="48" x="12" y="468.4604">multiline</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="43" x="12" y="481.2651">nomark</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="53.5" y1="387.8242" y2="387.8242"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="53.5" y="391.1323">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="180.5" x2="227" y1="387.8242" y2="387.8242"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1825r3tjfbznu)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="57.5" y="91.8125"/><ellipse cx="72.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M75.4688,113.4531 Q74.8906,113.75 74.25,113.8906 Q73.6094,114.0469 72.9063,114.0469 Q70.4063,114.0469 69.0781,112.4063 Q67.7656,110.75 67.7656,107.625 Q67.7656,104.5 69.0781,102.8438 Q70.4063,101.1875 72.9063,101.1875 Q73.6094,101.1875 74.25,101.3438 Q74.9063,101.5 75.4688,101.7969 L75.4688,104.5156 Q74.8438,103.9375 74.25,103.6719 Q73.6563,103.3906 73.0313,103.3906 Q71.6875,103.3906 71,104.4688 Q70.3125,105.5313 70.3125,107.625 Q70.3125,109.7188 71,110.7969 Q71.6875,111.8594 73.0313,111.8594 Q73.6563,111.8594 74.25,111.5938 Q74.8438,111.3125 75.4688,110.7344 L75.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="86.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="58.5" x2="175.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="58.5" x2="175.5" y1="131.8125" y2="131.8125"/><path d="M263,370.3125 L263,393.8125 L228.06,397.8125 L263,401.8125 L263,425.7109 A0,0 0 0 0 263,425.7109 L481,425.7109 A0,0 0 0 0 481,425.7109 L481,380.3125 L471,370.3125 L263,370.3125 A0,0 0 0 0 263,370.3125 " fill="#FBFB77" filter="url(#f1825r3tjfbznu)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M471,370.3125 L471,380.3125 L481,380.3125 L471,370.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="193" x="269" y="387.3794">helm-eshell-history-source</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="462" y="387.3794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="177" x="269" y="402.5122">Helm class to define source</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="109" x="269" y="417.645">for Eshell history.</text><!--MD5=[fef6fcdc8cf3b550f0b2dccd98f262c8]
+reverse link helm-source-sync to helm-eshell-history-source--><path d="M117,268.3825 C117,280.4225 117,293.9525 117,307.5825 " fill="none" id="helm-source-sync&lt;-helm-eshell-history-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="110,268.0125,117,248.0125,124,268.0125,110,268.0125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M117,159.8325 C117,173.3925 117,187.8525 117,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="110,159.8125,117,139.8125,124,159.8125,110,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ca59d3baf3ee3f8dafb32b8fee0e66d1]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-eshell-history-source'**\n\n
+"helm-source-sync" <|- - "helm-eshell-history-source"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-eshell-history-source" {
+ Helm class to define source
+ for Eshell history.
+ ==
+ __ some interesting slots __
+ init
+ action
+ candidate-number-limit
+ candidates
+ keymap
+ multiline
+ nomark
+}
+note right of "helm-eshell-history-source"
+ **helm-eshell-history-source**:
+ Helm class to define source
+ for Eshell history.
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-fd-class.png b/doc/helm-figures/helm-fd-class.png
new file mode 100644
index 00000000..0e896bdd
--- /dev/null
+++ b/doc/helm-figures/helm-fd-class.png
Binary files differ
diff --git a/doc/helm-figures/helm-fd-class.svg b/doc/helm-figures/helm-fd-class.svg
new file mode 100644
index 00000000..788a913b
--- /dev/null
+++ b/doc/helm-figures/helm-fd-class.svg
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="478px" preserveAspectRatio="none" style="width:357px;height:478px;" version="1.1" viewBox="0 0 357 478" width="357px" zoomAndPan="magnify"><defs><filter height="300%" id="f18usoniyle2x" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="61.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="147" x="108" y="37.6611">'helm-fd-class'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="184.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="184.5" y="79.5674"/><!--MD5=[12d16a9c65828dace8d907a7ab3ef450]
+class helm-source-async--><rect fill="#FEFECE" filter="url(#f18usoniyle2x)" height="48" id="helm-source-async" style="stroke: #A80036; stroke-width: 1.5;" width="165" x="15.5" y="199.8125"/><ellipse cx="30.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M33.4688,221.4531 Q32.8906,221.75 32.25,221.8906 Q31.6094,222.0469 30.9063,222.0469 Q28.4063,222.0469 27.0781,220.4063 Q25.7656,218.75 25.7656,215.625 Q25.7656,212.5 27.0781,210.8438 Q28.4063,209.1875 30.9063,209.1875 Q31.6094,209.1875 32.25,209.3438 Q32.9063,209.5 33.4688,209.7969 L33.4688,212.5156 Q32.8438,211.9375 32.25,211.6719 Q31.6563,211.3906 31.0313,211.3906 Q29.6875,211.3906 29,212.4688 Q28.3125,213.5313 28.3125,215.625 Q28.3125,217.7188 29,218.7969 Q29.6875,219.8594 31.0313,219.8594 Q31.6563,219.8594 32.25,219.5938 Q32.8438,219.3125 33.4688,218.7344 L33.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="133" x="44.5" y="219.9668">helm-source-async</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="16.5" x2="179.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="16.5" x2="179.5" y1="239.8125" y2="239.8125"/><!--MD5=[bd2ea1af02554a0352e5fd98d33b66ab]
+class helm-fd-class--><rect fill="#FEFECE" filter="url(#f18usoniyle2x)" height="159.2422" id="helm-fd-class" style="stroke: #A80036; stroke-width: 1.5;" width="184" x="6" y="307.8125"/><ellipse cx="47.1" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M50.0688,329.4531 Q49.4906,329.75 48.85,329.8906 Q48.2094,330.0469 47.5063,330.0469 Q45.0063,330.0469 43.6781,328.4063 Q42.3656,326.75 42.3656,323.625 Q42.3656,320.5 43.6781,318.8438 Q45.0063,317.1875 47.5063,317.1875 Q48.2094,317.1875 48.85,317.3438 Q49.5063,317.5 50.0688,317.7969 L50.0688,320.5156 Q49.4438,319.9375 48.85,319.6719 Q48.2563,319.3906 47.6313,319.3906 Q46.2875,319.3906 45.6,320.4688 Q44.9125,321.5313 44.9125,323.625 Q44.9125,325.7188 45.6,326.7969 Q46.2875,327.8594 47.6313,327.8594 Q48.2563,327.8594 48.85,327.5938 Q49.4438,327.3125 50.0688,326.7344 L50.0688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="94" x="66.9" y="327.9668">helm-fd-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="189" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="12" y="370.8276">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="12" y="383.6323">candidate-number-limit</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x="12" y="396.437">candidates-process</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="12" y="409.2417">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="12" y="422.0464">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="12" y="434.8511">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="447.6558">nohighlight</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="12" y="460.4604">requires-pattern</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="34.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="34.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="161.5" x2="189" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f18usoniyle2x)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="38.5" y="91.8125"/><ellipse cx="53.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.4688,113.4531 Q55.8906,113.75 55.25,113.8906 Q54.6094,114.0469 53.9063,114.0469 Q51.4063,114.0469 50.0781,112.4063 Q48.7656,110.75 48.7656,107.625 Q48.7656,104.5 50.0781,102.8438 Q51.4063,101.1875 53.9063,101.1875 Q54.6094,101.1875 55.25,101.3438 Q55.9063,101.5 56.4688,101.7969 L56.4688,104.5156 Q55.8438,103.9375 55.25,103.6719 Q54.6563,103.3906 54.0313,103.3906 Q52.6875,103.3906 52,104.4688 Q51.3125,105.5313 51.3125,107.625 Q51.3125,109.7188 52,110.7969 Q52.6875,111.8594 54.0313,111.8594 Q54.6563,111.8594 55.25,111.5938 Q55.8438,111.3125 56.4688,110.7344 L56.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="67.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="131.8125" y2="131.8125"/><path d="M225,374.8125 L225,383.3125 L190.04,387.3125 L225,391.3125 L225,399.9453 A0,0 0 0 0 225,399.9453 L345,399.9453 A0,0 0 0 0 345,399.9453 L345,384.8125 L335,374.8125 L225,374.8125 A0,0 0 0 0 225,374.8125 " fill="#FBFB77" filter="url(#f18usoniyle2x)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M335,374.8125 L335,384.8125 L345,384.8125 L335,374.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="99" x="231" y="391.8794">helm-fd-class</text><!--MD5=[5fa17a1efdd398e28fa7575bea335940]
+reverse link helm-source-async to helm-fd-class--><path d="M98,268.0825 C98,280.3525 98,294.0925 98,307.7525 " fill="none" id="helm-source-async&lt;-helm-fd-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,267.9525,98,247.9525,105,267.9525,91,267.9525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[894eacf2e17d1c2f4b307c7f81f3aeea]
+reverse link helm-source to helm-source-async--><path d="M98,159.8325 C98,173.3925 98,187.8525 98,199.4925 " fill="none" id="helm-source&lt;-helm-source-async" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,159.8125,98,139.8125,105,159.8125,91,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[72237c03af2d61abdcad347f4ab92545]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-fd-class'**\n\n
+"helm-source-async" <|- - "helm-fd-class"
+class "helm-source-async"
+"helm-source" <|- - "helm-source-async"
+class "helm-source"
+class "helm-fd-class" {
+ __ some interesting slots __
+ action
+ candidate-number-limit
+ candidates-process
+ filtered-candidate-transformer
+ help-message
+ keymap
+ nohighlight
+ requires-pattern
+}
+note right of "helm-fd-class"
+ **helm-fd-class**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-file-cache.png b/doc/helm-figures/helm-file-cache.png
new file mode 100644
index 00000000..ec6c884e
--- /dev/null
+++ b/doc/helm-figures/helm-file-cache.png
Binary files differ
diff --git a/doc/helm-figures/helm-file-cache.svg b/doc/helm-figures/helm-file-cache.svg
new file mode 100644
index 00000000..99b4ec69
--- /dev/null
+++ b/doc/helm-figures/helm-file-cache.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="490px" preserveAspectRatio="none" style="width:444px;height:490px;" version="1.1" viewBox="0 0 444 490" width="444px" zoomAndPan="magnify"><defs><filter height="300%" id="fe67s8stbn6f9" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="105" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="166" x="142" y="37.6611">'helm-file-cache'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="228" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="228" y="79.5674"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#fe67s8stbn6f9)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="35" y="219.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="239.8125" y2="239.8125"/><!--MD5=[11858bbdb8c329cf3bf1e5498cb0b794]
+class helm-file-cache--><rect fill="#FEFECE" filter="url(#fe67s8stbn6f9)" height="172.0469" id="helm-file-cache" style="stroke: #A80036; stroke-width: 1.5;" width="139" x="125" y="307.8125"/><ellipse cx="140" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M142.9688,329.4531 Q142.3906,329.75 141.75,329.8906 Q141.1094,330.0469 140.4063,330.0469 Q137.9063,330.0469 136.5781,328.4063 Q135.2656,326.75 135.2656,323.625 Q135.2656,320.5 136.5781,318.8438 Q137.9063,317.1875 140.4063,317.1875 Q141.1094,317.1875 141.75,317.3438 Q142.4063,317.5 142.9688,317.7969 L142.9688,320.5156 Q142.3438,319.9375 141.75,319.6719 Q141.1563,319.3906 140.5313,319.3906 Q139.1875,319.3906 138.5,320.4688 Q137.8125,321.5313 137.8125,323.625 Q137.8125,325.7188 138.5,326.7969 Q139.1875,327.8594 140.5313,327.8594 Q141.1563,327.8594 141.75,327.5938 Q142.3438,327.3125 142.9688,326.7344 L142.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="107" x="154" y="327.9668">helm-file-cache</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="126" x2="263" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="131" y="370.8276">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="131" y="383.6323">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="25" x="131" y="396.437">data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="131" y="409.2417">get-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="131" y="422.0464">match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="131" y="434.8511">migemo</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="131" y="447.6558">search</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="131" y="460.4604">search-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="40" x="131" y="473.2651">volatile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="126" x2="131" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="131" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="258" x2="263" y1="354.2148" y2="354.2148"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FEFECE" filter="url(#fe67s8stbn6f9)" height="48" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="130" x="226.5" y="199.8125"/><ellipse cx="241.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M244.4688,221.4531 Q243.8906,221.75 243.25,221.8906 Q242.6094,222.0469 241.9063,222.0469 Q239.4063,222.0469 238.0781,220.4063 Q236.7656,218.75 236.7656,215.625 Q236.7656,212.5 238.0781,210.8438 Q239.4063,209.1875 241.9063,209.1875 Q242.6094,209.1875 243.25,209.3438 Q243.9063,209.5 244.4688,209.7969 L244.4688,212.5156 Q243.8438,211.9375 243.25,211.6719 Q242.6563,211.3906 242.0313,211.3906 Q240.6875,211.3906 240,212.4688 Q239.3125,213.5313 239.3125,215.625 Q239.3125,217.7188 240,218.7969 Q240.6875,219.8594 242.0313,219.8594 Q242.6563,219.8594 243.25,219.5938 Q243.8438,219.3125 244.4688,218.7344 L244.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="255.5" y="219.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="227.5" x2="355.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="227.5" x2="355.5" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fe67s8stbn6f9)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="135" y="91.8125"/><ellipse cx="150" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M152.9688,113.4531 Q152.3906,113.75 151.75,113.8906 Q151.1094,114.0469 150.4063,114.0469 Q147.9063,114.0469 146.5781,112.4063 Q145.2656,110.75 145.2656,107.625 Q145.2656,104.5 146.5781,102.8438 Q147.9063,101.1875 150.4063,101.1875 Q151.1094,101.1875 151.75,101.3438 Q152.4063,101.5 152.9688,101.7969 L152.9688,104.5156 Q152.3438,103.9375 151.75,103.6719 Q151.1563,103.3906 150.5313,103.3906 Q149.1875,103.3906 148.5,104.4688 Q147.8125,105.5313 147.8125,107.625 Q147.8125,109.7188 148.5,110.7969 Q149.1875,111.8594 150.5313,111.8594 Q151.1563,111.8594 151.75,111.5938 Q152.3438,111.3125 152.9688,110.7344 L152.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="164" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="136" x2="253" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="136" x2="253" y1="131.8125" y2="131.8125"/><path d="M299,381.3125 L299,389.8125 L264.3,393.8125 L299,397.8125 L299,406.4453 A0,0 0 0 0 299,406.4453 L432,406.4453 A0,0 0 0 0 432,406.4453 L432,391.3125 L422,381.3125 L299,381.3125 A0,0 0 0 0 299,381.3125 " fill="#FBFB77" filter="url(#fe67s8stbn6f9)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M422,381.3125 L422,391.3125 L432,391.3125 L422,381.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="112" x="305" y="398.3794">helm-file-cache</text><!--MD5=[c3c98643be5ce25a89a8fc176b95e73f]
+reverse link helm-source-in-buffer to helm-file-cache--><path d="M121.77,265.5325 C129.06,278.2825 137.39,292.8625 145.75,307.4925 " fill="none" id="helm-source-in-buffer&lt;-helm-file-cache" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="115.49,268.6625,111.65,247.8225,127.65,261.7125,115.49,268.6625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[20fb0892ad389f5d9224faeaf3fbf8f9]
+reverse link helm-type-file to helm-file-cache--><path d="M267.99,265.5325 C260.63,278.2825 252.21,292.8625 243.76,307.4925 " fill="none" id="helm-type-file&lt;-helm-file-cache" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="262.15,261.6425,278.22,247.8225,274.28,268.6425,262.15,261.6425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M159.88,155.0425 C146.41,169.9125 131.42,186.4625 119.62,199.4925 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="155.06,149.9425,173.67,139.8125,165.43,159.3325,155.06,149.9425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M229.48,155.0425 C243.09,169.9125 258.24,186.4625 270.16,199.4925 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="223.89,159.2925,215.55,139.8125,234.21,149.8425,223.89,159.2925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[c187c2778045b11ebcb4cf5f0c3a0ea9]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-file-cache'**\n\n
+"helm-source-in-buffer" <|- - "helm-file-cache"
+"helm-type-file" <|- - "helm-file-cache"
+class "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-type-file"
+"helm-source" <|- - "helm-type-file"
+class "helm-source"
+class "helm-file-cache" {
+ __ some interesting slots __
+ init
+ candidates
+ data
+ get-line
+ match
+ migemo
+ search
+ search-strict
+ volatile
+}
+note right of "helm-file-cache"
+ **helm-file-cache**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-files-dired-source.png b/doc/helm-figures/helm-files-dired-source.png
new file mode 100644
index 00000000..a525a90f
--- /dev/null
+++ b/doc/helm-figures/helm-files-dired-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-files-dired-source.svg b/doc/helm-figures/helm-files-dired-source.svg
new file mode 100644
index 00000000..3ce31e5d
--- /dev/null
+++ b/doc/helm-figures/helm-files-dired-source.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="426px" preserveAspectRatio="none" style="width:509px;height:426px;" version="1.1" viewBox="0 0 509 426" width="509px" zoomAndPan="magnify"><defs><filter height="300%" id="fuyzaglaqmq10" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="138" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="246" x="135" y="37.6611">'helm-files-dired-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="261" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="261" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#fuyzaglaqmq10)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="35" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="239.8125" y2="239.8125"/><!--MD5=[9c6bffcc58873ff705394a767f912448]
+class helm-files-dired-source--><rect fill="#FEFECE" filter="url(#fuyzaglaqmq10)" height="108.0234" id="helm-files-dired-source" style="stroke: #A80036; stroke-width: 1.5;" width="196" x="75" y="307.8125"/><ellipse cx="90" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M92.9688,329.4531 Q92.3906,329.75 91.75,329.8906 Q91.1094,330.0469 90.4063,330.0469 Q87.9063,330.0469 86.5781,328.4063 Q85.2656,326.75 85.2656,323.625 Q85.2656,320.5 86.5781,318.8438 Q87.9063,317.1875 90.4063,317.1875 Q91.1094,317.1875 91.75,317.3438 Q92.4063,317.5 92.9688,317.7969 L92.9688,320.5156 Q92.3438,319.9375 91.75,319.6719 Q91.1563,319.3906 90.5313,319.3906 Q89.1875,319.3906 88.5,320.4688 Q87.8125,321.5313 87.8125,323.625 Q87.8125,325.7188 88.5,326.7969 Q89.1875,327.8594 90.5313,327.8594 Q91.1563,327.8594 91.75,327.5938 Q92.3438,327.3125 92.9688,326.7344 L92.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="164" x="104" y="327.9668">helm-files-dired-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="76" x2="270" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="81" y="370.8276">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="81" y="383.6323">match-dynamic</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="81" y="396.437">match-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="81" y="409.2417">migemo</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="76" x2="109.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="109.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="236.5" x2="270" y1="354.2148" y2="354.2148"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FEFECE" filter="url(#fuyzaglaqmq10)" height="48" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="130" x="197" y="199.8125"/><ellipse cx="212" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M214.9688,221.4531 Q214.3906,221.75 213.75,221.8906 Q213.1094,222.0469 212.4063,222.0469 Q209.9063,222.0469 208.5781,220.4063 Q207.2656,218.75 207.2656,215.625 Q207.2656,212.5 208.5781,210.8438 Q209.9063,209.1875 212.4063,209.1875 Q213.1094,209.1875 213.75,209.3438 Q214.4063,209.5 214.9688,209.7969 L214.9688,212.5156 Q214.3438,211.9375 213.75,211.6719 Q213.1563,211.3906 212.5313,211.3906 Q211.1875,211.3906 210.5,212.4688 Q209.8125,213.5313 209.8125,215.625 Q209.8125,217.7188 210.5,218.7969 Q211.1875,219.8594 212.5313,219.8594 Q213.1563,219.8594 213.75,219.5938 Q214.3438,219.3125 214.9688,218.7344 L214.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="226" y="219.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="198" x2="326" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="198" x2="326" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fuyzaglaqmq10)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="113.5" y="91.8125"/><ellipse cx="128.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M131.4688,113.4531 Q130.8906,113.75 130.25,113.8906 Q129.6094,114.0469 128.9063,114.0469 Q126.4063,114.0469 125.0781,112.4063 Q123.7656,110.75 123.7656,107.625 Q123.7656,104.5 125.0781,102.8438 Q126.4063,101.1875 128.9063,101.1875 Q129.6094,101.1875 130.25,101.3438 Q130.9063,101.5 131.4688,101.7969 L131.4688,104.5156 Q130.8438,103.9375 130.25,103.6719 Q129.6563,103.3906 129.0313,103.3906 Q127.6875,103.3906 127,104.4688 Q126.3125,105.5313 126.3125,107.625 Q126.3125,109.7188 127,110.7969 Q127.6875,111.8594 129.0313,111.8594 Q129.6563,111.8594 130.25,111.5938 Q130.8438,111.3125 131.4688,110.7344 L131.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="142.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="114.5" x2="231.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="114.5" x2="231.5" y1="131.8125" y2="131.8125"/><path d="M306.5,349.3125 L306.5,357.8125 L271.4,361.8125 L306.5,365.8125 L306.5,374.4453 A0,0 0 0 0 306.5,374.4453 L497.5,374.4453 A0,0 0 0 0 497.5,374.4453 L497.5,359.3125 L487.5,349.3125 L306.5,349.3125 A0,0 0 0 0 306.5,349.3125 " fill="#FBFB77" filter="url(#fuyzaglaqmq10)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M487.5,349.3125 L487.5,359.3125 L497.5,359.3125 L487.5,349.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="170" x="312.5" y="366.3794">helm-files-dired-source</text><!--MD5=[808f17c2ae4c57b94c9dcfc78a1aa516]
+reverse link helm-source-sync to helm-files-dired-source--><path d="M110.18,264.8225 C118.95,278.2225 128.88,293.3825 138.2,307.6325 " fill="none" id="helm-source-sync&lt;-helm-files-dired-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="104.19,268.4525,99.1,247.8825,115.91,260.7825,104.19,268.4525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[05800070c5d625a950fe67b1123c2019]
+reverse link helm-type-file to helm-files-dired-source--><path d="M235.82,264.8225 C227.05,278.2225 217.12,293.3825 207.8,307.6325 " fill="none" id="helm-type-file&lt;-helm-files-dired-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="230.09,260.7825,246.9,247.8825,241.81,268.4525,230.09,260.7825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M140.5,155.5125 C128.12,170.2625 114.4,186.6025 103.58,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="135.47,150.6325,153.69,139.8125,146.19,159.6325,135.47,150.6325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M205.5,155.5125 C217.88,170.2625 231.6,186.6025 242.42,199.4925 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="199.81,159.6325,192.31,139.8125,210.53,150.6325,199.81,159.6325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[622cd5c8b4196b7a8947a394b2102dfc]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-files-dired-source'**\n\n
+"helm-source-sync" <|- - "helm-files-dired-source"
+"helm-type-file" <|- - "helm-files-dired-source"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-type-file"
+"helm-source" <|- - "helm-type-file"
+class "helm-source"
+class "helm-files-dired-source" {
+ __ some interesting slots __
+ candidates
+ match-dynamic
+ match-strict
+ migemo
+}
+note right of "helm-files-dired-source"
+ **helm-files-dired-source**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-files-in-current-dir-source.png b/doc/helm-figures/helm-files-in-current-dir-source.png
new file mode 100644
index 00000000..e8bb2484
--- /dev/null
+++ b/doc/helm-figures/helm-files-in-current-dir-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-files-in-current-dir-source.svg b/doc/helm-figures/helm-files-in-current-dir-source.svg
new file mode 100644
index 00000000..c8fa91cc
--- /dev/null
+++ b/doc/helm-figures/helm-files-in-current-dir-source.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="465px" preserveAspectRatio="none" style="width:595px;height:465px;" version="1.1" viewBox="0 0 595 465" width="595px" zoomAndPan="magnify"><defs><filter height="300%" id="f1s5lvxh8wai4r" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="180.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="330" x="135.5" y="37.6611">'helm-files-in-current-dir-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="303.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="303.5" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#f1s5lvxh8wai4r)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="35" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="239.8125" y2="239.8125"/><!--MD5=[b49d18483e901ae1bf6135ad896f4fad]
+class helm-files-in-current-dir-source--><rect fill="#FEFECE" filter="url(#f1s5lvxh8wai4r)" height="146.4375" id="helm-files-in-current-dir-source" style="stroke: #A80036; stroke-width: 1.5;" width="253" x="46.5" y="307.8125"/><ellipse cx="61.5" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M64.4688,329.4531 Q63.8906,329.75 63.25,329.8906 Q62.6094,330.0469 61.9063,330.0469 Q59.4063,330.0469 58.0781,328.4063 Q56.7656,326.75 56.7656,323.625 Q56.7656,320.5 58.0781,318.8438 Q59.4063,317.1875 61.9063,317.1875 Q62.6094,317.1875 63.25,317.3438 Q63.9063,317.5 64.4688,317.7969 L64.4688,320.5156 Q63.8438,319.9375 63.25,319.6719 Q62.6563,319.3906 62.0313,319.3906 Q60.6875,319.3906 60,320.4688 Q59.3125,321.5313 59.3125,323.625 Q59.3125,325.7188 60,326.7969 Q60.6875,327.8594 62.0313,327.8594 Q62.6563,327.8594 63.25,327.5938 Q63.8438,327.3125 64.4688,326.7344 L64.4688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="221" x="75.5" y="327.9668">helm-files-in-current-dir-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="47.5" x2="298.5" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="52.5" y="370.8276">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="52.5" y="383.6323">fuzzy-match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="52.5" y="396.437">match-dynamic</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="52.5" y="409.2417">match-part</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="52.5" y="422.0464">match-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="52.5" y="434.8511">migemo</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="114" x="52.5" y="447.6558">pattern-transformer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="47.5" x2="109.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="109.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="236.5" x2="298.5" y1="354.2148" y2="354.2148"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FEFECE" filter="url(#f1s5lvxh8wai4r)" height="48" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="130" x="197" y="199.8125"/><ellipse cx="212" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M214.9688,221.4531 Q214.3906,221.75 213.75,221.8906 Q213.1094,222.0469 212.4063,222.0469 Q209.9063,222.0469 208.5781,220.4063 Q207.2656,218.75 207.2656,215.625 Q207.2656,212.5 208.5781,210.8438 Q209.9063,209.1875 212.4063,209.1875 Q213.1094,209.1875 213.75,209.3438 Q214.4063,209.5 214.9688,209.7969 L214.9688,212.5156 Q214.3438,211.9375 213.75,211.6719 Q213.1563,211.3906 212.5313,211.3906 Q211.1875,211.3906 210.5,212.4688 Q209.8125,213.5313 209.8125,215.625 Q209.8125,217.7188 210.5,218.7969 Q211.1875,219.8594 212.5313,219.8594 Q213.1563,219.8594 213.75,219.5938 Q214.3438,219.3125 214.9688,218.7344 L214.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="226" y="219.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="198" x2="326" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="198" x2="326" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1s5lvxh8wai4r)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="113.5" y="91.8125"/><ellipse cx="128.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M131.4688,113.4531 Q130.8906,113.75 130.25,113.8906 Q129.6094,114.0469 128.9063,114.0469 Q126.4063,114.0469 125.0781,112.4063 Q123.7656,110.75 123.7656,107.625 Q123.7656,104.5 125.0781,102.8438 Q126.4063,101.1875 128.9063,101.1875 Q129.6094,101.1875 130.25,101.3438 Q130.9063,101.5 131.4688,101.7969 L131.4688,104.5156 Q130.8438,103.9375 130.25,103.6719 Q129.6563,103.3906 129.0313,103.3906 Q127.6875,103.3906 127,104.4688 Q126.3125,105.5313 126.3125,107.625 Q126.3125,109.7188 127,110.7969 Q127.6875,111.8594 129.0313,111.8594 Q129.6563,111.8594 130.25,111.5938 Q130.8438,111.3125 131.4688,110.7344 L131.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="142.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="114.5" x2="231.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="114.5" x2="231.5" y1="131.8125" y2="131.8125"/><path d="M335,368.3125 L335,376.8125 L299.52,380.8125 L335,384.8125 L335,393.4453 A0,0 0 0 0 335,393.4453 L583,393.4453 A0,0 0 0 0 583,393.4453 L583,378.3125 L573,368.3125 L335,368.3125 A0,0 0 0 0 335,368.3125 " fill="#FBFB77" filter="url(#f1s5lvxh8wai4r)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M573,368.3125 L573,378.3125 L583,378.3125 L573,368.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="227" x="341" y="385.3794">helm-files-in-current-dir-source</text><!--MD5=[5935dd93b3799671c2a2f238d681efd2]
+reverse link helm-source-sync to helm-files-in-current-dir-source--><path d="M107.35,265.4825 C114.8,278.4425 123.27,293.1925 131.59,307.6925 " fill="none" id="helm-source-sync&lt;-helm-files-in-current-dir-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="101.21,268.8425,97.32,248.0225,113.35,261.8725,101.21,268.8425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[3570d02ac558741aaeedfaae7abb82a0]
+reverse link helm-type-file to helm-files-in-current-dir-source--><path d="M238.65,265.4825 C231.2,278.4425 222.73,293.1925 214.41,307.6925 " fill="none" id="helm-type-file&lt;-helm-files-in-current-dir-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="232.65,261.8725,248.68,248.0225,244.79,268.8425,232.65,261.8725" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M140.5,155.5125 C128.12,170.2625 114.4,186.6025 103.58,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="135.47,150.6325,153.69,139.8125,146.19,159.6325,135.47,150.6325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M205.5,155.5125 C217.88,170.2625 231.6,186.6025 242.42,199.4925 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="199.81,159.6325,192.31,139.8125,210.53,150.6325,199.81,159.6325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[de037b6aa04e7b2bd0355bc18a5c2467]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-files-in-current-dir-source'**\n\n
+"helm-source-sync" <|- - "helm-files-in-current-dir-source"
+"helm-type-file" <|- - "helm-files-in-current-dir-source"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-type-file"
+"helm-source" <|- - "helm-type-file"
+class "helm-source"
+class "helm-files-in-current-dir-source" {
+ __ some interesting slots __
+ candidates
+ fuzzy-match
+ match-dynamic
+ match-part
+ match-strict
+ migemo
+ pattern-transformer
+}
+note right of "helm-files-in-current-dir-source"
+ **helm-files-in-current-dir-source**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-gid-source.png b/doc/helm-figures/helm-gid-source.png
new file mode 100644
index 00000000..2cef3b79
--- /dev/null
+++ b/doc/helm-figures/helm-gid-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-gid-source.svg b/doc/helm-figures/helm-gid-source.svg
new file mode 100644
index 00000000..0fac7893
--- /dev/null
+++ b/doc/helm-figures/helm-gid-source.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="516px" preserveAspectRatio="none" style="width:377px;height:516px;" version="1.1" viewBox="0 0 377 516" width="377px" zoomAndPan="magnify"><defs><filter height="300%" id="fuzp320c75zmw" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="71.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="175" x="104" y="37.6611">'helm-gid-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="194.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="194.5" y="79.5674"/><!--MD5=[12d16a9c65828dace8d907a7ab3ef450]
+class helm-source-async--><rect fill="#FEFECE" filter="url(#fuzp320c75zmw)" height="48" id="helm-source-async" style="stroke: #A80036; stroke-width: 1.5;" width="165" x="15.5" y="199.8125"/><ellipse cx="30.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M33.4688,221.4531 Q32.8906,221.75 32.25,221.8906 Q31.6094,222.0469 30.9063,222.0469 Q28.4063,222.0469 27.0781,220.4063 Q25.7656,218.75 25.7656,215.625 Q25.7656,212.5 27.0781,210.8438 Q28.4063,209.1875 30.9063,209.1875 Q31.6094,209.1875 32.25,209.3438 Q32.9063,209.5 33.4688,209.7969 L33.4688,212.5156 Q32.8438,211.9375 32.25,211.6719 Q31.6563,211.3906 31.0313,211.3906 Q29.6875,211.3906 29,212.4688 Q28.3125,213.5313 28.3125,215.625 Q28.3125,217.7188 29,218.7969 Q29.6875,219.8594 31.0313,219.8594 Q31.6563,219.8594 32.25,219.5938 Q32.8438,219.3125 33.4688,218.7344 L33.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="133" x="44.5" y="219.9668">helm-source-async</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="16.5" x2="179.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="16.5" x2="179.5" y1="239.8125" y2="239.8125"/><!--MD5=[d36bc6d3d79507f675f4471be5eaf52f]
+class helm-gid-source--><rect fill="#FEFECE" filter="url(#fuzp320c75zmw)" height="197.6563" id="helm-gid-source" style="stroke: #A80036; stroke-width: 1.5;" width="184" x="6" y="307.8125"/><ellipse cx="38.1" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M41.0688,329.4531 Q40.4906,329.75 39.85,329.8906 Q39.2094,330.0469 38.5063,330.0469 Q36.0063,330.0469 34.6781,328.4063 Q33.3656,326.75 33.3656,323.625 Q33.3656,320.5 34.6781,318.8438 Q36.0063,317.1875 38.5063,317.1875 Q39.2094,317.1875 39.85,317.3438 Q40.5063,317.5 41.0688,317.7969 L41.0688,320.5156 Q40.4438,319.9375 39.85,319.6719 Q39.2563,319.3906 38.6313,319.3906 Q37.2875,319.3906 36.6,320.4688 Q35.9125,321.5313 35.9125,323.625 Q35.9125,325.7188 36.6,326.7969 Q37.2875,327.8594 38.6313,327.8594 Q39.2563,327.8594 39.85,327.5938 Q40.4438,327.3125 41.0688,326.7344 L41.0688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="114" x="55.9" y="327.9668">helm-gid-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="189" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="12" y="370.8276">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="12" y="383.6323">candidate-number-limit</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x="12" y="396.437">candidates-process</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="33" x="12" y="409.2417">db-dir</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="12" y="422.0464">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="12" y="434.8511">header-name</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="12" y="447.6558">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="12" y="460.4604">history</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="473.2651">nohighlight</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="96" x="12" y="486.0698">persistent-action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="12" y="498.8745">requires-pattern</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="34.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="34.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="161.5" x2="189" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fuzp320c75zmw)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="38.5" y="91.8125"/><ellipse cx="53.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.4688,113.4531 Q55.8906,113.75 55.25,113.8906 Q54.6094,114.0469 53.9063,114.0469 Q51.4063,114.0469 50.0781,112.4063 Q48.7656,110.75 48.7656,107.625 Q48.7656,104.5 50.0781,102.8438 Q51.4063,101.1875 53.9063,101.1875 Q54.6094,101.1875 55.25,101.3438 Q55.9063,101.5 56.4688,101.7969 L56.4688,104.5156 Q55.8438,103.9375 55.25,103.6719 Q54.6563,103.3906 54.0313,103.3906 Q52.6875,103.3906 52,104.4688 Q51.3125,105.5313 51.3125,107.625 Q51.3125,109.7188 52,110.7969 Q52.6875,111.8594 54.0313,111.8594 Q54.6563,111.8594 55.25,111.5938 Q55.8438,111.3125 56.4688,110.7344 L56.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="67.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="131.8125" y2="131.8125"/><path d="M225,394.3125 L225,402.8125 L190.34,406.8125 L225,410.8125 L225,419.4453 A0,0 0 0 0 225,419.4453 L365,419.4453 A0,0 0 0 0 365,419.4453 L365,404.3125 L355,394.3125 L225,394.3125 A0,0 0 0 0 225,394.3125 " fill="#FBFB77" filter="url(#fuzp320c75zmw)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M355,394.3125 L355,404.3125 L365,404.3125 L355,394.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="119" x="231" y="411.3794">helm-gid-source</text><!--MD5=[b87e7a6cd6a876f20d8b301dfc1041b2]
+reverse link helm-source-async to helm-gid-source--><path d="M98,268.3425 C98,280.3225 98,293.8325 98,307.5725 " fill="none" id="helm-source-async&lt;-helm-gid-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,268.1025,98,248.1025,105,268.1025,91,268.1025" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[894eacf2e17d1c2f4b307c7f81f3aeea]
+reverse link helm-source to helm-source-async--><path d="M98,159.8325 C98,173.3925 98,187.8525 98,199.4925 " fill="none" id="helm-source&lt;-helm-source-async" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,159.8125,98,139.8125,105,159.8125,91,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7443060113d122c368d2c13424c1ddb7]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-gid-source'**\n\n
+"helm-source-async" <|- - "helm-gid-source"
+class "helm-source-async"
+"helm-source" <|- - "helm-source-async"
+class "helm-source"
+class "helm-gid-source" {
+ __ some interesting slots __
+ action
+ candidate-number-limit
+ candidates-process
+ db-dir
+ filtered-candidate-transformer
+ header-name
+ help-message
+ history
+ nohighlight
+ persistent-action
+ requires-pattern
+}
+note right of "helm-gid-source"
+ **helm-gid-source**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-grep-ag-class.png b/doc/helm-figures/helm-grep-ag-class.png
new file mode 100644
index 00000000..70d4475a
--- /dev/null
+++ b/doc/helm-figures/helm-grep-ag-class.png
Binary files differ
diff --git a/doc/helm-figures/helm-grep-ag-class.svg b/doc/helm-figures/helm-grep-ag-class.svg
new file mode 100644
index 00000000..cc2689b0
--- /dev/null
+++ b/doc/helm-figures/helm-grep-ag-class.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="542px" preserveAspectRatio="none" style="width:400px;height:542px;" version="1.1" viewBox="0 0 400 542" width="400px" zoomAndPan="magnify"><defs><filter height="300%" id="f1ixg3k1rclaa4" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="83.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="205" x="101" y="37.6611">'helm-grep-ag-class'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="206.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="206.5" y="79.5674"/><!--MD5=[12d16a9c65828dace8d907a7ab3ef450]
+class helm-source-async--><rect fill="#FEFECE" filter="url(#f1ixg3k1rclaa4)" height="48" id="helm-source-async" style="stroke: #A80036; stroke-width: 1.5;" width="165" x="15.5" y="199.8125"/><ellipse cx="30.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M33.4688,221.4531 Q32.8906,221.75 32.25,221.8906 Q31.6094,222.0469 30.9063,222.0469 Q28.4063,222.0469 27.0781,220.4063 Q25.7656,218.75 25.7656,215.625 Q25.7656,212.5 27.0781,210.8438 Q28.4063,209.1875 30.9063,209.1875 Q31.6094,209.1875 32.25,209.3438 Q32.9063,209.5 33.4688,209.7969 L33.4688,212.5156 Q32.8438,211.9375 32.25,211.6719 Q31.6563,211.3906 31.0313,211.3906 Q29.6875,211.3906 29,212.4688 Q28.3125,213.5313 28.3125,215.625 Q28.3125,217.7188 29,218.7969 Q29.6875,219.8594 31.0313,219.8594 Q31.6563,219.8594 32.25,219.5938 Q32.8438,219.3125 33.4688,218.7344 L33.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="133" x="44.5" y="219.9668">helm-source-async</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="16.5" x2="179.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="16.5" x2="179.5" y1="239.8125" y2="239.8125"/><!--MD5=[48c627d917d22eb9e4865aed3bf653fb]
+class helm-grep-ag-class--><rect fill="#FEFECE" filter="url(#f1ixg3k1rclaa4)" height="223.2656" id="helm-grep-ag-class" style="stroke: #A80036; stroke-width: 1.5;" width="184" x="6" y="307.8125"/><ellipse cx="28.2" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M31.1688,329.4531 Q30.5906,329.75 29.95,329.8906 Q29.3094,330.0469 28.6063,330.0469 Q26.1063,330.0469 24.7781,328.4063 Q23.4656,326.75 23.4656,323.625 Q23.4656,320.5 24.7781,318.8438 Q26.1063,317.1875 28.6063,317.1875 Q29.3094,317.1875 29.95,317.3438 Q30.6063,317.5 31.1688,317.7969 L31.1688,320.5156 Q30.5438,319.9375 29.95,319.6719 Q29.3563,319.3906 28.7313,319.3906 Q27.3875,319.3906 26.7,320.4688 Q26.0125,321.5313 26.0125,323.625 Q26.0125,325.7188 26.7,326.7969 Q27.3875,327.8594 28.7313,327.8594 Q29.3563,327.8594 29.95,327.5938 Q30.5438,327.3125 31.1688,326.7344 L31.1688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="136" x="43.8" y="327.9668">helm-grep-ag-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="189" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="12" y="370.8276">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="12" y="383.6323">candidate-number-limit</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="12" y="396.437">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="33" x="12" y="409.2417">group</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="12" y="422.0464">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="12" y="434.8511">history</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="12" y="447.6558">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="460.4604">nohighlight</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="43" x="12" y="473.2651">nomark</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="25" x="12" y="486.0698">pcre</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="96" x="12" y="498.8745">persistent-action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="12" y="511.6792">persistent-help</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="12" y="524.4839">requires-pattern</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="34.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="34.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="161.5" x2="189" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1ixg3k1rclaa4)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="38.5" y="91.8125"/><ellipse cx="53.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.4688,113.4531 Q55.8906,113.75 55.25,113.8906 Q54.6094,114.0469 53.9063,114.0469 Q51.4063,114.0469 50.0781,112.4063 Q48.7656,110.75 48.7656,107.625 Q48.7656,104.5 50.0781,102.8438 Q51.4063,101.1875 53.9063,101.1875 Q54.6094,101.1875 55.25,101.3438 Q55.9063,101.5 56.4688,101.7969 L56.4688,104.5156 Q55.8438,103.9375 55.25,103.6719 Q54.6563,103.3906 54.0313,103.3906 Q52.6875,103.3906 52,104.4688 Q51.3125,105.5313 51.3125,107.625 Q51.3125,109.7188 52,110.7969 Q52.6875,111.8594 54.0313,111.8594 Q54.6563,111.8594 55.25,111.5938 Q55.8438,111.3125 56.4688,110.7344 L56.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="67.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="131.8125" y2="131.8125"/><path d="M225.5,406.8125 L225.5,415.3125 L190.25,419.3125 L225.5,423.3125 L225.5,431.9453 A0,0 0 0 0 225.5,431.9453 L388.5,431.9453 A0,0 0 0 0 388.5,431.9453 L388.5,416.8125 L378.5,406.8125 L225.5,406.8125 A0,0 0 0 0 225.5,406.8125 " fill="#FBFB77" filter="url(#f1ixg3k1rclaa4)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M378.5,406.8125 L378.5,416.8125 L388.5,416.8125 L378.5,406.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="142" x="231.5" y="423.8794">helm-grep-ag-class</text><!--MD5=[e220d22ad778b6230f0552c8a1eae9ee]
+reverse link helm-source-async to helm-grep-ag-class--><path d="M98,268.3225 C98,280.2925 98,293.8425 98,307.7825 " fill="none" id="helm-source-async&lt;-helm-grep-ag-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,268.1525,98,248.1525,105,268.1525,91,268.1525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[894eacf2e17d1c2f4b307c7f81f3aeea]
+reverse link helm-source to helm-source-async--><path d="M98,159.8325 C98,173.3925 98,187.8525 98,199.4925 " fill="none" id="helm-source&lt;-helm-source-async" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,159.8125,98,139.8125,105,159.8125,91,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[b7d1f337b208ac00f328bb7eef5406c7]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-grep-ag-class'**\n\n
+"helm-source-async" <|- - "helm-grep-ag-class"
+class "helm-source-async"
+"helm-source" <|- - "helm-source-async"
+class "helm-source"
+class "helm-grep-ag-class" {
+ __ some interesting slots __
+ action
+ candidate-number-limit
+ filtered-candidate-transformer
+ group
+ help-message
+ history
+ keymap
+ nohighlight
+ nomark
+ pcre
+ persistent-action
+ persistent-help
+ requires-pattern
+}
+note right of "helm-grep-ag-class"
+ **helm-grep-ag-class**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-grep-class.png b/doc/helm-figures/helm-grep-class.png
new file mode 100644
index 00000000..a3541e38
--- /dev/null
+++ b/doc/helm-figures/helm-grep-class.png
Binary files differ
diff --git a/doc/helm-figures/helm-grep-class.svg b/doc/helm-figures/helm-grep-class.svg
new file mode 100644
index 00000000..1544d2c6
--- /dev/null
+++ b/doc/helm-figures/helm-grep-class.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="593px" preserveAspectRatio="none" style="width:376px;height:593px;" version="1.1" viewBox="0 0 376 593" width="376px" zoomAndPan="magnify"><defs><filter height="300%" id="f1ru64uwkhcblu" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="71.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="173" x="105" y="37.6611">'helm-grep-class'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="194.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="194.5" y="79.5674"/><!--MD5=[12d16a9c65828dace8d907a7ab3ef450]
+class helm-source-async--><rect fill="#FEFECE" filter="url(#f1ru64uwkhcblu)" height="48" id="helm-source-async" style="stroke: #A80036; stroke-width: 1.5;" width="165" x="15.5" y="199.8125"/><ellipse cx="30.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M33.4688,221.4531 Q32.8906,221.75 32.25,221.8906 Q31.6094,222.0469 30.9063,222.0469 Q28.4063,222.0469 27.0781,220.4063 Q25.7656,218.75 25.7656,215.625 Q25.7656,212.5 27.0781,210.8438 Q28.4063,209.1875 30.9063,209.1875 Q31.6094,209.1875 32.25,209.3438 Q32.9063,209.5 33.4688,209.7969 L33.4688,212.5156 Q32.8438,211.9375 32.25,211.6719 Q31.6563,211.3906 31.0313,211.3906 Q29.6875,211.3906 29,212.4688 Q28.3125,213.5313 28.3125,215.625 Q28.3125,217.7188 29,218.7969 Q29.6875,219.8594 31.0313,219.8594 Q31.6563,219.8594 32.25,219.5938 Q32.8438,219.3125 33.4688,218.7344 L33.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="133" x="44.5" y="219.9668">helm-source-async</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="16.5" x2="179.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="16.5" x2="179.5" y1="239.8125" y2="239.8125"/><!--MD5=[91bb0adfdf7bf369d8d23bbe4e952f89]
+class helm-grep-class--><rect fill="#FEFECE" filter="url(#f1ru64uwkhcblu)" height="274.4844" id="helm-grep-class" style="stroke: #A80036; stroke-width: 1.5;" width="184" x="6" y="307.8125"/><ellipse cx="38.55" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M41.5188,329.4531 Q40.9406,329.75 40.3,329.8906 Q39.6594,330.0469 38.9563,330.0469 Q36.4563,330.0469 35.1281,328.4063 Q33.8156,326.75 33.8156,323.625 Q33.8156,320.5 35.1281,318.8438 Q36.4563,317.1875 38.9563,317.1875 Q39.6594,317.1875 40.3,317.3438 Q40.9563,317.5 41.5188,317.7969 L41.5188,320.5156 Q40.8938,319.9375 40.3,319.6719 Q39.7063,319.3906 39.0813,319.3906 Q37.7375,319.3906 37.05,320.4688 Q36.3625,321.5313 36.3625,323.625 Q36.3625,325.7188 37.05,326.7969 Q37.7375,327.8594 39.0813,327.8594 Q39.7063,327.8594 40.3,327.5938 Q40.8938,327.3125 41.5188,326.7344 L41.5188,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="113" x="56.45" y="327.9668">helm-grep-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="189" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="12" y="370.8276">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="12" y="383.6323">after-init-hook</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="47" x="12" y="396.437">backend</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="12" y="409.2417">before-init-hook</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="12" y="422.0464">candidate-number-limit</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x="12" y="434.8511">candidates-process</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="12" y="447.6558">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="33" x="12" y="460.4604">group</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="12" y="473.2651">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="12" y="486.0698">history</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="12" y="498.8745">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="511.6792">nohighlight</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="43" x="12" y="524.4839">nomark</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="25" x="12" y="537.2886">pcre</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="96" x="12" y="550.0933">persistent-action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="12" y="562.8979">persistent-help</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="12" y="575.7026">requires-pattern</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="34.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="34.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="161.5" x2="189" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1ru64uwkhcblu)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="38.5" y="91.8125"/><ellipse cx="53.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.4688,113.4531 Q55.8906,113.75 55.25,113.8906 Q54.6094,114.0469 53.9063,114.0469 Q51.4063,114.0469 50.0781,112.4063 Q48.7656,110.75 48.7656,107.625 Q48.7656,104.5 50.0781,102.8438 Q51.4063,101.1875 53.9063,101.1875 Q54.6094,101.1875 55.25,101.3438 Q55.9063,101.5 56.4688,101.7969 L56.4688,104.5156 Q55.8438,103.9375 55.25,103.6719 Q54.6563,103.3906 54.0313,103.3906 Q52.6875,103.3906 52,104.4688 Q51.3125,105.5313 51.3125,107.625 Q51.3125,109.7188 52,110.7969 Q52.6875,111.8594 54.0313,111.8594 Q54.6563,111.8594 55.25,111.5938 Q55.8438,111.3125 56.4688,110.7344 L56.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="67.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="131.8125" y2="131.8125"/><path d="M225.5,432.3125 L225.5,440.8125 L190.34,444.8125 L225.5,448.8125 L225.5,457.4453 A0,0 0 0 0 225.5,457.4453 L364.5,457.4453 A0,0 0 0 0 364.5,457.4453 L364.5,442.3125 L354.5,432.3125 L225.5,432.3125 A0,0 0 0 0 225.5,432.3125 " fill="#FBFB77" filter="url(#f1ru64uwkhcblu)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M354.5,432.3125 L354.5,442.3125 L364.5,442.3125 L354.5,432.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="118" x="231.5" y="449.3794">helm-grep-class</text><!--MD5=[99faec0dbdb16852c37e6e30b1aacff5]
+reverse link helm-source-async to helm-grep-class--><path d="M98,268.2725 C98,280.0925 98,293.5525 98,307.6325 " fill="none" id="helm-source-async&lt;-helm-grep-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,267.8325,98,247.8325,105,267.8325,91,267.8325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[894eacf2e17d1c2f4b307c7f81f3aeea]
+reverse link helm-source to helm-source-async--><path d="M98,159.8325 C98,173.3925 98,187.8525 98,199.4925 " fill="none" id="helm-source&lt;-helm-source-async" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,159.8125,98,139.8125,105,159.8125,91,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[297030e255d81ccad4d31be8224cc600]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-grep-class'**\n\n
+"helm-source-async" <|- - "helm-grep-class"
+class "helm-source-async"
+"helm-source" <|- - "helm-source-async"
+class "helm-source"
+class "helm-grep-class" {
+ __ some interesting slots __
+ action
+ after-init-hook
+ backend
+ before-init-hook
+ candidate-number-limit
+ candidates-process
+ filtered-candidate-transformer
+ group
+ help-message
+ history
+ keymap
+ nohighlight
+ nomark
+ pcre
+ persistent-action
+ persistent-help
+ requires-pattern
+}
+note right of "helm-grep-class"
+ **helm-grep-class**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-idle-time-timers-class.png b/doc/helm-figures/helm-idle-time-timers-class.png
new file mode 100644
index 00000000..082fe45b
--- /dev/null
+++ b/doc/helm-figures/helm-idle-time-timers-class.png
Binary files differ
diff --git a/doc/helm-figures/helm-idle-time-timers-class.svg b/doc/helm-figures/helm-idle-time-timers-class.svg
new file mode 100644
index 00000000..d35ab696
--- /dev/null
+++ b/doc/helm-figures/helm-idle-time-timers-class.svg
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="452px" preserveAspectRatio="none" style="width:559px;height:452px;" version="1.1" viewBox="0 0 559 452" width="559px" zoomAndPan="magnify"><defs><filter height="300%" id="f5qn4uknt8vv3" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="163" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="287" x="139.5" y="37.6611">'helm-idle-time-timers-class'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="286" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="286" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#f5qn4uknt8vv3)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="35" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="239.8125" y2="239.8125"/><!--MD5=[65c9e2a5e033ac2de329b35010304c74]
+class helm-idle-time-timers-class--><rect fill="#FEFECE" filter="url(#f5qn4uknt8vv3)" height="133.6328" id="helm-idle-time-timers-class" style="stroke: #A80036; stroke-width: 1.5;" width="224" x="67" y="307.8125"/><ellipse cx="82" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M84.9688,329.4531 Q84.3906,329.75 83.75,329.8906 Q83.1094,330.0469 82.4063,330.0469 Q79.9063,330.0469 78.5781,328.4063 Q77.2656,326.75 77.2656,323.625 Q77.2656,320.5 78.5781,318.8438 Q79.9063,317.1875 82.4063,317.1875 Q83.1094,317.1875 83.75,317.3438 Q84.4063,317.5 84.9688,317.7969 L84.9688,320.5156 Q84.3438,319.9375 83.75,319.6719 Q83.1563,319.3906 82.5313,319.3906 Q81.1875,319.3906 80.5,320.4688 Q79.8125,321.5313 79.8125,323.625 Q79.8125,325.7188 80.5,326.7969 Q81.1875,327.8594 82.5313,327.8594 Q83.1563,327.8594 83.75,327.5938 Q84.3438,327.3125 84.9688,326.7344 L84.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="192" x="96" y="327.9668">helm-idle-time-timers-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="68" x2="290" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="61" x="73" y="370.8276">allow-dups</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="128" x="73" y="383.6323">candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="73" y="396.437">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="73" y="409.2417">match-dynamic</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="73" y="422.0464">match-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="73" y="434.8511">migemo</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="68" x2="115.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="115.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="242.5" x2="290" y1="354.2148" y2="354.2148"/><!--MD5=[d89fbe3a66aa0ad58442d3fbb0e3c04d]
+class helm-type-timers--><rect fill="#FEFECE" filter="url(#f5qn4uknt8vv3)" height="48" id="helm-type-timers" style="stroke: #A80036; stroke-width: 1.5;" width="153" x="197.5" y="199.8125"/><ellipse cx="212.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M215.4688,221.4531 Q214.8906,221.75 214.25,221.8906 Q213.6094,222.0469 212.9063,222.0469 Q210.4063,222.0469 209.0781,220.4063 Q207.7656,218.75 207.7656,215.625 Q207.7656,212.5 209.0781,210.8438 Q210.4063,209.1875 212.9063,209.1875 Q213.6094,209.1875 214.25,209.3438 Q214.9063,209.5 215.4688,209.7969 L215.4688,212.5156 Q214.8438,211.9375 214.25,211.6719 Q213.6563,211.3906 213.0313,211.3906 Q211.6875,211.3906 211,212.4688 Q210.3125,213.5313 210.3125,215.625 Q210.3125,217.7188 211,218.7969 Q211.6875,219.8594 213.0313,219.8594 Q213.6563,219.8594 214.25,219.5938 Q214.8438,219.3125 215.4688,218.7344 L215.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="121" x="226.5" y="219.9668">helm-type-timers</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="198.5" x2="349.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="198.5" x2="349.5" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f5qn4uknt8vv3)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="119.5" y="91.8125"/><ellipse cx="134.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M137.4688,113.4531 Q136.8906,113.75 136.25,113.8906 Q135.6094,114.0469 134.9063,114.0469 Q132.4063,114.0469 131.0781,112.4063 Q129.7656,110.75 129.7656,107.625 Q129.7656,104.5 131.0781,102.8438 Q132.4063,101.1875 134.9063,101.1875 Q135.6094,101.1875 136.25,101.3438 Q136.9063,101.5 137.4688,101.7969 L137.4688,104.5156 Q136.8438,103.9375 136.25,103.6719 Q135.6563,103.3906 135.0313,103.3906 Q133.6875,103.3906 133,104.4688 Q132.3125,105.5313 132.3125,107.625 Q132.3125,109.7188 133,110.7969 Q133.6875,111.8594 135.0313,111.8594 Q135.6563,111.8594 136.25,111.5938 Q136.8438,111.3125 137.4688,110.7344 L137.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="148.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="120.5" x2="237.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="120.5" x2="237.5" y1="131.8125" y2="131.8125"/><path d="M326.5,362.3125 L326.5,370.8125 L291.12,374.8125 L326.5,378.8125 L326.5,387.4453 A0,0 0 0 0 326.5,387.4453 L547.5,387.4453 A0,0 0 0 0 547.5,387.4453 L547.5,372.3125 L537.5,362.3125 L326.5,362.3125 A0,0 0 0 0 326.5,362.3125 " fill="#FBFB77" filter="url(#f5qn4uknt8vv3)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M537.5,362.3125 L537.5,372.3125 L547.5,372.3125 L537.5,362.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="200" x="332.5" y="379.3794">helm-idle-time-timers-class</text><!--MD5=[e9dfd0d46d933b60dace2e76a6fa8e40]
+reverse link helm-source-sync to helm-idle-time-timers-class--><path d="M109.73,265.1725 C118.07,278.2525 127.56,293.1325 136.78,307.5925 " fill="none" id="helm-source-sync&lt;-helm-idle-time-timers-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="103.69,268.7225,98.84,248.0925,115.5,261.1925,103.69,268.7225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[f7040a49218bb3669d1c90cd85142f6d]
+reverse link helm-type-timers to helm-idle-time-timers-class--><path d="M248.27,265.1725 C239.93,278.2525 230.44,293.1325 221.22,307.5925 " fill="none" id="helm-type-timers&lt;-helm-idle-time-timers-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="242.5,261.1925,259.16,248.0925,254.31,268.7225,242.5,261.1925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M144.74,155.0425 C131.41,169.9125 116.58,186.4625 104.9,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="139.83,150.0325,158.39,139.8125,150.25,159.3825,139.83,150.0325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[687fc8ec140e945488f732dae3c46e2b]
+reverse link helm-source to helm-type-timers--><path d="M213.26,155.0425 C226.59,169.9125 241.42,186.4625 253.1,199.4925 " fill="none" id="helm-source&lt;-helm-type-timers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="207.75,159.3825,199.61,139.8125,218.17,150.0325,207.75,159.3825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[a3cc4a8c6cbb34c0e13ed82745debc32]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-idle-time-timers-class'**\n\n
+"helm-source-sync" <|- - "helm-idle-time-timers-class"
+"helm-type-timers" <|- - "helm-idle-time-timers-class"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-type-timers"
+"helm-source" <|- - "helm-type-timers"
+class "helm-source"
+class "helm-idle-time-timers-class" {
+ __ some interesting slots __
+ allow-dups
+ candidate-transformer
+ candidates
+ match-dynamic
+ match-strict
+ migemo
+}
+note right of "helm-idle-time-timers-class"
+ **helm-idle-time-timers-class**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-imenu-source.png b/doc/helm-figures/helm-imenu-source.png
new file mode 100644
index 00000000..6f0a2ca5
--- /dev/null
+++ b/doc/helm-figures/helm-imenu-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-imenu-source.svg b/doc/helm-figures/helm-imenu-source.svg
new file mode 100644
index 00000000..2a304359
--- /dev/null
+++ b/doc/helm-figures/helm-imenu-source.svg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="490px" preserveAspectRatio="none" style="width:381px;height:490px;" version="1.1" viewBox="0 0 381 490" width="381px" zoomAndPan="magnify"><defs><filter height="300%" id="f17yztnzp31wf2" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="73.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="205" x="91" y="37.6611">'helm-imenu-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="196.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="196.5" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#f17yztnzp31wf2)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="11.5" y="199.8125"/><ellipse cx="26.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M29.4688,221.4531 Q28.8906,221.75 28.25,221.8906 Q27.6094,222.0469 26.9063,222.0469 Q24.4063,222.0469 23.0781,220.4063 Q21.7656,218.75 21.7656,215.625 Q21.7656,212.5 23.0781,210.8438 Q24.4063,209.1875 26.9063,209.1875 Q27.6094,209.1875 28.25,209.3438 Q28.9063,209.5 29.4688,209.7969 L29.4688,212.5156 Q28.8438,211.9375 28.25,211.6719 Q27.6563,211.3906 27.0313,211.3906 Q25.6875,211.3906 25,212.4688 Q24.3125,213.5313 24.3125,215.625 Q24.3125,217.7188 25,218.7969 Q25.6875,219.8594 27.0313,219.8594 Q27.6563,219.8594 28.25,219.5938 Q28.8438,219.3125 29.4688,218.7344 L29.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="40.5" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="12.5" x2="166.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="12.5" x2="166.5" y1="239.8125" y2="239.8125"/><!--MD5=[a7554553637232b99c06721dc00b929c]
+class helm-imenu-source--><rect fill="#FEFECE" filter="url(#f17yztnzp31wf2)" height="172.0469" id="helm-imenu-source" style="stroke: #A80036; stroke-width: 1.5;" width="167" x="6" y="307.8125"/><ellipse cx="21" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,329.4531 Q23.3906,329.75 22.75,329.8906 Q22.1094,330.0469 21.4063,330.0469 Q18.9063,330.0469 17.5781,328.4063 Q16.2656,326.75 16.2656,323.625 Q16.2656,320.5 17.5781,318.8438 Q18.9063,317.1875 21.4063,317.1875 Q22.1094,317.1875 22.75,317.3438 Q23.4063,317.5 23.9688,317.7969 L23.9688,320.5156 Q23.3438,319.9375 22.75,319.6719 Q22.1563,319.3906 21.5313,319.3906 Q20.1875,319.3906 19.5,320.4688 Q18.8125,321.5313 18.8125,323.625 Q18.8125,325.7188 19.5,326.7969 Q20.1875,327.8594 21.5313,327.8594 Q22.1563,327.8594 22.75,327.5938 Q23.3438,327.3125 23.9688,326.7344 L23.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="135" x="35" y="327.9668">helm-imenu-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="172" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="12" y="370.8276">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="128" x="12" y="383.6323">candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="396.437">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="33" x="12" y="409.2417">group</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="12" y="422.0464">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="12" y="434.8511">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="43" x="12" y="447.6558">nomark</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="96" x="12" y="460.4604">persistent-action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="12" y="473.2651">persistent-help</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="26" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="26" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="153" x2="172" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f17yztnzp31wf2)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="30" y="91.8125"/><ellipse cx="45" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M47.9688,113.4531 Q47.3906,113.75 46.75,113.8906 Q46.1094,114.0469 45.4063,114.0469 Q42.9063,114.0469 41.5781,112.4063 Q40.2656,110.75 40.2656,107.625 Q40.2656,104.5 41.5781,102.8438 Q42.9063,101.1875 45.4063,101.1875 Q46.1094,101.1875 46.75,101.3438 Q47.4063,101.5 47.9688,101.7969 L47.9688,104.5156 Q47.3438,103.9375 46.75,103.6719 Q46.1563,103.3906 45.5313,103.3906 Q44.1875,103.3906 43.5,104.4688 Q42.8125,105.5313 42.8125,107.625 Q42.8125,109.7188 43.5,110.7969 Q44.1875,111.8594 45.5313,111.8594 Q46.1563,111.8594 46.75,111.5938 Q47.3438,111.3125 47.9688,110.7344 L47.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="59" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="31" x2="148" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="31" x2="148" y1="131.8125" y2="131.8125"/><path d="M208,381.3125 L208,389.8125 L173.06,393.8125 L208,397.8125 L208,406.4453 A0,0 0 0 0 208,406.4453 L369,406.4453 A0,0 0 0 0 369,406.4453 L369,391.3125 L359,381.3125 L208,381.3125 A0,0 0 0 0 208,381.3125 " fill="#FBFB77" filter="url(#f17yztnzp31wf2)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M359,381.3125 L359,391.3125 L369,391.3125 L359,381.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="140" x="214" y="398.3794">helm-imenu-source</text><!--MD5=[ca4b9f09c13c1ff3b2602cf75a58548c]
+reverse link helm-source-sync to helm-imenu-source--><path d="M89.5,268.2625 C89.5,280.3425 89.5,293.8925 89.5,307.4925 " fill="none" id="helm-source-sync&lt;-helm-imenu-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="82.5,267.8225,89.5,247.8225,96.5,267.8225,82.5,267.8225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M89.5,159.8325 C89.5,173.3925 89.5,187.8525 89.5,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="82.5,159.8125,89.5,139.8125,96.5,159.8125,82.5,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[cd8cb0b584136ff74199abe77de19420]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-imenu-source'**\n\n
+"helm-source-sync" <|- - "helm-imenu-source"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-imenu-source" {
+ __ some interesting slots __
+ action
+ candidate-transformer
+ candidates
+ group
+ help-message
+ keymap
+ nomark
+ persistent-action
+ persistent-help
+}
+note right of "helm-imenu-source"
+ **helm-imenu-source**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-info-source.png b/doc/helm-figures/helm-info-source.png
new file mode 100644
index 00000000..9edfd78d
--- /dev/null
+++ b/doc/helm-figures/helm-info-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-info-source.svg b/doc/helm-figures/helm-info-source.svg
new file mode 100644
index 00000000..d1a62a7b
--- /dev/null
+++ b/doc/helm-figures/helm-info-source.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="439px" preserveAspectRatio="none" style="width:365px;height:439px;" version="1.1" viewBox="0 0 365 439" width="365px" zoomAndPan="magnify"><defs><filter height="300%" id="f1vbuzu7gasfaf" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="66" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="182" x="95" y="37.6611">'helm-info-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="189" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="189" y="79.5674"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#f1vbuzu7gasfaf)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="35" y="219.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="239.8125" y2="239.8125"/><!--MD5=[1d6ee517c209485192c7fd1a0dfbbf09]
+class helm-info-source--><rect fill="#FEFECE" filter="url(#f1vbuzu7gasfaf)" height="120.8281" id="helm-info-source" style="stroke: #A80036; stroke-width: 1.5;" width="151" x="23" y="307.8125"/><ellipse cx="38" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M40.9688,329.4531 Q40.3906,329.75 39.75,329.8906 Q39.1094,330.0469 38.4063,330.0469 Q35.9063,330.0469 34.5781,328.4063 Q33.2656,326.75 33.2656,323.625 Q33.2656,320.5 34.5781,318.8438 Q35.9063,317.1875 38.4063,317.1875 Q39.1094,317.1875 39.75,317.3438 Q40.4063,317.5 40.9688,317.7969 L40.9688,320.5156 Q40.3438,319.9375 39.75,319.6719 Q39.1563,319.3906 38.5313,319.3906 Q37.1875,319.3906 36.5,320.4688 Q35.8125,321.5313 35.8125,323.625 Q35.8125,325.7188 36.5,326.7969 Q37.1875,327.8594 38.5313,327.8594 Q39.1563,327.8594 39.75,327.5938 Q40.3438,327.3125 40.9688,326.7344 L40.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="119" x="52" y="327.9668">helm-info-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="24" x2="173" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="29" y="370.8276">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="29" y="383.6323">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="29" y="396.437">display-to-real</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="29" y="409.2417">get-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="29" y="422.0464">info-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="24" x2="35" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="35" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="162" x2="173" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1vbuzu7gasfaf)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="39" y="91.8125"/><ellipse cx="54" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.9688,113.4531 Q56.3906,113.75 55.75,113.8906 Q55.1094,114.0469 54.4063,114.0469 Q51.9063,114.0469 50.5781,112.4063 Q49.2656,110.75 49.2656,107.625 Q49.2656,104.5 50.5781,102.8438 Q51.9063,101.1875 54.4063,101.1875 Q55.1094,101.1875 55.75,101.3438 Q56.4063,101.5 56.9688,101.7969 L56.9688,104.5156 Q56.3438,103.9375 55.75,103.6719 Q55.1563,103.3906 54.5313,103.3906 Q53.1875,103.3906 52.5,104.4688 Q51.8125,105.5313 51.8125,107.625 Q51.8125,109.7188 52.5,110.7969 Q53.1875,111.8594 54.5313,111.8594 Q55.1563,111.8594 55.75,111.5938 Q56.3438,111.3125 56.9688,110.7344 L56.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="68" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="40" x2="157" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="40" x2="157" y1="131.8125" y2="131.8125"/><path d="M209.5,355.8125 L209.5,364.3125 L174.27,368.3125 L209.5,372.3125 L209.5,380.9453 A0,0 0 0 0 209.5,380.9453 L353.5,380.9453 A0,0 0 0 0 353.5,380.9453 L353.5,365.8125 L343.5,355.8125 L209.5,355.8125 A0,0 0 0 0 209.5,355.8125 " fill="#FBFB77" filter="url(#f1vbuzu7gasfaf)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M343.5,355.8125 L343.5,365.8125 L353.5,365.8125 L343.5,355.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="123" x="215.5" y="372.8794">helm-info-source</text><!--MD5=[c6f34f9bfe3eab31f5a0ea3dc389c5d2]
+reverse link helm-source-in-buffer to helm-info-source--><path d="M98.5,268.4225 C98.5,280.7625 98.5,294.4025 98.5,307.5225 " fill="none" id="helm-source-in-buffer&lt;-helm-info-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91.5,268.0225,98.5,248.0225,105.5,268.0225,91.5,268.0225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M98.5,159.8325 C98.5,173.3925 98.5,187.8525 98.5,199.4925 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91.5,159.8125,98.5,139.8125,105.5,159.8125,91.5,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[070e836ba103422e82716649749f2383]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-info-source'**\n\n
+"helm-source-in-buffer" <|- - "helm-info-source"
+class "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-info-source" {
+ __ some interesting slots __
+ init
+ action
+ display-to-real
+ get-line
+ info-file
+}
+note right of "helm-info-source"
+ **helm-info-source**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-list-el-package-source.png b/doc/helm-figures/helm-list-el-package-source.png
new file mode 100644
index 00000000..b4f77f06
--- /dev/null
+++ b/doc/helm-figures/helm-list-el-package-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-list-el-package-source.svg b/doc/helm-figures/helm-list-el-package-source.svg
new file mode 100644
index 00000000..40deb9ef
--- /dev/null
+++ b/doc/helm-figures/helm-list-el-package-source.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="503px" preserveAspectRatio="none" style="width:507px;height:503px;" version="1.1" viewBox="0 0 507 503" width="507px" zoomAndPan="magnify"><defs><filter height="300%" id="f1wii9l5jepj0" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="136.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="292" x="110.5" y="37.6611">'helm-list-el-package-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="259.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="259.5" y="79.5674"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#f1wii9l5jepj0)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="28" y="199.8125"/><ellipse cx="43" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M45.9688,221.4531 Q45.3906,221.75 44.75,221.8906 Q44.1094,222.0469 43.4063,222.0469 Q40.9063,222.0469 39.5781,220.4063 Q38.2656,218.75 38.2656,215.625 Q38.2656,212.5 39.5781,210.8438 Q40.9063,209.1875 43.4063,209.1875 Q44.1094,209.1875 44.75,209.3438 Q45.4063,209.5 45.9688,209.7969 L45.9688,212.5156 Q45.3438,211.9375 44.75,211.6719 Q44.1563,211.3906 43.5313,211.3906 Q42.1875,211.3906 41.5,212.4688 Q40.8125,213.5313 40.8125,215.625 Q40.8125,217.7188 41.5,218.7969 Q42.1875,219.8594 43.5313,219.8594 Q44.1563,219.8594 44.75,219.5938 Q45.3438,219.3125 45.9688,218.7344 L45.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="57" y="219.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="29" x2="212" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="29" x2="212" y1="239.8125" y2="239.8125"/><!--MD5=[cea65451dee1c19877355cf9a9f1c806]
+class helm-list-el-package-source--><rect fill="#FEFECE" filter="url(#f1wii9l5jepj0)" height="184.8516" id="helm-list-el-package-source" style="stroke: #A80036; stroke-width: 1.5;" width="229" x="6" y="307.8125"/><ellipse cx="21" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,329.4531 Q23.3906,329.75 22.75,329.8906 Q22.1094,330.0469 21.4063,330.0469 Q18.9063,330.0469 17.5781,328.4063 Q16.2656,326.75 16.2656,323.625 Q16.2656,320.5 17.5781,318.8438 Q18.9063,317.1875 21.4063,317.1875 Q22.1094,317.1875 22.75,317.3438 Q23.4063,317.5 23.9688,317.7969 L23.9688,320.5156 Q23.3438,319.9375 22.75,319.6719 Q22.1563,319.3906 21.5313,319.3906 Q20.1875,319.3906 19.5,320.4688 Q18.8125,321.5313 18.8125,323.625 Q18.8125,325.7188 19.5,326.7969 Q20.1875,327.8594 21.5313,327.8594 Q22.1563,327.8594 22.75,327.5938 Q23.3438,327.3125 23.9688,326.7344 L23.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="197" x="35" y="327.9668">helm-list-el-package-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="234" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="12" y="370.8276">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="12" y="383.6323">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="12" y="396.437">action-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="12" y="409.2417">candidate-number-limit</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="12" y="422.0464">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="12" y="434.8511">get-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="33" x="12" y="447.6558">group</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="12" y="460.4604">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="12" y="473.2651">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="12" y="486.0698">update</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="57" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="57" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="184" x2="234" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1wii9l5jepj0)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="61" y="91.8125"/><ellipse cx="76" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M78.9688,113.4531 Q78.3906,113.75 77.75,113.8906 Q77.1094,114.0469 76.4063,114.0469 Q73.9063,114.0469 72.5781,112.4063 Q71.2656,110.75 71.2656,107.625 Q71.2656,104.5 72.5781,102.8438 Q73.9063,101.1875 76.4063,101.1875 Q77.1094,101.1875 77.75,101.3438 Q78.4063,101.5 78.9688,101.7969 L78.9688,104.5156 Q78.3438,103.9375 77.75,103.6719 Q77.1563,103.3906 76.5313,103.3906 Q75.1875,103.3906 74.5,104.4688 Q73.8125,105.5313 73.8125,107.625 Q73.8125,109.7188 74.5,110.7969 Q75.1875,111.8594 76.5313,111.8594 Q77.1563,111.8594 77.75,111.5938 Q78.3438,111.3125 78.9688,110.7344 L78.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="90" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="62" x2="179" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="62" x2="179" y1="131.8125" y2="131.8125"/><path d="M270,387.8125 L270,396.3125 L235.12,400.3125 L270,404.3125 L270,412.9453 A0,0 0 0 0 270,412.9453 L495,412.9453 A0,0 0 0 0 495,412.9453 L495,397.8125 L485,387.8125 L270,387.8125 A0,0 0 0 0 270,387.8125 " fill="#FBFB77" filter="url(#f1wii9l5jepj0)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M485,387.8125 L485,397.8125 L495,397.8125 L485,387.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="204" x="276" y="404.8794">helm-list-el-package-source</text><!--MD5=[5553b9a1bd6fa98417769ef19c0d46a1]
+reverse link helm-source-in-buffer to helm-list-el-package-source--><path d="M120.5,268.3525 C120.5,280.4125 120.5,293.9625 120.5,307.6625 " fill="none" id="helm-source-in-buffer&lt;-helm-list-el-package-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="113.5,267.9825,120.5,247.9825,127.5,267.9825,113.5,267.9825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M120.5,159.8325 C120.5,173.3925 120.5,187.8525 120.5,199.4925 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="113.5,159.8125,120.5,139.8125,127.5,159.8125,113.5,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7207b76e520088f4515815cc04857152]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-list-el-package-source'**\n\n
+"helm-source-in-buffer" <|- - "helm-list-el-package-source"
+class "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-list-el-package-source" {
+ __ some interesting slots __
+ init
+ action
+ action-transformer
+ candidate-number-limit
+ filtered-candidate-transformer
+ get-line
+ group
+ help-message
+ keymap
+ update
+}
+note right of "helm-list-el-package-source"
+ **helm-list-el-package-source**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-locate-override-inheritor.png b/doc/helm-figures/helm-locate-override-inheritor.png
new file mode 100644
index 00000000..a93568d6
--- /dev/null
+++ b/doc/helm-figures/helm-locate-override-inheritor.png
Binary files differ
diff --git a/doc/helm-figures/helm-locate-override-inheritor.svg b/doc/helm-figures/helm-locate-override-inheritor.svg
new file mode 100644
index 00000000..2003f57b
--- /dev/null
+++ b/doc/helm-figures/helm-locate-override-inheritor.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="485px" preserveAspectRatio="none" style="width:539px;height:485px;" version="1.1" viewBox="0 0 539 485" width="539px" zoomAndPan="magnify"><defs><filter height="300%" id="ffvf8tjrbtpv4" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="152.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="318" x="113.5" y="37.6611">'helm-locate-override-inheritor'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="275.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="275.5" y="79.5674"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FEFECE" filter="url(#ffvf8tjrbtpv4)" height="48" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="130" x="64" y="199.8125"/><ellipse cx="79" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M81.9688,221.4531 Q81.3906,221.75 80.75,221.8906 Q80.1094,222.0469 79.4063,222.0469 Q76.9063,222.0469 75.5781,220.4063 Q74.2656,218.75 74.2656,215.625 Q74.2656,212.5 75.5781,210.8438 Q76.9063,209.1875 79.4063,209.1875 Q80.1094,209.1875 80.75,209.3438 Q81.4063,209.5 81.9688,209.7969 L81.9688,212.5156 Q81.3438,211.9375 80.75,211.6719 Q80.1563,211.3906 79.5313,211.3906 Q78.1875,211.3906 77.5,212.4688 Q76.8125,213.5313 76.8125,215.625 Q76.8125,217.7188 77.5,218.7969 Q78.1875,219.8594 79.5313,219.8594 Q80.1563,219.8594 80.75,219.5938 Q81.3438,219.3125 81.9688,218.7344 L81.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="93" y="219.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="65" x2="193" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="65" x2="193" y1="239.8125" y2="239.8125"/><!--MD5=[2e3d3b2922e1daf59c103872c87a469e]
+class helm-locate-override-inheritor--><rect fill="#FEFECE" filter="url(#ffvf8tjrbtpv4)" height="59.207" id="helm-locate-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="246" x="6" y="307.8125"/><ellipse cx="21" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,329.4531 Q23.3906,329.75 22.75,329.8906 Q22.1094,330.0469 21.4063,330.0469 Q18.9063,330.0469 17.5781,328.4063 Q16.2656,326.75 16.2656,323.625 Q16.2656,320.5 17.5781,318.8438 Q18.9063,317.1875 21.4063,317.1875 Q22.1094,317.1875 22.75,317.3438 Q23.4063,317.5 23.9688,317.7969 L23.9688,320.5156 Q23.3438,319.9375 22.75,319.6719 Q22.1563,319.3906 21.5313,319.3906 Q20.1875,319.3906 19.5,320.4688 Q18.8125,321.5313 18.8125,323.625 Q18.8125,325.7188 19.5,326.7969 Q20.1875,327.8594 21.5313,327.8594 Q22.1563,327.8594 22.75,327.5938 Q23.3438,327.3125 23.9688,326.7344 L23.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="214" x="35" y="327.9668">helm-locate-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="251" y1="339.8125" y2="339.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="65.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="65.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="192.5" x2="251" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#ffvf8tjrbtpv4)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="69.5" y="91.8125"/><ellipse cx="84.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M87.4688,113.4531 Q86.8906,113.75 86.25,113.8906 Q85.6094,114.0469 84.9063,114.0469 Q82.4063,114.0469 81.0781,112.4063 Q79.7656,110.75 79.7656,107.625 Q79.7656,104.5 81.0781,102.8438 Q82.4063,101.1875 84.9063,101.1875 Q85.6094,101.1875 86.25,101.3438 Q86.9063,101.5 87.4688,101.7969 L87.4688,104.5156 Q86.8438,103.9375 86.25,103.6719 Q85.6563,103.3906 85.0313,103.3906 Q83.6875,103.3906 83,104.4688 Q82.3125,105.5313 82.3125,107.625 Q82.3125,109.7188 83,110.7969 Q83.6875,111.8594 85.0313,111.8594 Q85.6563,111.8594 86.25,111.5938 Q86.8438,111.3125 87.4688,110.7344 L87.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="98.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="70.5" x2="187.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="70.5" x2="187.5" y1="131.8125" y2="131.8125"/><path d="M287,324.8125 L287,333.3125 L252.25,337.3125 L287,341.3125 L287,349.9453 A0,0 0 0 0 287,349.9453 L527,349.9453 A0,0 0 0 0 527,349.9453 L527,334.8125 L517,324.8125 L287,324.8125 A0,0 0 0 0 287,324.8125 " fill="#FBFB77" filter="url(#ffvf8tjrbtpv4)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M517,324.8125 L517,334.8125 L527,334.8125 L517,324.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="219" x="293" y="341.8794">helm-locate-override-inheritor</text><!--MD5=[78e52b23f8e756ae73535f85f4ae9d39]
+class helm-locate-source--><rect fill="#FEFECE" filter="url(#ffvf8tjrbtpv4)" height="48" id="helm-locate-source" style="stroke: #A80036; stroke-width: 1.5;" width="168" x="45" y="426.8125"/><ellipse cx="60" cy="442.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M62.9688,448.4531 Q62.3906,448.75 61.75,448.8906 Q61.1094,449.0469 60.4063,449.0469 Q57.9063,449.0469 56.5781,447.4063 Q55.2656,445.75 55.2656,442.625 Q55.2656,439.5 56.5781,437.8438 Q57.9063,436.1875 60.4063,436.1875 Q61.1094,436.1875 61.75,436.3438 Q62.4063,436.5 62.9688,436.7969 L62.9688,439.5156 Q62.3438,438.9375 61.75,438.6719 Q61.1563,438.3906 60.5313,438.3906 Q59.1875,438.3906 58.5,439.4688 Q57.8125,440.5313 57.8125,442.625 Q57.8125,444.7188 58.5,445.7969 Q59.1875,446.8594 60.5313,446.8594 Q61.1563,446.8594 61.75,446.5938 Q62.3438,446.3125 62.9688,445.7344 L62.9688,448.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="136" x="74" y="446.9668">helm-locate-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="46" x2="212" y1="458.8125" y2="458.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="46" x2="212" y1="466.8125" y2="466.8125"/><!--MD5=[ea3943677655752665563907a8ed1189]
+reverse link helm-type-file to helm-locate-override-inheritor--><path d="M129,268.1125 C129,281.3925 129,295.6525 129,307.6925 " fill="none" id="helm-type-file&lt;-helm-locate-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="122,267.9125,129,247.9125,136,267.9125,122,267.9125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M129,159.8325 C129,173.3925 129,187.8525 129,199.4925 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="122,159.8125,129,139.8125,136,159.8125,122,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[59ec1b2dfc99414670695ca2c7ef7be5]
+reverse link helm-locate-override-inheritor to helm-locate-source--><path d="M129,387.0925 C129,400.9125 129,415.3025 129,426.8125 " fill="none" id="helm-locate-override-inheritor&lt;-helm-locate-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="122,387.0225,129,367.0225,136,387.0225,122,387.0225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[20c61314a8472416fad516e89db5e308]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-locate-override-inheritor'**\n\n
+"helm-type-file" <|- - "helm-locate-override-inheritor"
+class "helm-type-file"
+"helm-source" <|- - "helm-type-file"
+class "helm-source"
+class "helm-locate-override-inheritor" {
+ __ some interesting slots __
+}
+note right of "helm-locate-override-inheritor"
+ **helm-locate-override-inheritor**
+end note
+"helm-locate-override-inheritor" <|- - "helm-locate-source"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-locate-source.png b/doc/helm-figures/helm-locate-source.png
new file mode 100644
index 00000000..9a3a4e48
--- /dev/null
+++ b/doc/helm-figures/helm-locate-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-locate-source.svg b/doc/helm-figures/helm-locate-source.svg
new file mode 100644
index 00000000..7ec43467
--- /dev/null
+++ b/doc/helm-figures/helm-locate-source.svg
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="598px" preserveAspectRatio="none" style="width:501px;height:598px;" version="1.1" viewBox="0 0 501 598" width="501px" zoomAndPan="magnify"><defs><filter height="300%" id="fa2k6j1hche5w" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="133.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="205" x="151" y="37.6611">'helm-locate-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="256.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="256.5" y="79.5674"/><!--MD5=[12d16a9c65828dace8d907a7ab3ef450]
+class helm-source-async--><rect fill="#FEFECE" filter="url(#fa2k6j1hche5w)" height="48" id="helm-source-async" style="stroke: #A80036; stroke-width: 1.5;" width="165" x="6" y="307.8125"/><ellipse cx="21" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,329.4531 Q23.3906,329.75 22.75,329.8906 Q22.1094,330.0469 21.4063,330.0469 Q18.9063,330.0469 17.5781,328.4063 Q16.2656,326.75 16.2656,323.625 Q16.2656,320.5 17.5781,318.8438 Q18.9063,317.1875 21.4063,317.1875 Q22.1094,317.1875 22.75,317.3438 Q23.4063,317.5 23.9688,317.7969 L23.9688,320.5156 Q23.3438,319.9375 22.75,319.6719 Q22.1563,319.3906 21.5313,319.3906 Q20.1875,319.3906 19.5,320.4688 Q18.8125,321.5313 18.8125,323.625 Q18.8125,325.7188 19.5,326.7969 Q20.1875,327.8594 21.5313,327.8594 Q22.1563,327.8594 22.75,327.5938 Q23.3438,327.3125 23.9688,326.7344 L23.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="133" x="35" y="327.9668">helm-source-async</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="170" y1="339.8125" y2="339.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="170" y1="347.8125" y2="347.8125"/><!--MD5=[78e52b23f8e756ae73535f85f4ae9d39]
+class helm-locate-source--><rect fill="#FEFECE" filter="url(#fa2k6j1hche5w)" height="172.0469" id="helm-locate-source" style="stroke: #A80036; stroke-width: 1.5;" width="168" x="124.5" y="415.8125"/><ellipse cx="139.5" cy="431.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M142.4688,437.4531 Q141.8906,437.75 141.25,437.8906 Q140.6094,438.0469 139.9063,438.0469 Q137.4063,438.0469 136.0781,436.4063 Q134.7656,434.75 134.7656,431.625 Q134.7656,428.5 136.0781,426.8438 Q137.4063,425.1875 139.9063,425.1875 Q140.6094,425.1875 141.25,425.3438 Q141.9063,425.5 142.4688,425.7969 L142.4688,428.5156 Q141.8438,427.9375 141.25,427.6719 Q140.6563,427.3906 140.0313,427.3906 Q138.6875,427.3906 138,428.4688 Q137.3125,429.5313 137.3125,431.625 Q137.3125,433.7188 138,434.7969 Q138.6875,435.8594 140.0313,435.8594 Q140.6563,435.8594 141.25,435.5938 Q141.8438,435.3125 142.4688,434.7344 L142.4688,437.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="136" x="153.5" y="435.9668">helm-locate-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="125.5" x2="291.5" y1="447.8125" y2="447.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="130.5" y="478.8276">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="130.5" y="491.6323">candidate-number-limit</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x="130.5" y="504.437">candidates-process</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="33" x="130.5" y="517.2417">group</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="130.5" y="530.0464">history</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="63" x="130.5" y="542.8511">multimatch</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="96" x="130.5" y="555.6558">persistent-action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="52" x="130.5" y="568.4604">redisplay</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="130.5" y="581.2651">requires-pattern</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="125.5" x2="145" y1="462.2148" y2="462.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="145" y="465.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="272" x2="291.5" y1="462.2148" y2="462.2148"/><!--MD5=[2e3d3b2922e1daf59c103872c87a469e]
+class helm-locate-override-inheritor--><rect fill="#FEFECE" filter="url(#fa2k6j1hche5w)" height="48" id="helm-locate-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="246" x="206.5" y="307.8125"/><ellipse cx="221.5" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M224.4688,329.4531 Q223.8906,329.75 223.25,329.8906 Q222.6094,330.0469 221.9063,330.0469 Q219.4063,330.0469 218.0781,328.4063 Q216.7656,326.75 216.7656,323.625 Q216.7656,320.5 218.0781,318.8438 Q219.4063,317.1875 221.9063,317.1875 Q222.6094,317.1875 223.25,317.3438 Q223.9063,317.5 224.4688,317.7969 L224.4688,320.5156 Q223.8438,319.9375 223.25,319.6719 Q222.6563,319.3906 222.0313,319.3906 Q220.6875,319.3906 220,320.4688 Q219.3125,321.5313 219.3125,323.625 Q219.3125,325.7188 220,326.7969 Q220.6875,327.8594 222.0313,327.8594 Q222.6563,327.8594 223.25,327.5938 Q223.8438,327.3125 224.4688,326.7344 L224.4688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="214" x="235.5" y="327.9668">helm-locate-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="207.5" x2="451.5" y1="339.8125" y2="339.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="207.5" x2="451.5" y1="347.8125" y2="347.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fa2k6j1hche5w)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="149" y="91.8125"/><ellipse cx="164" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M166.9688,113.4531 Q166.3906,113.75 165.75,113.8906 Q165.1094,114.0469 164.4063,114.0469 Q161.9063,114.0469 160.5781,112.4063 Q159.2656,110.75 159.2656,107.625 Q159.2656,104.5 160.5781,102.8438 Q161.9063,101.1875 164.4063,101.1875 Q165.1094,101.1875 165.75,101.3438 Q166.4063,101.5 166.9688,101.7969 L166.9688,104.5156 Q166.3438,103.9375 165.75,103.6719 Q165.1563,103.3906 164.5313,103.3906 Q163.1875,103.3906 162.5,104.4688 Q161.8125,105.5313 161.8125,107.625 Q161.8125,109.7188 162.5,110.7969 Q163.1875,111.8594 164.5313,111.8594 Q165.1563,111.8594 165.75,111.5938 Q166.3438,111.3125 166.9688,110.7344 L166.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="178" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="150" x2="267" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="150" x2="267" y1="131.8125" y2="131.8125"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FEFECE" filter="url(#fa2k6j1hche5w)" height="48" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="130" x="233.5" y="199.8125"/><ellipse cx="248.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M251.4688,221.4531 Q250.8906,221.75 250.25,221.8906 Q249.6094,222.0469 248.9063,222.0469 Q246.4063,222.0469 245.0781,220.4063 Q243.7656,218.75 243.7656,215.625 Q243.7656,212.5 245.0781,210.8438 Q246.4063,209.1875 248.9063,209.1875 Q249.6094,209.1875 250.25,209.3438 Q250.9063,209.5 251.4688,209.7969 L251.4688,212.5156 Q250.8438,211.9375 250.25,211.6719 Q249.6563,211.3906 249.0313,211.3906 Q247.6875,211.3906 247,212.4688 Q246.3125,213.5313 246.3125,215.625 Q246.3125,217.7188 247,218.7969 Q247.6875,219.8594 249.0313,219.8594 Q249.6563,219.8594 250.25,219.5938 Q250.8438,219.3125 251.4688,218.7344 L251.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="262.5" y="219.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="234.5" x2="362.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="234.5" x2="362.5" y1="239.8125" y2="239.8125"/><path d="M328,489.3125 L328,497.8125 L292.88,501.8125 L328,505.8125 L328,514.4453 A0,0 0 0 0 328,514.4453 L489,514.4453 A0,0 0 0 0 489,514.4453 L489,499.3125 L479,489.3125 L328,489.3125 A0,0 0 0 0 328,489.3125 " fill="#FBFB77" filter="url(#fa2k6j1hche5w)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M479,489.3125 L479,499.3125 L489,499.3125 L479,489.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="140" x="334" y="506.3794">helm-locate-source</text><!--MD5=[7d486a52fcabfa08acb8358ffa257dfe]
+reverse link helm-source-async to helm-locate-source--><path d="M116.63,372.1925 C125.96,385.2525 136.74,400.3425 147.56,415.4925 " fill="none" id="helm-source-async&lt;-helm-locate-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="110.86,376.1625,104.93,355.8225,122.25,368.0225,110.86,376.1625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[59ec1b2dfc99414670695ca2c7ef7be5]
+reverse link helm-locate-override-inheritor to helm-locate-source--><path d="M301.14,372.1925 C291.73,385.2525 280.86,400.3425 269.95,415.4925 " fill="none" id="helm-locate-override-inheritor&lt;-helm-locate-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="295.56,367.9625,312.93,355.8225,306.92,376.1425,295.56,367.9625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[894eacf2e17d1c2f4b307c7f81f3aeea]
+reverse link helm-source to helm-source-async--><path d="M185.55,157.7425 C160.63,202.1825 121.7,271.6125 101.55,307.5325 " fill="none" id="helm-source&lt;-helm-source-async" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="179.54,154.1425,195.43,140.1225,191.75,160.9925,179.54,154.1425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ea3943677655752665563907a8ed1189]
+reverse link helm-type-file to helm-locate-override-inheritor--><path d="M310.94,267.3525 C314.95,281.0425 319.23,295.7125 322.68,307.4925 " fill="none" id="helm-type-file&lt;-helm-locate-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="304.12,268.9725,305.23,247.8125,317.56,265.0425,304.12,268.9725" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M241.36,155.5125 C253.88,170.2625 267.76,186.6025 278.7,199.4925 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="235.64,159.5925,228.03,139.8125,246.31,150.5325,235.64,159.5925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ee38d33a856755f75c78543a84219a4e]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-locate-source'**\n\n
+"helm-source-async" <|- - "helm-locate-source"
+"helm-locate-override-inheritor" <|- - "helm-locate-source"
+class "helm-source-async"
+"helm-source" <|- - "helm-source-async"
+class "helm-source"
+class "helm-locate-override-inheritor"
+"helm-type-file" <|- - "helm-locate-override-inheritor"
+class "helm-type-file"
+"helm-source" <|- - "helm-type-file"
+class "helm-source"
+class "helm-locate-source" {
+ __ some interesting slots __
+ init
+ candidate-number-limit
+ candidates-process
+ group
+ history
+ multimatch
+ persistent-action
+ redisplay
+ requires-pattern
+}
+note right of "helm-locate-source"
+ **helm-locate-source**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-locate-subdirs-source.png b/doc/helm-figures/helm-locate-subdirs-source.png
new file mode 100644
index 00000000..569f0913
--- /dev/null
+++ b/doc/helm-figures/helm-locate-subdirs-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-locate-subdirs-source.svg b/doc/helm-figures/helm-locate-subdirs-source.svg
new file mode 100644
index 00000000..7d1fdac5
--- /dev/null
+++ b/doc/helm-figures/helm-locate-subdirs-source.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="426px" preserveAspectRatio="none" style="width:500px;height:426px;" version="1.1" viewBox="0 0 500 426" width="500px" zoomAndPan="magnify"><defs><filter height="300%" id="f1q4522tgsb4mz" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="133.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="288" x="109.5" y="37.6611">'helm-locate-subdirs-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="256.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="256.5" y="79.5674"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#f1q4522tgsb4mz)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="26.5" y="199.8125"/><ellipse cx="41.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M44.4688,221.4531 Q43.8906,221.75 43.25,221.8906 Q42.6094,222.0469 41.9063,222.0469 Q39.4063,222.0469 38.0781,220.4063 Q36.7656,218.75 36.7656,215.625 Q36.7656,212.5 38.0781,210.8438 Q39.4063,209.1875 41.9063,209.1875 Q42.6094,209.1875 43.25,209.3438 Q43.9063,209.5 44.4688,209.7969 L44.4688,212.5156 Q43.8438,211.9375 43.25,211.6719 Q42.6563,211.3906 42.0313,211.3906 Q40.6875,211.3906 40,212.4688 Q39.3125,213.5313 39.3125,215.625 Q39.3125,217.7188 40,218.7969 Q40.6875,219.8594 42.0313,219.8594 Q42.6563,219.8594 43.25,219.5938 Q43.8438,219.3125 44.4688,218.7344 L44.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="55.5" y="219.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="27.5" x2="210.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="27.5" x2="210.5" y1="239.8125" y2="239.8125"/><!--MD5=[56407064ffc9bf78a0cd848588044ef4]
+class helm-locate-subdirs-source--><rect fill="#FEFECE" filter="url(#f1q4522tgsb4mz)" height="108.0234" id="helm-locate-subdirs-source" style="stroke: #A80036; stroke-width: 1.5;" width="226" x="6" y="307.8125"/><ellipse cx="21" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,329.4531 Q23.3906,329.75 22.75,329.8906 Q22.1094,330.0469 21.4063,330.0469 Q18.9063,330.0469 17.5781,328.4063 Q16.2656,326.75 16.2656,323.625 Q16.2656,320.5 17.5781,318.8438 Q18.9063,317.1875 21.4063,317.1875 Q22.1094,317.1875 22.75,317.3438 Q23.4063,317.5 23.9688,317.7969 L23.9688,320.5156 Q23.3438,319.9375 22.75,319.6719 Q22.1563,319.3906 21.5313,319.3906 Q20.1875,319.3906 19.5,320.4688 Q18.8125,321.5313 18.8125,323.625 Q18.8125,325.7188 19.5,326.7969 Q20.1875,327.8594 21.5313,327.8594 Q22.1563,327.8594 22.75,327.5938 Q23.3438,327.3125 23.9688,326.7344 L23.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="194" x="35" y="327.9668">helm-locate-subdirs-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="231" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="43" x="12" y="370.8276">basedir</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="25" x="12" y="383.6323">data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="33" x="12" y="396.437">group</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="36" x="12" y="409.2417">subdir</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="55.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="55.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="182.5" x2="231" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1q4522tgsb4mz)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="59.5" y="91.8125"/><ellipse cx="74.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M77.4688,113.4531 Q76.8906,113.75 76.25,113.8906 Q75.6094,114.0469 74.9063,114.0469 Q72.4063,114.0469 71.0781,112.4063 Q69.7656,110.75 69.7656,107.625 Q69.7656,104.5 71.0781,102.8438 Q72.4063,101.1875 74.9063,101.1875 Q75.6094,101.1875 76.25,101.3438 Q76.9063,101.5 77.4688,101.7969 L77.4688,104.5156 Q76.8438,103.9375 76.25,103.6719 Q75.6563,103.3906 75.0313,103.3906 Q73.6875,103.3906 73,104.4688 Q72.3125,105.5313 72.3125,107.625 Q72.3125,109.7188 73,110.7969 Q73.6875,111.8594 75.0313,111.8594 Q75.6563,111.8594 76.25,111.5938 Q76.8438,111.3125 77.4688,110.7344 L77.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="88.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="60.5" x2="177.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="60.5" x2="177.5" y1="131.8125" y2="131.8125"/><path d="M267.5,349.3125 L267.5,357.8125 L232.06,361.8125 L267.5,365.8125 L267.5,374.4453 A0,0 0 0 0 267.5,374.4453 L488.5,374.4453 A0,0 0 0 0 488.5,374.4453 L488.5,359.3125 L478.5,349.3125 L267.5,349.3125 A0,0 0 0 0 267.5,349.3125 " fill="#FBFB77" filter="url(#f1q4522tgsb4mz)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M478.5,349.3125 L478.5,359.3125 L488.5,359.3125 L478.5,349.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="200" x="273.5" y="366.3794">helm-locate-subdirs-source</text><!--MD5=[e807cc974173119fa99446f26fc88bc8]
+reverse link helm-source-in-buffer to helm-locate-subdirs-source--><path d="M119,268.0525 C119,280.6325 119,294.5225 119,307.6325 " fill="none" id="helm-source-in-buffer&lt;-helm-locate-subdirs-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="112,267.8825,119,247.8825,126,267.8825,112,267.8825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M119,159.8325 C119,173.3925 119,187.8525 119,199.4925 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="112,159.8125,119,139.8125,126,159.8125,112,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4eb06dc0884b58d70330b754cafe45fa]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-locate-subdirs-source'**\n\n
+"helm-source-in-buffer" <|- - "helm-locate-subdirs-source"
+class "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-locate-subdirs-source" {
+ __ some interesting slots __
+ basedir
+ data
+ group
+ subdir
+}
+note right of "helm-locate-subdirs-source"
+ **helm-locate-subdirs-source**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-mac-spotlight-source.png b/doc/helm-figures/helm-mac-spotlight-source.png
new file mode 100644
index 00000000..3c3a19a3
--- /dev/null
+++ b/doc/helm-figures/helm-mac-spotlight-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-mac-spotlight-source.svg b/doc/helm-figures/helm-mac-spotlight-source.svg
new file mode 100644
index 00000000..32f069be
--- /dev/null
+++ b/doc/helm-figures/helm-mac-spotlight-source.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="414px" preserveAspectRatio="none" style="width:555px;height:414px;" version="1.1" viewBox="0 0 555 414" width="555px" zoomAndPan="magnify"><defs><filter height="300%" id="f7kms81sgyfzs" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="161" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="283" x="139.5" y="37.6611">'helm-mac-spotlight-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="284" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="284" y="79.5674"/><!--MD5=[12d16a9c65828dace8d907a7ab3ef450]
+class helm-source-async--><rect fill="#FEFECE" filter="url(#f7kms81sgyfzs)" height="48" id="helm-source-async" style="stroke: #A80036; stroke-width: 1.5;" width="165" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="133" x="35" y="219.9668">helm-source-async</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="170" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="170" y1="239.8125" y2="239.8125"/><!--MD5=[acc538c4de58be324c7884953f9df4c3]
+class helm-mac-spotlight-source--><rect fill="#FEFECE" filter="url(#f7kms81sgyfzs)" height="95.2188" id="helm-mac-spotlight-source" style="stroke: #A80036; stroke-width: 1.5;" width="221" x="69" y="307.8125"/><ellipse cx="84" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M86.9688,329.4531 Q86.3906,329.75 85.75,329.8906 Q85.1094,330.0469 84.4063,330.0469 Q81.9063,330.0469 80.5781,328.4063 Q79.2656,326.75 79.2656,323.625 Q79.2656,320.5 80.5781,318.8438 Q81.9063,317.1875 84.4063,317.1875 Q85.1094,317.1875 85.75,317.3438 Q86.4063,317.5 86.9688,317.7969 L86.9688,320.5156 Q86.3438,319.9375 85.75,319.6719 Q85.1563,319.3906 84.5313,319.3906 Q83.1875,319.3906 82.5,320.4688 Q81.8125,321.5313 81.8125,323.625 Q81.8125,325.7188 82.5,326.7969 Q83.1875,327.8594 84.5313,327.8594 Q85.1563,327.8594 85.75,327.5938 Q86.3438,327.3125 86.9688,326.7344 L86.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="189" x="98" y="327.9668">helm-mac-spotlight-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="70" x2="289" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x="75" y="370.8276">candidates-process</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="63" x="75" y="383.6323">multimatch</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="75" y="396.437">requires-pattern</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="70" x2="116" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="116" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="243" x2="289" y1="354.2148" y2="354.2148"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FEFECE" filter="url(#f7kms81sgyfzs)" height="48" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="130" x="206.5" y="199.8125"/><ellipse cx="221.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M224.4688,221.4531 Q223.8906,221.75 223.25,221.8906 Q222.6094,222.0469 221.9063,222.0469 Q219.4063,222.0469 218.0781,220.4063 Q216.7656,218.75 216.7656,215.625 Q216.7656,212.5 218.0781,210.8438 Q219.4063,209.1875 221.9063,209.1875 Q222.6094,209.1875 223.25,209.3438 Q223.9063,209.5 224.4688,209.7969 L224.4688,212.5156 Q223.8438,211.9375 223.25,211.6719 Q222.6563,211.3906 222.0313,211.3906 Q220.6875,211.3906 220,212.4688 Q219.3125,213.5313 219.3125,215.625 Q219.3125,217.7188 220,218.7969 Q220.6875,219.8594 222.0313,219.8594 Q222.6563,219.8594 223.25,219.5938 Q223.8438,219.3125 224.4688,218.7344 L224.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="235.5" y="219.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="207.5" x2="335.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="207.5" x2="335.5" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f7kms81sgyfzs)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="120" y="91.8125"/><ellipse cx="135" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M137.9688,113.4531 Q137.3906,113.75 136.75,113.8906 Q136.1094,114.0469 135.4063,114.0469 Q132.9063,114.0469 131.5781,112.4063 Q130.2656,110.75 130.2656,107.625 Q130.2656,104.5 131.5781,102.8438 Q132.9063,101.1875 135.4063,101.1875 Q136.1094,101.1875 136.75,101.3438 Q137.4063,101.5 137.9688,101.7969 L137.9688,104.5156 Q137.3438,103.9375 136.75,103.6719 Q136.1563,103.3906 135.5313,103.3906 Q134.1875,103.3906 133.5,104.4688 Q132.8125,105.5313 132.8125,107.625 Q132.8125,109.7188 133.5,110.7969 Q134.1875,111.8594 135.5313,111.8594 Q136.1563,111.8594 136.75,111.5938 Q137.3438,111.3125 137.9688,110.7344 L137.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="149" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="121" x2="238" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="121" x2="238" y1="131.8125" y2="131.8125"/><path d="M325.5,342.8125 L325.5,351.3125 L290.07,355.3125 L325.5,359.3125 L325.5,367.9453 A0,0 0 0 0 325.5,367.9453 L543.5,367.9453 A0,0 0 0 0 543.5,367.9453 L543.5,352.8125 L533.5,342.8125 L325.5,342.8125 A0,0 0 0 0 325.5,342.8125 " fill="#FBFB77" filter="url(#f7kms81sgyfzs)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M533.5,342.8125 L533.5,352.8125 L543.5,352.8125 L533.5,342.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="197" x="331.5" y="359.8794">helm-mac-spotlight-source</text><!--MD5=[4124b062e967a48c84822db18248b7ac]
+reverse link helm-source-async to helm-mac-spotlight-source--><path d="M116.48,264.6325 C126.06,278.2625 136.87,293.6425 146.79,307.7625 " fill="none" id="helm-source-async&lt;-helm-mac-spotlight-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="110.54,268.3525,104.77,247.9625,122,260.3025,110.54,268.3525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[a474bc848475b2374c1d2bb84f271e9b]
+reverse link helm-type-file to helm-mac-spotlight-source--><path d="M243.21,264.6325 C233.52,278.2625 222.6,293.6425 212.57,307.7625 " fill="none" id="helm-type-file&lt;-helm-mac-spotlight-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="237.76,260.2125,255.05,247.9625,249.18,268.3225,237.76,260.2125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[894eacf2e17d1c2f4b307c7f81f3aeea]
+reverse link helm-source to helm-source-async--><path d="M146.68,155.0425 C133.92,169.9125 119.7,186.4625 108.52,199.4925 " fill="none" id="helm-source&lt;-helm-source-async" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="141.42,150.4325,159.75,139.8125,152.04,159.5525,141.42,150.4325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M212.68,155.0425 C225.58,169.9125 239.95,186.4625 251.26,199.4925 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="207.29,159.5025,199.46,139.8125,217.86,150.3325,207.29,159.5025" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[868f01375a2f44f0a567e0fe20e1a0a8]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-mac-spotlight-source'**\n\n
+"helm-source-async" <|- - "helm-mac-spotlight-source"
+"helm-type-file" <|- - "helm-mac-spotlight-source"
+class "helm-source-async"
+"helm-source" <|- - "helm-source-async"
+class "helm-source"
+class "helm-type-file"
+"helm-source" <|- - "helm-type-file"
+class "helm-source"
+class "helm-mac-spotlight-source" {
+ __ some interesting slots __
+ candidates-process
+ multimatch
+ requires-pattern
+}
+note right of "helm-mac-spotlight-source"
+ **helm-mac-spotlight-source**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-moccur-class.png b/doc/helm-figures/helm-moccur-class.png
new file mode 100644
index 00000000..cc73acb6
--- /dev/null
+++ b/doc/helm-figures/helm-moccur-class.png
Binary files differ
diff --git a/doc/helm-figures/helm-moccur-class.svg b/doc/helm-figures/helm-moccur-class.svg
new file mode 100644
index 00000000..7258b7ed
--- /dev/null
+++ b/doc/helm-figures/helm-moccur-class.svg
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="401px" preserveAspectRatio="none" style="width:384px;height:401px;" version="1.1" viewBox="0 0 384 401" width="384px" zoomAndPan="magnify"><defs><filter height="300%" id="f10bmx5h08pill" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="75.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="200" x="95.5" y="37.6611">'helm-moccur-class'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="198.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="198.5" y="79.5674"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#f10bmx5h08pill)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="35" y="219.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="239.8125" y2="239.8125"/><!--MD5=[073c45925f2697dc8d5dd1a44a8a3365]
+class helm-moccur-class--><rect fill="#FEFECE" filter="url(#f10bmx5h08pill)" height="82.4141" id="helm-moccur-class" style="stroke: #A80036; stroke-width: 1.5;" width="162" x="17.5" y="307.8125"/><ellipse cx="32.5" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M35.4688,329.4531 Q34.8906,329.75 34.25,329.8906 Q33.6094,330.0469 32.9063,330.0469 Q30.4063,330.0469 29.0781,328.4063 Q27.7656,326.75 27.7656,323.625 Q27.7656,320.5 29.0781,318.8438 Q30.4063,317.1875 32.9063,317.1875 Q33.6094,317.1875 34.25,317.3438 Q34.9063,317.5 35.4688,317.7969 L35.4688,320.5156 Q34.8438,319.9375 34.25,319.6719 Q33.6563,319.3906 33.0313,319.3906 Q31.6875,319.3906 31,320.4688 Q30.3125,321.5313 30.3125,323.625 Q30.3125,325.7188 31,326.7969 Q31.6875,327.8594 33.0313,327.8594 Q33.6563,327.8594 34.25,327.5938 Q34.8438,327.3125 35.4688,326.7344 L35.4688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="130" x="46.5" y="327.9668">helm-moccur-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="18.5" x2="178.5" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="70" x="23.5" y="370.8276">buffer-name</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="87" x="23.5" y="383.6323">moccur-buffers</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="18.5" x2="35" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="35" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="162" x2="178.5" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f10bmx5h08pill)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="39" y="91.8125"/><ellipse cx="54" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.9688,113.4531 Q56.3906,113.75 55.75,113.8906 Q55.1094,114.0469 54.4063,114.0469 Q51.9063,114.0469 50.5781,112.4063 Q49.2656,110.75 49.2656,107.625 Q49.2656,104.5 50.5781,102.8438 Q51.9063,101.1875 54.4063,101.1875 Q55.1094,101.1875 55.75,101.3438 Q56.4063,101.5 56.9688,101.7969 L56.9688,104.5156 Q56.3438,103.9375 55.75,103.6719 Q55.1563,103.3906 54.5313,103.3906 Q53.1875,103.3906 52.5,104.4688 Q51.8125,105.5313 51.8125,107.625 Q51.8125,109.7188 52.5,110.7969 Q53.1875,111.8594 54.5313,111.8594 Q55.1563,111.8594 55.75,111.5938 Q56.3438,111.3125 56.9688,110.7344 L56.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="68" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="40" x2="157" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="40" x2="157" y1="131.8125" y2="131.8125"/><path d="M214.5,336.3125 L214.5,344.8125 L179.62,348.8125 L214.5,352.8125 L214.5,361.4453 A0,0 0 0 0 214.5,361.4453 L372.5,361.4453 A0,0 0 0 0 372.5,361.4453 L372.5,346.3125 L362.5,336.3125 L214.5,336.3125 A0,0 0 0 0 214.5,336.3125 " fill="#FBFB77" filter="url(#f10bmx5h08pill)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M362.5,336.3125 L362.5,346.3125 L372.5,346.3125 L362.5,336.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="137" x="220.5" y="353.3794">helm-moccur-class</text><!--MD5=[30ea2babd0fb514dd636adcbe39865ef]
+reverse link helm-source-in-buffer to helm-moccur-class--><path d="M98.5,268.4125 C98.5,281.0925 98.5,294.8725 98.5,307.3425 " fill="none" id="helm-source-in-buffer&lt;-helm-moccur-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91.5,267.9525,98.5,247.9525,105.5,267.9525,91.5,267.9525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M98.5,159.8325 C98.5,173.3925 98.5,187.8525 98.5,199.4925 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91.5,159.8125,98.5,139.8125,105.5,159.8125,91.5,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[8f658504678477bfa832835507559706]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-moccur-class'**\n\n
+"helm-source-in-buffer" <|- - "helm-moccur-class"
+class "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-moccur-class" {
+ __ some interesting slots __
+ buffer-name
+ moccur-buffers
+}
+note right of "helm-moccur-class"
+ **helm-moccur-class**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-recentf-source.png b/doc/helm-figures/helm-recentf-source.png
new file mode 100644
index 00000000..ffac0635
--- /dev/null
+++ b/doc/helm-figures/helm-recentf-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-recentf-source.svg b/doc/helm-figures/helm-recentf-source.svg
new file mode 100644
index 00000000..ee126eba
--- /dev/null
+++ b/doc/helm-figures/helm-recentf-source.svg
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="478px" preserveAspectRatio="none" style="width:476px;height:478px;" version="1.1" viewBox="0 0 476 478" width="476px" zoomAndPan="magnify"><defs><filter height="300%" id="f7p2kaws9rkx" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="121.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="217" x="133" y="37.6611">'helm-recentf-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="244.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="244.5" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#f7p2kaws9rkx)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="35" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="239.8125" y2="239.8125"/><!--MD5=[f9787a7e913788f0fbbca93390d6041a]
+class helm-recentf-source--><rect fill="#FEFECE" filter="url(#f7p2kaws9rkx)" height="159.2422" id="helm-recentf-source" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="85.5" y="307.8125"/><ellipse cx="100.5" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M103.4688,329.4531 Q102.8906,329.75 102.25,329.8906 Q101.6094,330.0469 100.9063,330.0469 Q98.4063,330.0469 97.0781,328.4063 Q95.7656,326.75 95.7656,323.625 Q95.7656,320.5 97.0781,318.8438 Q98.4063,317.1875 100.9063,317.1875 Q101.6094,317.1875 102.25,317.3438 Q102.9063,317.5 103.4688,317.7969 L103.4688,320.5156 Q102.8438,319.9375 102.25,319.6719 Q101.6563,319.3906 101.0313,319.3906 Q99.6875,319.3906 99,320.4688 Q98.3125,321.5313 98.3125,323.625 Q98.3125,325.7188 99,326.7969 Q99.6875,327.8594 101.0313,327.8594 Q101.6563,327.8594 102.25,327.5938 Q102.8438,327.3125 103.4688,326.7344 L103.4688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="114.5" y="327.9668">helm-recentf-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="86.5" x2="259.5" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="91.5" y="370.8276">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="91.5" y="383.6323">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="91.5" y="396.437">match-dynamic</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="91.5" y="409.2417">match-part</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="91.5" y="422.0464">match-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="91.5" y="434.8511">migemo</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="114" x="91.5" y="447.6558">pattern-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="96" x="91.5" y="460.4604">persistent-action</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="86.5" x2="109.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="109.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="236.5" x2="259.5" y1="354.2148" y2="354.2148"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FEFECE" filter="url(#f7p2kaws9rkx)" height="48" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="130" x="197" y="199.8125"/><ellipse cx="212" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M214.9688,221.4531 Q214.3906,221.75 213.75,221.8906 Q213.1094,222.0469 212.4063,222.0469 Q209.9063,222.0469 208.5781,220.4063 Q207.2656,218.75 207.2656,215.625 Q207.2656,212.5 208.5781,210.8438 Q209.9063,209.1875 212.4063,209.1875 Q213.1094,209.1875 213.75,209.3438 Q214.4063,209.5 214.9688,209.7969 L214.9688,212.5156 Q214.3438,211.9375 213.75,211.6719 Q213.1563,211.3906 212.5313,211.3906 Q211.1875,211.3906 210.5,212.4688 Q209.8125,213.5313 209.8125,215.625 Q209.8125,217.7188 210.5,218.7969 Q211.1875,219.8594 212.5313,219.8594 Q213.1563,219.8594 213.75,219.5938 Q214.3438,219.3125 214.9688,218.7344 L214.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="226" y="219.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="198" x2="326" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="198" x2="326" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f7p2kaws9rkx)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="113.5" y="91.8125"/><ellipse cx="128.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M131.4688,113.4531 Q130.8906,113.75 130.25,113.8906 Q129.6094,114.0469 128.9063,114.0469 Q126.4063,114.0469 125.0781,112.4063 Q123.7656,110.75 123.7656,107.625 Q123.7656,104.5 125.0781,102.8438 Q126.4063,101.1875 128.9063,101.1875 Q129.6094,101.1875 130.25,101.3438 Q130.9063,101.5 131.4688,101.7969 L131.4688,104.5156 Q130.8438,103.9375 130.25,103.6719 Q129.6563,103.3906 129.0313,103.3906 Q127.6875,103.3906 127,104.4688 Q126.3125,105.5313 126.3125,107.625 Q126.3125,109.7188 127,110.7969 Q127.6875,111.8594 129.0313,111.8594 Q129.6563,111.8594 130.25,111.5938 Q130.8438,111.3125 131.4688,110.7344 L131.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="142.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="114.5" x2="231.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="114.5" x2="231.5" y1="131.8125" y2="131.8125"/><path d="M295.5,374.8125 L295.5,383.3125 L260.73,387.3125 L295.5,391.3125 L295.5,399.9453 A0,0 0 0 0 295.5,399.9453 L464.5,399.9453 A0,0 0 0 0 464.5,399.9453 L464.5,384.8125 L454.5,374.8125 L295.5,374.8125 A0,0 0 0 0 295.5,374.8125 " fill="#FBFB77" filter="url(#f7p2kaws9rkx)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M454.5,374.8125 L454.5,384.8125 L464.5,384.8125 L454.5,374.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="148" x="301.5" y="391.8794">helm-recentf-source</text><!--MD5=[c61a2677e41aced0f206eca3fb3deace]
+reverse link helm-source-sync to helm-recentf-source--><path d="M106.59,265.8025 C113.66,278.6325 121.71,293.2425 129.71,307.7525 " fill="none" id="helm-source-sync&lt;-helm-recentf-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="100.27,268.8425,96.75,247.9525,112.54,262.0925,100.27,268.8425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[c214b1996ffa22e8ee90459314819dd7]
+reverse link helm-type-file to helm-recentf-source--><path d="M239.41,265.8025 C232.34,278.6325 224.29,293.2425 216.29,307.7525 " fill="none" id="helm-type-file&lt;-helm-recentf-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="233.46,262.0925,249.25,247.9525,245.73,268.8425,233.46,262.0925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M140.5,155.5125 C128.12,170.2625 114.4,186.6025 103.58,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="135.47,150.6325,153.69,139.8125,146.19,159.6325,135.47,150.6325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M205.5,155.5125 C217.88,170.2625 231.6,186.6025 242.42,199.4925 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="199.81,159.6325,192.31,139.8125,210.53,150.6325,199.81,159.6325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[62c1e9a5285faefa2bf0d92aa7967952]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-recentf-source'**\n\n
+"helm-source-sync" <|- - "helm-recentf-source"
+"helm-type-file" <|- - "helm-recentf-source"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-type-file"
+"helm-source" <|- - "helm-type-file"
+class "helm-source"
+class "helm-recentf-source" {
+ __ some interesting slots __
+ init
+ candidates
+ match-dynamic
+ match-part
+ match-strict
+ migemo
+ pattern-transformer
+ persistent-action
+}
+note right of "helm-recentf-source"
+ **helm-recentf-source**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-semantic-source.png b/doc/helm-figures/helm-semantic-source.png
new file mode 100644
index 00000000..eba623bf
--- /dev/null
+++ b/doc/helm-figures/helm-semantic-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-semantic-source.svg b/doc/helm-figures/helm-semantic-source.svg
new file mode 100644
index 00000000..205f478c
--- /dev/null
+++ b/doc/helm-figures/helm-semantic-source.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="465px" preserveAspectRatio="none" style="width:424px;height:465px;" version="1.1" viewBox="0 0 424 465" width="424px" zoomAndPan="magnify"><defs><filter height="300%" id="f12a039m40yjju" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="95.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="235" x="98" y="37.6611">'helm-semantic-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="218.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="218.5" y="79.5674"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#f12a039m40yjju)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="7.5" y="199.8125"/><ellipse cx="22.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M25.4688,221.4531 Q24.8906,221.75 24.25,221.8906 Q23.6094,222.0469 22.9063,222.0469 Q20.4063,222.0469 19.0781,220.4063 Q17.7656,218.75 17.7656,215.625 Q17.7656,212.5 19.0781,210.8438 Q20.4063,209.1875 22.9063,209.1875 Q23.6094,209.1875 24.25,209.3438 Q24.9063,209.5 25.4688,209.7969 L25.4688,212.5156 Q24.8438,211.9375 24.25,211.6719 Q23.6563,211.3906 23.0313,211.3906 Q21.6875,211.3906 21,212.4688 Q20.3125,213.5313 20.3125,215.625 Q20.3125,217.7188 21,218.7969 Q21.6875,219.8594 23.0313,219.8594 Q23.6563,219.8594 24.25,219.5938 Q24.8438,219.3125 25.4688,218.7344 L25.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="36.5" y="219.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="8.5" x2="191.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="8.5" x2="191.5" y1="239.8125" y2="239.8125"/><!--MD5=[6a7a1e548828873723640eef38a6053c]
+class helm-semantic-source--><rect fill="#FEFECE" filter="url(#f12a039m40yjju)" height="146.4375" id="helm-semantic-source" style="stroke: #A80036; stroke-width: 1.5;" width="188" x="6" y="307.8125"/><ellipse cx="21" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,329.4531 Q23.3906,329.75 22.75,329.8906 Q22.1094,330.0469 21.4063,330.0469 Q18.9063,330.0469 17.5781,328.4063 Q16.2656,326.75 16.2656,323.625 Q16.2656,320.5 17.5781,318.8438 Q18.9063,317.1875 21.4063,317.1875 Q22.1094,317.1875 22.75,317.3438 Q23.4063,317.5 23.9688,317.7969 L23.9688,320.5156 Q23.3438,319.9375 22.75,319.6719 Q22.1563,319.3906 21.5313,319.3906 Q20.1875,319.3906 19.5,320.4688 Q18.8125,321.5313 18.8125,323.625 Q18.8125,325.7188 19.5,326.7969 Q20.1875,327.8594 21.5313,327.8594 Q22.1563,327.8594 22.75,327.5938 Q23.3438,327.3125 23.9688,326.7344 L23.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="156" x="35" y="327.9668">helm-semantic-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="193" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="12" y="370.8276">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="12" y="383.6323">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="12" y="396.437">get-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="12" y="409.2417">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="12" y="422.0464">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="96" x="12" y="434.8511">persistent-action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="12" y="447.6558">persistent-help</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="36.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="36.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="163.5" x2="193" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f12a039m40yjju)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="40.5" y="91.8125"/><ellipse cx="55.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M58.4688,113.4531 Q57.8906,113.75 57.25,113.8906 Q56.6094,114.0469 55.9063,114.0469 Q53.4063,114.0469 52.0781,112.4063 Q50.7656,110.75 50.7656,107.625 Q50.7656,104.5 52.0781,102.8438 Q53.4063,101.1875 55.9063,101.1875 Q56.6094,101.1875 57.25,101.3438 Q57.9063,101.5 58.4688,101.7969 L58.4688,104.5156 Q57.8438,103.9375 57.25,103.6719 Q56.6563,103.3906 56.0313,103.3906 Q54.6875,103.3906 54,104.4688 Q53.3125,105.5313 53.3125,107.625 Q53.3125,109.7188 54,110.7969 Q54.6875,111.8594 56.0313,111.8594 Q56.6563,111.8594 57.25,111.5938 Q57.8438,111.3125 58.4688,110.7344 L58.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="69.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="41.5" x2="158.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="41.5" x2="158.5" y1="131.8125" y2="131.8125"/><path d="M229.5,368.3125 L229.5,376.8125 L194.1,380.8125 L229.5,384.8125 L229.5,393.4453 A0,0 0 0 0 229.5,393.4453 L412.5,393.4453 A0,0 0 0 0 412.5,393.4453 L412.5,378.3125 L402.5,368.3125 L229.5,368.3125 A0,0 0 0 0 229.5,368.3125 " fill="#FBFB77" filter="url(#f12a039m40yjju)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M402.5,368.3125 L402.5,378.3125 L412.5,378.3125 L402.5,368.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="162" x="235.5" y="385.3794">helm-semantic-source</text><!--MD5=[1ab4d17da5132a1e0f1c08a6c1bf0b9d]
+reverse link helm-source-in-buffer to helm-semantic-source--><path d="M100,268.2225 C100,280.5025 100,294.2025 100,307.6925 " fill="none" id="helm-source-in-buffer&lt;-helm-semantic-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="93,268.0225,100,248.0225,107,268.0225,93,268.0225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M100,159.8325 C100,173.3925 100,187.8525 100,199.4925 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="93,159.8125,100,139.8125,107,159.8125,93,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[1a1f1363a35d941e349019f8a552718a]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-semantic-source'**\n\n
+"helm-source-in-buffer" <|- - "helm-semantic-source"
+class "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-semantic-source" {
+ __ some interesting slots __
+ init
+ action
+ get-line
+ help-message
+ keymap
+ persistent-action
+ persistent-help
+}
+note right of "helm-semantic-source"
+ **helm-semantic-source**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-source-async.png b/doc/helm-figures/helm-source-async.png
new file mode 100644
index 00000000..4b89488b
--- /dev/null
+++ b/doc/helm-figures/helm-source-async.png
Binary files differ
diff --git a/doc/helm-figures/helm-source-async.svg b/doc/helm-figures/helm-source-async.svg
new file mode 100644
index 00000000..c8cc5459
--- /dev/null
+++ b/doc/helm-figures/helm-source-async.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="447px" preserveAspectRatio="none" style="width:1167px;height:447px;" version="1.1" viewBox="0 0 1167 447" width="1167px" zoomAndPan="magnify"><defs><filter height="300%" id="f137s0e9njoo0n" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="467" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="202" x="486" y="37.6611">'helm-source-async'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="590" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="590" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f137s0e9njoo0n)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="538" y="91.8125"/><ellipse cx="553" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M555.9688,113.4531 Q555.3906,113.75 554.75,113.8906 Q554.1094,114.0469 553.4063,114.0469 Q550.9063,114.0469 549.5781,112.4063 Q548.2656,110.75 548.2656,107.625 Q548.2656,104.5 549.5781,102.8438 Q550.9063,101.1875 553.4063,101.1875 Q554.1094,101.1875 554.75,101.3438 Q555.4063,101.5 555.9688,101.7969 L555.9688,104.5156 Q555.3438,103.9375 554.75,103.6719 Q554.1563,103.3906 553.5313,103.3906 Q552.1875,103.3906 551.5,104.4688 Q550.8125,105.5313 550.8125,107.625 Q550.8125,109.7188 551.5,110.7969 Q552.1875,111.8594 553.5313,111.8594 Q554.1563,111.8594 554.75,111.5938 Q555.3438,111.3125 555.9688,110.7344 L555.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="567" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="539" x2="656" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="539" x2="656" y1="131.8125" y2="131.8125"/><!--MD5=[12d16a9c65828dace8d907a7ab3ef450]
+class helm-source-async--><rect fill="#FEFECE" filter="url(#f137s0e9njoo0n)" height="128.8281" id="helm-source-async" style="stroke: #A80036; stroke-width: 1.5;" width="165" x="515" y="199.8125"/><ellipse cx="530" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M532.9688,221.4531 Q532.3906,221.75 531.75,221.8906 Q531.1094,222.0469 530.4063,222.0469 Q527.9063,222.0469 526.5781,220.4063 Q525.2656,218.75 525.2656,215.625 Q525.2656,212.5 526.5781,210.8438 Q527.9063,209.1875 530.4063,209.1875 Q531.1094,209.1875 531.75,209.3438 Q532.4063,209.5 532.9688,209.7969 L532.9688,212.5156 Q532.3438,211.9375 531.75,211.6719 Q531.1563,211.3906 530.5313,211.3906 Q529.1875,211.3906 528.5,212.4688 Q527.8125,213.5313 527.8125,215.625 Q527.8125,217.7188 528.5,218.7969 Q529.1875,219.8594 530.5313,219.8594 Q531.1563,219.8594 531.75,219.5938 Q532.3438,219.3125 532.9688,218.7344 L532.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="133" x="544" y="219.9668">helm-source-async</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="516" x2="679" y1="231.8125" y2="231.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="141" x="521" y="246.0229">Use this class to define a</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="126" x="521" y="258.8276">helm source calling an</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="99" x="521" y="271.6323">external process.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="516" x2="679" y1="278.2266" y2="278.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="516" x2="679" y1="280.2266" y2="280.2266"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="112" x="521" y="309.2417">candidates-process</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="63" x="521" y="322.0464">multimatch</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="516" x2="534" y1="292.6289" y2="292.6289"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="534" y="295.937">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="661" x2="679" y1="292.6289" y2="292.6289"/><path d="M715,228.8125 L715,260.3125 L680.38,264.3125 L715,268.3125 L715,299.3438 A0,0 0 0 0 715,299.3438 L896,299.3438 A0,0 0 0 0 896,299.3438 L896,238.8125 L886,228.8125 L715,228.8125 A0,0 0 0 0 715,228.8125 " fill="#FBFB77" filter="url(#f137s0e9njoo0n)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M886,228.8125 L886,238.8125 L896,238.8125 L886,228.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="137" x="721" y="245.8794">helm-source-async</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="858" y="245.8794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="160" x="721" y="261.0122">Use this class to define a</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="143" x="721" y="276.145">helm source calling an</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="110" x="721" y="291.2778">external process.</text><!--MD5=[acc538c4de58be324c7884953f9df4c3]
+class helm-mac-spotlight-source--><rect fill="#FEFECE" filter="url(#f137s0e9njoo0n)" height="48" id="helm-mac-spotlight-source" style="stroke: #A80036; stroke-width: 1.5;" width="221" x="6" y="388.8125"/><ellipse cx="21" cy="404.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,410.4531 Q23.3906,410.75 22.75,410.8906 Q22.1094,411.0469 21.4063,411.0469 Q18.9063,411.0469 17.5781,409.4063 Q16.2656,407.75 16.2656,404.625 Q16.2656,401.5 17.5781,399.8438 Q18.9063,398.1875 21.4063,398.1875 Q22.1094,398.1875 22.75,398.3438 Q23.4063,398.5 23.9688,398.7969 L23.9688,401.5156 Q23.3438,400.9375 22.75,400.6719 Q22.1563,400.3906 21.5313,400.3906 Q20.1875,400.3906 19.5,401.4688 Q18.8125,402.5313 18.8125,404.625 Q18.8125,406.7188 19.5,407.7969 Q20.1875,408.8594 21.5313,408.8594 Q22.1563,408.8594 22.75,408.5938 Q23.3438,408.3125 23.9688,407.7344 L23.9688,410.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="189" x="35" y="408.9668">helm-mac-spotlight-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="226" y1="420.8125" y2="420.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="226" y1="428.8125" y2="428.8125"/><!--MD5=[d36bc6d3d79507f675f4471be5eaf52f]
+class helm-gid-source--><rect fill="#FEFECE" filter="url(#f137s0e9njoo0n)" height="48" id="helm-gid-source" style="stroke: #A80036; stroke-width: 1.5;" width="146" x="262.5" y="388.8125"/><ellipse cx="277.5" cy="404.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M280.4688,410.4531 Q279.8906,410.75 279.25,410.8906 Q278.6094,411.0469 277.9063,411.0469 Q275.4063,411.0469 274.0781,409.4063 Q272.7656,407.75 272.7656,404.625 Q272.7656,401.5 274.0781,399.8438 Q275.4063,398.1875 277.9063,398.1875 Q278.6094,398.1875 279.25,398.3438 Q279.9063,398.5 280.4688,398.7969 L280.4688,401.5156 Q279.8438,400.9375 279.25,400.6719 Q278.6563,400.3906 278.0313,400.3906 Q276.6875,400.3906 276,401.4688 Q275.3125,402.5313 275.3125,404.625 Q275.3125,406.7188 276,407.7969 Q276.6875,408.8594 278.0313,408.8594 Q278.6563,408.8594 279.25,408.5938 Q279.8438,408.3125 280.4688,407.7344 L280.4688,410.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="114" x="291.5" y="408.9668">helm-gid-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="263.5" x2="407.5" y1="420.8125" y2="420.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="263.5" x2="407.5" y1="428.8125" y2="428.8125"/><!--MD5=[bd2ea1af02554a0352e5fd98d33b66ab]
+class helm-fd-class--><rect fill="#FEFECE" filter="url(#f137s0e9njoo0n)" height="48" id="helm-fd-class" style="stroke: #A80036; stroke-width: 1.5;" width="126" x="443.5" y="388.8125"/><ellipse cx="458.5" cy="404.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M461.4688,410.4531 Q460.8906,410.75 460.25,410.8906 Q459.6094,411.0469 458.9063,411.0469 Q456.4063,411.0469 455.0781,409.4063 Q453.7656,407.75 453.7656,404.625 Q453.7656,401.5 455.0781,399.8438 Q456.4063,398.1875 458.9063,398.1875 Q459.6094,398.1875 460.25,398.3438 Q460.9063,398.5 461.4688,398.7969 L461.4688,401.5156 Q460.8438,400.9375 460.25,400.6719 Q459.6563,400.3906 459.0313,400.3906 Q457.6875,400.3906 457,401.4688 Q456.3125,402.5313 456.3125,404.625 Q456.3125,406.7188 457,407.7969 Q457.6875,408.8594 459.0313,408.8594 Q459.6563,408.8594 460.25,408.5938 Q460.8438,408.3125 461.4688,407.7344 L461.4688,410.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="94" x="472.5" y="408.9668">helm-fd-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="444.5" x2="568.5" y1="420.8125" y2="420.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="444.5" x2="568.5" y1="428.8125" y2="428.8125"/><!--MD5=[78e52b23f8e756ae73535f85f4ae9d39]
+class helm-locate-source--><rect fill="#FEFECE" filter="url(#f137s0e9njoo0n)" height="48" id="helm-locate-source" style="stroke: #A80036; stroke-width: 1.5;" width="168" x="604.5" y="388.8125"/><ellipse cx="619.5" cy="404.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M622.4688,410.4531 Q621.8906,410.75 621.25,410.8906 Q620.6094,411.0469 619.9063,411.0469 Q617.4063,411.0469 616.0781,409.4063 Q614.7656,407.75 614.7656,404.625 Q614.7656,401.5 616.0781,399.8438 Q617.4063,398.1875 619.9063,398.1875 Q620.6094,398.1875 621.25,398.3438 Q621.9063,398.5 622.4688,398.7969 L622.4688,401.5156 Q621.8438,400.9375 621.25,400.6719 Q620.6563,400.3906 620.0313,400.3906 Q618.6875,400.3906 618,401.4688 Q617.3125,402.5313 617.3125,404.625 Q617.3125,406.7188 618,407.7969 Q618.6875,408.8594 620.0313,408.8594 Q620.6563,408.8594 621.25,408.5938 Q621.8438,408.3125 622.4688,407.7344 L622.4688,410.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="136" x="633.5" y="408.9668">helm-locate-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="605.5" x2="771.5" y1="420.8125" y2="420.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="605.5" x2="771.5" y1="428.8125" y2="428.8125"/><!--MD5=[48c627d917d22eb9e4865aed3bf653fb]
+class helm-grep-ag-class--><rect fill="#FEFECE" filter="url(#f137s0e9njoo0n)" height="48" id="helm-grep-ag-class" style="stroke: #A80036; stroke-width: 1.5;" width="168" x="807.5" y="388.8125"/><ellipse cx="822.5" cy="404.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M825.4688,410.4531 Q824.8906,410.75 824.25,410.8906 Q823.6094,411.0469 822.9063,411.0469 Q820.4063,411.0469 819.0781,409.4063 Q817.7656,407.75 817.7656,404.625 Q817.7656,401.5 819.0781,399.8438 Q820.4063,398.1875 822.9063,398.1875 Q823.6094,398.1875 824.25,398.3438 Q824.9063,398.5 825.4688,398.7969 L825.4688,401.5156 Q824.8438,400.9375 824.25,400.6719 Q823.6563,400.3906 823.0313,400.3906 Q821.6875,400.3906 821,401.4688 Q820.3125,402.5313 820.3125,404.625 Q820.3125,406.7188 821,407.7969 Q821.6875,408.8594 823.0313,408.8594 Q823.6563,408.8594 824.25,408.5938 Q824.8438,408.3125 825.4688,407.7344 L825.4688,410.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="136" x="836.5" y="408.9668">helm-grep-ag-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="808.5" x2="974.5" y1="420.8125" y2="420.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="808.5" x2="974.5" y1="428.8125" y2="428.8125"/><!--MD5=[91bb0adfdf7bf369d8d23bbe4e952f89]
+class helm-grep-class--><rect fill="#FEFECE" filter="url(#f137s0e9njoo0n)" height="48" id="helm-grep-class" style="stroke: #A80036; stroke-width: 1.5;" width="145" x="1011" y="388.8125"/><ellipse cx="1026" cy="404.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1028.9688,410.4531 Q1028.3906,410.75 1027.75,410.8906 Q1027.1094,411.0469 1026.4063,411.0469 Q1023.9063,411.0469 1022.5781,409.4063 Q1021.2656,407.75 1021.2656,404.625 Q1021.2656,401.5 1022.5781,399.8438 Q1023.9063,398.1875 1026.4063,398.1875 Q1027.1094,398.1875 1027.75,398.3438 Q1028.4063,398.5 1028.9688,398.7969 L1028.9688,401.5156 Q1028.3438,400.9375 1027.75,400.6719 Q1027.1563,400.3906 1026.5313,400.3906 Q1025.1875,400.3906 1024.5,401.4688 Q1023.8125,402.5313 1023.8125,404.625 Q1023.8125,406.7188 1024.5,407.7969 Q1025.1875,408.8594 1026.5313,408.8594 Q1027.1563,408.8594 1027.75,408.5938 Q1028.3438,408.3125 1028.9688,407.7344 L1028.9688,410.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="113" x="1040" y="408.9668">helm-grep-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1012" x2="1155" y1="420.8125" y2="420.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1012" x2="1155" y1="428.8125" y2="428.8125"/><!--MD5=[894eacf2e17d1c2f4b307c7f81f3aeea]
+reverse link helm-source to helm-source-async--><path d="M597.5,160.4125 C597.5,172.7625 597.5,186.4725 597.5,199.7425 " fill="none" id="helm-source&lt;-helm-source-async" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="590.5,160.0225,597.5,140.0225,604.5,160.0225,590.5,160.0225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4124b062e967a48c84822db18248b7ac]
+reverse link helm-source-async to helm-mac-spotlight-source--><path d="M495.51,296.3725 C404.71,324.0325 273.95,363.8625 192.17,388.7625 " fill="none" id="helm-source-async&lt;-helm-mac-spotlight-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="493.64,289.6325,514.81,290.4925,497.72,303.0225,493.64,289.6325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[b87e7a6cd6a876f20d8b301dfc1041b2]
+reverse link helm-source-async to helm-gid-source--><path d="M497.37,321.3025 C455.56,344.6825 409.31,370.5425 376.99,388.6125 " fill="none" id="helm-source-async&lt;-helm-gid-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="494.09,315.1125,514.96,311.4625,500.92,327.3325,494.09,315.1125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[5fa17a1efdd398e28fa7575bea335940]
+reverse link helm-source-async to helm-fd-class--><path d="M547.03,346.5625 C537.47,361.9525 528.22,376.8525 520.96,388.5225 " fill="none" id="helm-source-async&lt;-helm-fd-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="541.35,342.4425,557.85,329.1425,553.24,349.8225,541.35,342.4425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7d486a52fcabfa08acb8358ffa257dfe]
+reverse link helm-source-async to helm-locate-source--><path d="M647.97,346.5625 C657.53,361.9525 666.78,376.8525 674.04,388.5225 " fill="none" id="helm-source-async&lt;-helm-locate-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="641.76,349.8225,637.15,329.1425,653.65,342.4425,641.76,349.8225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[e220d22ad778b6230f0552c8a1eae9ee]
+reverse link helm-source-async to helm-grep-ag-class--><path d="M697.94,328.5625 C750.79,355.8525 795.53,374.7425 830.47,388.6525 " fill="none" id="helm-source-async&lt;-helm-grep-ag-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="694.56,334.6925,680.11,319.1925,701.07,322.3025,694.56,334.6925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[99faec0dbdb16852c37e6e30b1aacff5]
+reverse link helm-source-async to helm-grep-class--><path d="M698.96,328.3825 C825.93,377.2225 868.66,360.2225 993.5,388.8125 C999.16,390.1125 1005.01,391.4925 1010.88,392.9225 " fill="none" id="helm-source-async&lt;-helm-grep-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="696.04,334.7525,680.04,320.8725,701.21,321.7425,696.04,334.7525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[cbd82c46d814122f1e15098d2d5ebca2]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-async'**\n\n
+"helm-source" <|- - "helm-source-async"
+class "helm-source"
+class "helm-source-async" {
+ Use this class to define a
+ helm source calling an
+ external process.
+ ==
+ __ some interesting slots __
+ candidates-process
+ multimatch
+}
+note right of "helm-source-async"
+ **helm-source-async**:
+ Use this class to define a
+ helm source calling an
+ external process.
+end note
+"helm-source-async" <|- - "helm-mac-spotlight-source"
+"helm-source-async" <|- - "helm-gid-source"
+"helm-source-async" <|- - "helm-fd-class"
+"helm-source-async" <|- - "helm-locate-source"
+"helm-source-async" <|- - "helm-grep-ag-class"
+"helm-source-async" <|- - "helm-grep-class"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-source-basic-bookmarks.png b/doc/helm-figures/helm-source-basic-bookmarks.png
new file mode 100644
index 00000000..8608cdb2
--- /dev/null
+++ b/doc/helm-figures/helm-source-basic-bookmarks.png
Binary files differ
diff --git a/doc/helm-figures/helm-source-basic-bookmarks.svg b/doc/helm-figures/helm-source-basic-bookmarks.svg
new file mode 100644
index 00000000..e1c20ed1
--- /dev/null
+++ b/doc/helm-figures/helm-source-basic-bookmarks.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="503px" preserveAspectRatio="none" style="width:619px;height:503px;" version="1.1" viewBox="0 0 619 503" width="619px" zoomAndPan="magnify"><defs><filter height="300%" id="fpc0u6r2kx4ng" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="192.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="314" x="155.5" y="37.6611">'helm-source-basic-bookmarks'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="315.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="315.5" y="79.5674"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#fpc0u6r2kx4ng)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="35" y="219.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="239.8125" y2="239.8125"/><!--MD5=[bf73905ec5fe3c8fa1d96a26605c7c43]
+class helm-source-basic-bookmarks--><rect fill="#FEFECE" filter="url(#fpc0u6r2kx4ng)" height="184.8516" id="helm-source-basic-bookmarks" style="stroke: #A80036; stroke-width: 1.5;" width="244" x="84.5" y="307.8125"/><ellipse cx="99.5" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M102.4688,329.4531 Q101.8906,329.75 101.25,329.8906 Q100.6094,330.0469 99.9063,330.0469 Q97.4063,330.0469 96.0781,328.4063 Q94.7656,326.75 94.7656,323.625 Q94.7656,320.5 96.0781,318.8438 Q97.4063,317.1875 99.9063,317.1875 Q100.6094,317.1875 101.25,317.3438 Q101.9063,317.5 102.4688,317.7969 L102.4688,320.5156 Q101.8438,319.9375 101.25,319.6719 Q100.6563,319.3906 100.0313,319.3906 Q98.6875,319.3906 98,320.4688 Q97.3125,321.5313 97.3125,323.625 Q97.3125,325.7188 98,326.7969 Q98.6875,327.8594 100.0313,327.8594 Q100.6563,327.8594 101.25,327.5938 Q101.8438,327.3125 102.4688,326.7344 L102.4688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="212" x="113.5" y="327.9668">helm-source-basic-bookmarks</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="85.5" x2="327.5" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="90.5" y="370.8276">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="90.5" y="383.6323">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="25" x="90.5" y="396.437">data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="90.5" y="409.2417">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="90.5" y="422.0464">get-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="90.5" y="434.8511">match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="90.5" y="447.6558">migemo</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="90.5" y="460.4604">search</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="90.5" y="473.2651">search-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="40" x="90.5" y="486.0698">volatile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="85.5" x2="143" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="143" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="270" x2="327.5" y1="354.2148" y2="354.2148"/><!--MD5=[257e0c9decabcf296fc5e077c0fe3da7]
+class helm-type-bookmark--><rect fill="#FEFECE" filter="url(#fpc0u6r2kx4ng)" height="48" id="helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.5;" width="178" x="225.5" y="199.8125"/><ellipse cx="240.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M243.4688,221.4531 Q242.8906,221.75 242.25,221.8906 Q241.6094,222.0469 240.9063,222.0469 Q238.4063,222.0469 237.0781,220.4063 Q235.7656,218.75 235.7656,215.625 Q235.7656,212.5 237.0781,210.8438 Q238.4063,209.1875 240.9063,209.1875 Q241.6094,209.1875 242.25,209.3438 Q242.9063,209.5 243.4688,209.7969 L243.4688,212.5156 Q242.8438,211.9375 242.25,211.6719 Q241.6563,211.3906 241.0313,211.3906 Q239.6875,211.3906 239,212.4688 Q238.3125,213.5313 238.3125,215.625 Q238.3125,217.7188 239,218.7969 Q239.6875,219.8594 241.0313,219.8594 Q241.6563,219.8594 242.25,219.5938 Q242.8438,219.3125 243.4688,218.7344 L243.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="146" x="254.5" y="219.9668">helm-type-bookmark</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="226.5" x2="402.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="226.5" x2="402.5" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fpc0u6r2kx4ng)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="147" y="91.8125"/><ellipse cx="162" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M164.9688,113.4531 Q164.3906,113.75 163.75,113.8906 Q163.1094,114.0469 162.4063,114.0469 Q159.9063,114.0469 158.5781,112.4063 Q157.2656,110.75 157.2656,107.625 Q157.2656,104.5 158.5781,102.8438 Q159.9063,101.1875 162.4063,101.1875 Q163.1094,101.1875 163.75,101.3438 Q164.4063,101.5 164.9688,101.7969 L164.9688,104.5156 Q164.3438,103.9375 163.75,103.6719 Q163.1563,103.3906 162.5313,103.3906 Q161.1875,103.3906 160.5,104.4688 Q159.8125,105.5313 159.8125,107.625 Q159.8125,109.7188 160.5,110.7969 Q161.1875,111.8594 162.5313,111.8594 Q163.1563,111.8594 163.75,111.5938 Q164.3438,111.3125 164.9688,110.7344 L164.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="176" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="148" x2="265" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="148" x2="265" y1="131.8125" y2="131.8125"/><path d="M364,387.8125 L364,396.3125 L328.56,400.3125 L364,404.3125 L364,412.9453 A0,0 0 0 0 364,412.9453 L607,412.9453 A0,0 0 0 0 607,412.9453 L607,397.8125 L597,387.8125 L364,387.8125 A0,0 0 0 0 364,387.8125 " fill="#FBFB77" filter="url(#fpc0u6r2kx4ng)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M597,387.8125 L597,397.8125 L607,397.8125 L597,387.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="222" x="370" y="404.8794">helm-source-basic-bookmarks</text><!--MD5=[560569eff9650cc936c24e2acd6b7c35]
+reverse link helm-source-in-buffer to helm-source-basic-bookmarks--><path d="M123.49,265.1925 C131.42,278.0125 140.55,292.7425 149.77,307.6625 " fill="none" id="helm-source-in-buffer&lt;-helm-source-basic-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="117.41,268.6725,112.84,247.9825,129.32,261.3025,117.41,268.6725" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[d74130942a07ed6c44229600fa80fecc]
+reverse link helm-type-bookmark to helm-source-basic-bookmarks--><path d="M289.51,265.1925 C281.58,278.0125 272.45,292.7425 263.23,307.6625 " fill="none" id="helm-type-bookmark&lt;-helm-source-basic-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="283.68,261.3025,300.16,247.9825,295.59,268.6725,283.68,261.3025" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M168.52,154.0925 C153.12,169.2025 135.82,186.1925 122.26,199.4925 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="163.89,148.8225,183.07,139.8125,173.7,158.8225,163.89,148.8225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[b3073f519ff1e7a9af7ffffd7406ad63]
+reverse link helm-source to helm-type-bookmark--><path d="M244.48,154.0925 C259.88,169.2025 277.18,186.1925 290.74,199.4925 " fill="none" id="helm-source&lt;-helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="239.3,158.8225,229.93,139.8125,249.11,148.8225,239.3,158.8225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[6a23b050d668cecb3462418c9809aca7]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-basic-bookmarks'**\n\n
+"helm-source-in-buffer" <|- - "helm-source-basic-bookmarks"
+"helm-type-bookmark" <|- - "helm-source-basic-bookmarks"
+class "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-type-bookmark"
+"helm-source" <|- - "helm-type-bookmark"
+class "helm-source"
+class "helm-source-basic-bookmarks" {
+ __ some interesting slots __
+ init
+ candidates
+ data
+ filtered-candidate-transformer
+ get-line
+ match
+ migemo
+ search
+ search-strict
+ volatile
+}
+note right of "helm-source-basic-bookmarks"
+ **helm-source-basic-bookmarks**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-source-buffers.png b/doc/helm-figures/helm-source-buffers.png
new file mode 100644
index 00000000..090b0ff8
--- /dev/null
+++ b/doc/helm-figures/helm-source-buffers.png
Binary files differ
diff --git a/doc/helm-figures/helm-source-buffers.svg b/doc/helm-figures/helm-source-buffers.svg
new file mode 100644
index 00000000..19f96f6b
--- /dev/null
+++ b/doc/helm-figures/helm-source-buffers.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="554px" preserveAspectRatio="none" style="width:483px;height:554px;" version="1.1" viewBox="0 0 483 554" width="483px" zoomAndPan="magnify"><defs><filter height="300%" id="f1klcjp3g0g6am" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="124.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="217" x="136" y="37.6611">'helm-source-buffers'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="247.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="247.5" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#f1klcjp3g0g6am)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="35" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="161" y1="239.8125" y2="239.8125"/><!--MD5=[5e8ec52a80544584992cb03033476cca]
+class helm-source-buffers--><rect fill="#FEFECE" filter="url(#f1klcjp3g0g6am)" height="236.0703" id="helm-source-buffers" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="90.5" y="307.8125"/><ellipse cx="105.5" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M108.4688,329.4531 Q107.8906,329.75 107.25,329.8906 Q106.6094,330.0469 105.9063,330.0469 Q103.4063,330.0469 102.0781,328.4063 Q100.7656,326.75 100.7656,323.625 Q100.7656,320.5 102.0781,318.8438 Q103.4063,317.1875 105.9063,317.1875 Q106.6094,317.1875 107.25,317.3438 Q107.9063,317.5 108.4688,317.7969 L108.4688,320.5156 Q107.8438,319.9375 107.25,319.6719 Q106.6563,319.3906 106.0313,319.3906 Q104.6875,319.3906 104,320.4688 Q103.3125,321.5313 103.3125,323.625 Q103.3125,325.7188 104,326.7969 Q104.6875,327.8594 106.0313,327.8594 Q106.6563,327.8594 107.25,327.5938 Q107.8438,327.3125 108.4688,326.7344 L108.4688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="119.5" y="327.9668">helm-source-buffers</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="91.5" x2="264.5" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="96.5" y="370.8276">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="55" x="96.5" y="383.6323">buffer-list</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="96.5" y="396.437">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="96.5" y="409.2417">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="96.5" y="422.0464">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="96.5" y="434.8511">match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="96.5" y="447.6558">match-dynamic</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="96.5" y="460.4604">match-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="96.5" y="473.2651">migemo</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="63" x="96.5" y="486.0698">multimatch</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="96.5" y="498.8745">nohighlight</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="96" x="96.5" y="511.6792">persistent-action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="96.5" y="524.4839">resume</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="40" x="96.5" y="537.2886">volatile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="91.5" x2="114.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="114.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="241.5" x2="264.5" y1="354.2148" y2="354.2148"/><!--MD5=[44eb50c21698d944c3f7c5a7441762ef]
+class helm-type-buffer--><rect fill="#FEFECE" filter="url(#f1klcjp3g0g6am)" height="48" id="helm-type-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="151" x="197.5" y="199.8125"/><ellipse cx="212.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M215.4688,221.4531 Q214.8906,221.75 214.25,221.8906 Q213.6094,222.0469 212.9063,222.0469 Q210.4063,222.0469 209.0781,220.4063 Q207.7656,218.75 207.7656,215.625 Q207.7656,212.5 209.0781,210.8438 Q210.4063,209.1875 212.9063,209.1875 Q213.6094,209.1875 214.25,209.3438 Q214.9063,209.5 215.4688,209.7969 L215.4688,212.5156 Q214.8438,211.9375 214.25,211.6719 Q213.6563,211.3906 213.0313,211.3906 Q211.6875,211.3906 211,212.4688 Q210.3125,213.5313 210.3125,215.625 Q210.3125,217.7188 211,218.7969 Q211.6875,219.8594 213.0313,219.8594 Q213.6563,219.8594 214.25,219.5938 Q214.8438,219.3125 215.4688,218.7344 L215.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="119" x="226.5" y="219.9668">helm-type-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="198.5" x2="347.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="198.5" x2="347.5" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1klcjp3g0g6am)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="118.5" y="91.8125"/><ellipse cx="133.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M136.4688,113.4531 Q135.8906,113.75 135.25,113.8906 Q134.6094,114.0469 133.9063,114.0469 Q131.4063,114.0469 130.0781,112.4063 Q128.7656,110.75 128.7656,107.625 Q128.7656,104.5 130.0781,102.8438 Q131.4063,101.1875 133.9063,101.1875 Q134.6094,101.1875 135.25,101.3438 Q135.9063,101.5 136.4688,101.7969 L136.4688,104.5156 Q135.8438,103.9375 135.25,103.6719 Q134.6563,103.3906 134.0313,103.3906 Q132.6875,103.3906 132,104.4688 Q131.3125,105.5313 131.3125,107.625 Q131.3125,109.7188 132,110.7969 Q132.6875,111.8594 134.0313,111.8594 Q134.6563,111.8594 135.25,111.5938 Q135.8438,111.3125 136.4688,110.7344 L136.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="147.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="119.5" x2="236.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="119.5" x2="236.5" y1="131.8125" y2="131.8125"/><path d="M301,413.3125 L301,421.8125 L265.75,425.8125 L301,429.8125 L301,438.4453 A0,0 0 0 0 301,438.4453 L471,438.4453 A0,0 0 0 0 471,438.4453 L471,423.3125 L461,413.3125 L301,413.3125 A0,0 0 0 0 301,413.3125 " fill="#FBFB77" filter="url(#f1klcjp3g0g6am)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M461,413.3125 L461,423.3125 L471,423.3125 L461,413.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="149" x="307" y="430.3794">helm-source-buffers</text><!--MD5=[bd9832b2051106d13c2f652e2dc85e4c]
+reverse link helm-source-sync to helm-source-buffers--><path d="M103.53,266.3625 C109.32,278.6825 115.97,292.8225 122.85,307.4725 " fill="none" id="helm-source-sync&lt;-helm-source-buffers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="97.14,269.2225,94.97,248.1425,109.81,263.2725,97.14,269.2225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[88c02f9cf13fd6689df37b68aefeb8b8]
+reverse link helm-type-buffer to helm-source-buffers--><path d="M253.26,266.3625 C247.41,278.6825 240.69,292.8225 233.73,307.4725 " fill="none" id="helm-type-buffer&lt;-helm-source-buffers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="247.01,263.2125,261.92,248.1425,259.66,269.2125,247.01,263.2125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M144.1,155.0425 C130.91,169.9125 116.23,186.4625 104.68,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="139.1,150.1325,157.6,139.8125,149.57,159.4225,139.1,150.1325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[528fc0d38c023ea499a6c44f22caf734]
+reverse link helm-source to helm-type-buffer--><path d="M212.26,155.0425 C225.59,169.9125 240.42,186.4625 252.1,199.4925 " fill="none" id="helm-source&lt;-helm-type-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="206.75,159.3825,198.61,139.8125,217.17,150.0325,206.75,159.3825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[449031514833898d0eea19fadfdb5997]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-buffers'**\n\n
+"helm-source-sync" <|- - "helm-source-buffers"
+"helm-type-buffer" <|- - "helm-source-buffers"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-type-buffer"
+"helm-source" <|- - "helm-type-buffer"
+class "helm-source"
+class "helm-source-buffers" {
+ __ some interesting slots __
+ init
+ buffer-list
+ candidates
+ help-message
+ keymap
+ match
+ match-dynamic
+ match-strict
+ migemo
+ multimatch
+ nohighlight
+ persistent-action
+ resume
+ volatile
+}
+note right of "helm-source-buffers"
+ **helm-source-buffers**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-source-dummy.png b/doc/helm-figures/helm-source-dummy.png
new file mode 100644
index 00000000..25bc7e63
--- /dev/null
+++ b/doc/helm-figures/helm-source-dummy.png
Binary files differ
diff --git a/doc/helm-figures/helm-source-dummy.svg b/doc/helm-figures/helm-source-dummy.svg
new file mode 100644
index 00000000..d4148254
--- /dev/null
+++ b/doc/helm-figures/helm-source-dummy.svg
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="344px" preserveAspectRatio="none" style="width:408px;height:344px;" version="1.1" viewBox="0 0 408 344" width="408px" zoomAndPan="magnify"><defs><filter height="300%" id="f1wsawkhhfwwzl" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="87.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="217" x="99" y="37.6611">'helm-source-dummy'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="210.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="210.5" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1wsawkhhfwwzl)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="38.5" y="91.8125"/><ellipse cx="53.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.4688,113.4531 Q55.8906,113.75 55.25,113.8906 Q54.6094,114.0469 53.9063,114.0469 Q51.4063,114.0469 50.0781,112.4063 Q48.7656,110.75 48.7656,107.625 Q48.7656,104.5 50.0781,102.8438 Q51.4063,101.1875 53.9063,101.1875 Q54.6094,101.1875 55.25,101.3438 Q55.9063,101.5 56.4688,101.7969 L56.4688,104.5156 Q55.8438,103.9375 55.25,103.6719 Q54.6563,103.3906 54.0313,103.3906 Q52.6875,103.3906 52,104.4688 Q51.3125,105.5313 51.3125,107.625 Q51.3125,109.7188 52,110.7969 Q52.6875,111.8594 54.0313,111.8594 Q54.6563,111.8594 55.25,111.5938 Q55.8438,111.3125 56.4688,110.7344 L56.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="67.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="131.8125" y2="131.8125"/><!--MD5=[5adfb603e84a1ac071a064f5c8c4d8a3]
+class helm-source-dummy--><rect fill="#FEFECE" filter="url(#f1wsawkhhfwwzl)" height="133.6328" id="helm-source-dummy" style="stroke: #A80036; stroke-width: 1.5;" width="184" x="6" y="199.8125"/><ellipse cx="25.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M28.4688,221.4531 Q27.8906,221.75 27.25,221.8906 Q26.6094,222.0469 25.9063,222.0469 Q23.4063,222.0469 22.0781,220.4063 Q20.7656,218.75 20.7656,215.625 Q20.7656,212.5 22.0781,210.8438 Q23.4063,209.1875 25.9063,209.1875 Q26.6094,209.1875 27.25,209.3438 Q27.9063,209.5 28.4688,209.7969 L28.4688,212.5156 Q27.8438,211.9375 27.25,211.6719 Q26.6563,211.3906 26.0313,211.3906 Q24.6875,211.3906 24,212.4688 Q23.3125,213.5313 23.3125,215.625 Q23.3125,217.7188 24,218.7969 Q24.6875,219.8594 26.0313,219.8594 Q26.6563,219.8594 27.25,219.5938 Q27.8438,219.3125 28.4688,218.7344 L28.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="142" x="40.5" y="219.9668">helm-source-dummy</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="189" y1="231.8125" y2="231.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="12" y="262.8276">accept-empty</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="275.6323">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="12" y="288.437">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="12" y="301.2417">match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="63" x="12" y="314.0464">multimatch</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="40" x="12" y="326.8511">volatile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="34.5" y1="246.2148" y2="246.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="34.5" y="249.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="161.5" x2="189" y1="246.2148" y2="246.2148"/><path d="M225.5,254.3125 L225.5,262.8125 L190.36,266.8125 L225.5,270.8125 L225.5,279.4453 A0,0 0 0 0 225.5,279.4453 L396.5,279.4453 A0,0 0 0 0 396.5,279.4453 L396.5,264.3125 L386.5,254.3125 L225.5,254.3125 A0,0 0 0 0 225.5,254.3125 " fill="#FBFB77" filter="url(#f1wsawkhhfwwzl)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M386.5,254.3125 L386.5,264.3125 L396.5,264.3125 L386.5,254.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="150" x="231.5" y="271.3794">helm-source-dummy</text><!--MD5=[08cc1f31d63ae7c2a5398bb390fce2ff]
+reverse link helm-source to helm-source-dummy--><path d="M98,160.3625 C98,172.6425 98,186.2925 98,199.5925 " fill="none" id="helm-source&lt;-helm-source-dummy" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,160.0925,98,140.0925,105,160.0925,91,160.0925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[0824c5f47287e57936a9e4a4b2404911]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-dummy'**\n\n
+"helm-source" <|- - "helm-source-dummy"
+class "helm-source"
+class "helm-source-dummy" {
+ __ some interesting slots __
+ accept-empty
+ candidates
+ filtered-candidate-transformer
+ match
+ multimatch
+ volatile
+}
+note right of "helm-source-dummy"
+ **helm-source-dummy**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-source-ffiles.png b/doc/helm-figures/helm-source-ffiles.png
new file mode 100644
index 00000000..cf304c19
--- /dev/null
+++ b/doc/helm-figures/helm-source-ffiles.png
Binary files differ
diff --git a/doc/helm-figures/helm-source-ffiles.svg b/doc/helm-figures/helm-source-ffiles.svg
new file mode 100644
index 00000000..dfd64b0c
--- /dev/null
+++ b/doc/helm-figures/helm-source-ffiles.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="644px" preserveAspectRatio="none" style="width:390px;height:644px;" version="1.1" viewBox="0 0 390 644" width="390px" zoomAndPan="magnify"><defs><filter height="300%" id="f18kavn37g7zw" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="78.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="194" x="101.5" y="37.6611">'helm-source-ffiles'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="201.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="201.5" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#f18kavn37g7zw)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="20" y="199.8125"/><ellipse cx="35" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M37.9688,221.4531 Q37.3906,221.75 36.75,221.8906 Q36.1094,222.0469 35.4063,222.0469 Q32.9063,222.0469 31.5781,220.4063 Q30.2656,218.75 30.2656,215.625 Q30.2656,212.5 31.5781,210.8438 Q32.9063,209.1875 35.4063,209.1875 Q36.1094,209.1875 36.75,209.3438 Q37.4063,209.5 37.9688,209.7969 L37.9688,212.5156 Q37.3438,211.9375 36.75,211.6719 Q36.1563,211.3906 35.5313,211.3906 Q34.1875,211.3906 33.5,212.4688 Q32.8125,213.5313 32.8125,215.625 Q32.8125,217.7188 33.5,218.7969 Q34.1875,219.8594 35.5313,219.8594 Q36.1563,219.8594 36.75,219.5938 Q37.3438,219.3125 37.9688,218.7344 L37.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="49" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="21" x2="175" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="21" x2="175" y1="239.8125" y2="239.8125"/><!--MD5=[4700ddfab9e311ad1ae5061cdd5496ba]
+class helm-source-ffiles--><rect fill="#FEFECE" filter="url(#f18kavn37g7zw)" height="325.7031" id="helm-source-ffiles" style="stroke: #A80036; stroke-width: 1.5;" width="184" x="6" y="307.8125"/><ellipse cx="32.25" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M35.2188,329.4531 Q34.6406,329.75 34,329.8906 Q33.3594,330.0469 32.6563,330.0469 Q30.1563,330.0469 28.8281,328.4063 Q27.5156,326.75 27.5156,323.625 Q27.5156,320.5 28.8281,318.8438 Q30.1563,317.1875 32.6563,317.1875 Q33.3594,317.1875 34,317.3438 Q34.6563,317.5 35.2188,317.7969 L35.2188,320.5156 Q34.5938,319.9375 34,319.6719 Q33.4063,319.3906 32.7813,319.3906 Q31.4375,319.3906 30.75,320.4688 Q30.0625,321.5313 30.0625,323.625 Q30.0625,325.7188 30.75,326.7969 Q31.4375,327.8594 32.7813,327.8594 Q33.4063,327.8594 34,327.5938 Q34.5938,327.3125 35.2188,326.7344 L35.2188,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="127" x="48.75" y="327.9668">helm-source-ffiles</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="189" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="12" y="370.8276">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="12" y="383.6323">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="12" y="396.437">action-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="12" y="409.2417">after-init-hook</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="12" y="422.0464">before-init-hook</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="12" y="434.8511">candidate-number-limit</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="447.6558">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="12" y="460.4604">cleanup</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="12" y="473.2651">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="33" x="12" y="486.0698">group</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="12" y="498.8745">header-name</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="12" y="511.6792">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="12" y="524.4839">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="12" y="537.2886">match-on-real</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="12" y="550.0933">migemo</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="12" y="562.8979">mode-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="575.7026">nohighlight</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="12" y="588.5073">persistent-action-if</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="12" y="601.312">persistent-help</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="12" y="614.1167">update</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="40" x="12" y="626.9214">volatile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="34.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="34.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="161.5" x2="189" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f18kavn37g7zw)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="38.5" y="91.8125"/><ellipse cx="53.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.4688,113.4531 Q55.8906,113.75 55.25,113.8906 Q54.6094,114.0469 53.9063,114.0469 Q51.4063,114.0469 50.0781,112.4063 Q48.7656,110.75 48.7656,107.625 Q48.7656,104.5 50.0781,102.8438 Q51.4063,101.1875 53.9063,101.1875 Q54.6094,101.1875 55.25,101.3438 Q55.9063,101.5 56.4688,101.7969 L56.4688,104.5156 Q55.8438,103.9375 55.25,103.6719 Q54.6563,103.3906 54.0313,103.3906 Q52.6875,103.3906 52,104.4688 Q51.3125,105.5313 51.3125,107.625 Q51.3125,109.7188 52,110.7969 Q52.6875,111.8594 54.0313,111.8594 Q54.6563,111.8594 55.25,111.5938 Q55.8438,111.3125 56.4688,110.7344 L56.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="67.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="39.5" x2="156.5" y1="131.8125" y2="131.8125"/><path d="M225.5,458.3125 L225.5,466.8125 L190.04,470.8125 L225.5,474.8125 L225.5,483.4453 A0,0 0 0 0 225.5,483.4453 L378.5,483.4453 A0,0 0 0 0 378.5,483.4453 L378.5,468.3125 L368.5,458.3125 L225.5,458.3125 A0,0 0 0 0 225.5,458.3125 " fill="#FBFB77" filter="url(#f18kavn37g7zw)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M368.5,458.3125 L368.5,468.3125 L378.5,468.3125 L368.5,458.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="132" x="231.5" y="475.3794">helm-source-ffiles</text><!--MD5=[016784bd64bc0242128ed351709a683a]
+reverse link helm-source-sync to helm-source-ffiles--><path d="M98,268.1725 C98,279.9425 98,293.4325 98,307.7125 " fill="none" id="helm-source-sync&lt;-helm-source-ffiles" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,267.8625,98,247.8625,105,267.8625,91,267.8625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M98,159.8325 C98,173.3925 98,187.8525 98,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91,159.8125,98,139.8125,105,159.8125,91,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7e406830ebea7a2408e31f70600fe4e1]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-ffiles'**\n\n
+"helm-source-sync" <|- - "helm-source-ffiles"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-source-ffiles" {
+ __ some interesting slots __
+ init
+ action
+ action-transformer
+ after-init-hook
+ before-init-hook
+ candidate-number-limit
+ candidates
+ cleanup
+ filtered-candidate-transformer
+ group
+ header-name
+ help-message
+ keymap
+ match-on-real
+ migemo
+ mode-line
+ nohighlight
+ persistent-action-if
+ persistent-help
+ update
+ volatile
+}
+note right of "helm-source-ffiles"
+ **helm-source-ffiles**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-source-filtered-bookmarks.png b/doc/helm-figures/helm-source-filtered-bookmarks.png
new file mode 100644
index 00000000..64cbe64c
--- /dev/null
+++ b/doc/helm-figures/helm-source-filtered-bookmarks.png
Binary files differ
diff --git a/doc/helm-figures/helm-source-filtered-bookmarks.svg b/doc/helm-figures/helm-source-filtered-bookmarks.svg
new file mode 100644
index 00000000..792bddc0
--- /dev/null
+++ b/doc/helm-figures/helm-source-filtered-bookmarks.svg
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="611px" preserveAspectRatio="none" style="width:641px;height:611px;" version="1.1" viewBox="0 0 641 611" width="641px" zoomAndPan="magnify"><defs><filter height="300%" id="f1xuqg4iwt23an" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="204" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="336" x="156" y="37.6611">'helm-source-filtered-bookmarks'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="327" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="327" y="79.5674"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#f1xuqg4iwt23an)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="35" y="219.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="239.8125" y2="239.8125"/><!--MD5=[1b5f639ef80bc5f44c8cc4600bf3e2e4]
+class helm-source-filtered-bookmarks--><rect fill="#FEFECE" filter="url(#f1xuqg4iwt23an)" height="184.8516" id="helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.5;" width="259" x="77" y="307.8125"/><ellipse cx="92" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M94.9688,329.4531 Q94.3906,329.75 93.75,329.8906 Q93.1094,330.0469 92.4063,330.0469 Q89.9063,330.0469 88.5781,328.4063 Q87.2656,326.75 87.2656,323.625 Q87.2656,320.5 88.5781,318.8438 Q89.9063,317.1875 92.4063,317.1875 Q93.1094,317.1875 93.75,317.3438 Q94.4063,317.5 94.9688,317.7969 L94.9688,320.5156 Q94.3438,319.9375 93.75,319.6719 Q93.1563,319.3906 92.5313,319.3906 Q91.1875,319.3906 90.5,320.4688 Q89.8125,321.5313 89.8125,323.625 Q89.8125,325.7188 90.5,326.7969 Q91.1875,327.8594 92.5313,327.8594 Q93.1563,327.8594 93.75,327.5938 Q94.3438,327.3125 94.9688,326.7344 L94.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="227" x="106" y="327.9668">helm-source-filtered-bookmarks</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="78" x2="335" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="83" y="370.8276">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="83" y="383.6323">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="25" x="83" y="396.437">data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="83" y="409.2417">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="83" y="422.0464">get-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="83" y="434.8511">match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="83" y="447.6558">migemo</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="83" y="460.4604">search</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="83" y="473.2651">search-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="40" x="83" y="486.0698">volatile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="78" x2="143" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="143" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="270" x2="335" y1="354.2148" y2="354.2148"/><!--MD5=[257e0c9decabcf296fc5e077c0fe3da7]
+class helm-type-bookmark--><rect fill="#FEFECE" filter="url(#f1xuqg4iwt23an)" height="48" id="helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.5;" width="178" x="225.5" y="199.8125"/><ellipse cx="240.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M243.4688,221.4531 Q242.8906,221.75 242.25,221.8906 Q241.6094,222.0469 240.9063,222.0469 Q238.4063,222.0469 237.0781,220.4063 Q235.7656,218.75 235.7656,215.625 Q235.7656,212.5 237.0781,210.8438 Q238.4063,209.1875 240.9063,209.1875 Q241.6094,209.1875 242.25,209.3438 Q242.9063,209.5 243.4688,209.7969 L243.4688,212.5156 Q242.8438,211.9375 242.25,211.6719 Q241.6563,211.3906 241.0313,211.3906 Q239.6875,211.3906 239,212.4688 Q238.3125,213.5313 238.3125,215.625 Q238.3125,217.7188 239,218.7969 Q239.6875,219.8594 241.0313,219.8594 Q241.6563,219.8594 242.25,219.5938 Q242.8438,219.3125 243.4688,218.7344 L243.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="146" x="254.5" y="219.9668">helm-type-bookmark</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="226.5" x2="402.5" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="226.5" x2="402.5" y1="239.8125" y2="239.8125"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1xuqg4iwt23an)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="147" y="91.8125"/><ellipse cx="162" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M164.9688,113.4531 Q164.3906,113.75 163.75,113.8906 Q163.1094,114.0469 162.4063,114.0469 Q159.9063,114.0469 158.5781,112.4063 Q157.2656,110.75 157.2656,107.625 Q157.2656,104.5 158.5781,102.8438 Q159.9063,101.1875 162.4063,101.1875 Q163.1094,101.1875 163.75,101.3438 Q164.4063,101.5 164.9688,101.7969 L164.9688,104.5156 Q164.3438,103.9375 163.75,103.6719 Q163.1563,103.3906 162.5313,103.3906 Q161.1875,103.3906 160.5,104.4688 Q159.8125,105.5313 159.8125,107.625 Q159.8125,109.7188 160.5,110.7969 Q161.1875,111.8594 162.5313,111.8594 Q163.1563,111.8594 163.75,111.5938 Q164.3438,111.3125 164.9688,110.7344 L164.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="176" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="148" x2="265" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="148" x2="265" y1="131.8125" y2="131.8125"/><path d="M371.5,387.8125 L371.5,396.3125 L336.27,400.3125 L371.5,404.3125 L371.5,412.9453 A0,0 0 0 0 371.5,412.9453 L629.5,412.9453 A0,0 0 0 0 629.5,412.9453 L629.5,397.8125 L619.5,387.8125 L371.5,387.8125 A0,0 0 0 0 371.5,387.8125 " fill="#FBFB77" filter="url(#f1xuqg4iwt23an)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M619.5,387.8125 L619.5,397.8125 L629.5,397.8125 L619.5,387.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="237" x="377.5" y="404.8794">helm-source-filtered-bookmarks</text><!--MD5=[f325aa84e92746ce6f670c419a69be3e]
+class helm-bookmark-find-files-class--><rect fill="#FEFECE" filter="url(#f1xuqg4iwt23an)" height="48" id="helm-bookmark-find-files-class" style="stroke: #A80036; stroke-width: 1.5;" width="249" x="82" y="552.8125"/><ellipse cx="97" cy="568.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M99.9688,574.4531 Q99.3906,574.75 98.75,574.8906 Q98.1094,575.0469 97.4063,575.0469 Q94.9063,575.0469 93.5781,573.4063 Q92.2656,571.75 92.2656,568.625 Q92.2656,565.5 93.5781,563.8438 Q94.9063,562.1875 97.4063,562.1875 Q98.1094,562.1875 98.75,562.3438 Q99.4063,562.5 99.9688,562.7969 L99.9688,565.5156 Q99.3438,564.9375 98.75,564.6719 Q98.1563,564.3906 97.5313,564.3906 Q96.1875,564.3906 95.5,565.4688 Q94.8125,566.5313 94.8125,568.625 Q94.8125,570.7188 95.5,571.7969 Q96.1875,572.8594 97.5313,572.8594 Q98.1563,572.8594 98.75,572.5938 Q99.3438,572.3125 99.9688,571.7344 L99.9688,574.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="217" x="111" y="572.9668">helm-bookmark-find-files-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="83" x2="330" y1="584.8125" y2="584.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="83" x2="330" y1="592.8125" y2="592.8125"/><!--MD5=[38d3222c9d6413d0e8be51642b02db5a]
+reverse link helm-source-in-buffer to helm-source-filtered-bookmarks--><path d="M123.49,265.1925 C131.42,278.0125 140.55,292.7425 149.77,307.6625 " fill="none" id="helm-source-in-buffer&lt;-helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="117.41,268.6725,112.84,247.9825,129.32,261.3025,117.41,268.6725" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[36bf56344c9fb562b92d13c27d56d2e6]
+reverse link helm-type-bookmark to helm-source-filtered-bookmarks--><path d="M289.51,265.1925 C281.58,278.0125 272.45,292.7425 263.23,307.6625 " fill="none" id="helm-type-bookmark&lt;-helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="283.68,261.3025,300.16,247.9825,295.59,268.6725,283.68,261.3025" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M168.52,154.0925 C153.12,169.2025 135.82,186.1925 122.26,199.4925 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="163.89,148.8225,183.07,139.8125,173.7,158.8225,163.89,148.8225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[b3073f519ff1e7a9af7ffffd7406ad63]
+reverse link helm-source to helm-type-bookmark--><path d="M244.48,154.0925 C259.88,169.2025 277.18,186.1925 290.74,199.4925 " fill="none" id="helm-source&lt;-helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="239.3,158.8225,229.93,139.8125,249.11,148.8225,239.3,158.8225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[97418b6d899cd58bad59cfd77e9ec07d]
+reverse link helm-source-filtered-bookmarks to helm-bookmark-find-files-class--><path d="M206.5,512.9425 C206.5,527.8625 206.5,541.7425 206.5,552.6425 " fill="none" id="helm-source-filtered-bookmarks&lt;-helm-bookmark-find-files-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="199.5,512.9025,206.5,492.9025,213.5,512.9025,199.5,512.9025" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[14b8184b4095c9f3e39158d6b3f69e54]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-filtered-bookmarks'**\n\n
+"helm-source-in-buffer" <|- - "helm-source-filtered-bookmarks"
+"helm-type-bookmark" <|- - "helm-source-filtered-bookmarks"
+class "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-type-bookmark"
+"helm-source" <|- - "helm-type-bookmark"
+class "helm-source"
+class "helm-source-filtered-bookmarks" {
+ __ some interesting slots __
+ init
+ candidates
+ data
+ filtered-candidate-transformer
+ get-line
+ match
+ migemo
+ search
+ search-strict
+ volatile
+}
+note right of "helm-source-filtered-bookmarks"
+ **helm-source-filtered-bookmarks**
+end note
+"helm-source-filtered-bookmarks" <|- - "helm-bookmark-find-files-class"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-source-in-buffer.png b/doc/helm-figures/helm-source-in-buffer.png
new file mode 100644
index 00000000..fa53fc6b
--- /dev/null
+++ b/doc/helm-figures/helm-source-in-buffer.png
Binary files differ
diff --git a/doc/helm-figures/helm-source-in-buffer.svg b/doc/helm-figures/helm-source-in-buffer.svg
new file mode 100644
index 00000000..47c05d27
--- /dev/null
+++ b/doc/helm-figures/helm-source-in-buffer.svg
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="536px" preserveAspectRatio="none" style="width:2328px;height:536px;" version="1.1" viewBox="0 0 2328 536" width="2328px" zoomAndPan="magnify"><defs><filter height="300%" id="f570iog4gags3" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="1047.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="232" x="1051.5" y="37.6611">'helm-source-in-buffer'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="1170.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="1170.5" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="1140.5" y="91.8125"/><ellipse cx="1155.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1158.4688,113.4531 Q1157.8906,113.75 1157.25,113.8906 Q1156.6094,114.0469 1155.9063,114.0469 Q1153.4063,114.0469 1152.0781,112.4063 Q1150.7656,110.75 1150.7656,107.625 Q1150.7656,104.5 1152.0781,102.8438 Q1153.4063,101.1875 1155.9063,101.1875 Q1156.6094,101.1875 1157.25,101.3438 Q1157.9063,101.5 1158.4688,101.7969 L1158.4688,104.5156 Q1157.8438,103.9375 1157.25,103.6719 Q1156.6563,103.3906 1156.0313,103.3906 Q1154.6875,103.3906 1154,104.4688 Q1153.3125,105.5313 1153.3125,107.625 Q1153.3125,109.7188 1154,110.7969 Q1154.6875,111.8594 1156.0313,111.8594 Q1156.6563,111.8594 1157.25,111.5938 Q1157.8438,111.3125 1158.4688,110.7344 L1158.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="1169.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1141.5" x2="1258.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1141.5" x2="1258.5" y1="131.8125" y2="131.8125"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="218.4609" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="1107.5" y="199.8125"/><ellipse cx="1122.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1125.4688,221.4531 Q1124.8906,221.75 1124.25,221.8906 Q1123.6094,222.0469 1122.9063,222.0469 Q1120.4063,222.0469 1119.0781,220.4063 Q1117.7656,218.75 1117.7656,215.625 Q1117.7656,212.5 1119.0781,210.8438 Q1120.4063,209.1875 1122.9063,209.1875 Q1123.6094,209.1875 1124.25,209.3438 Q1124.9063,209.5 1125.4688,209.7969 L1125.4688,212.5156 Q1124.8438,211.9375 1124.25,211.6719 Q1123.6563,211.3906 1123.0313,211.3906 Q1121.6875,211.3906 1121,212.4688 Q1120.3125,213.5313 1120.3125,215.625 Q1120.3125,217.7188 1121,218.7969 Q1121.6875,219.8594 1123.0313,219.8594 Q1123.6563,219.8594 1124.25,219.5938 Q1124.8438,219.3125 1125.4688,218.7344 L1125.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="1136.5" y="219.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1108.5" x2="1291.5" y1="231.8125" y2="231.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="167" x="1113.5" y="246.0229">Use this source to make helm</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="154" x="1113.5" y="258.8276">sources storing candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="85" x="1113.5" y="271.6323">inside a buffer.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="1108.5" x2="1291.5" y1="278.2266" y2="278.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1108.5" x2="1291.5" y1="280.2266" y2="280.2266"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="1113.5" y="309.2417">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="1113.5" y="322.0464">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="25" x="1113.5" y="334.8511">data</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="1113.5" y="347.6558">get-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="1113.5" y="360.4604">match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="1113.5" y="373.2651">migemo</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="1113.5" y="386.0698">search</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="72" x="1113.5" y="398.8745">search-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="40" x="1113.5" y="411.6792">volatile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1108.5" x2="1136.5" y1="292.6289" y2="292.6289"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="1136.5" y="295.937">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1263.5" x2="1291.5" y1="292.6289" y2="292.6289"/><path d="M1327.5,273.3125 L1327.5,304.8125 L1292.78,308.8125 L1327.5,312.8125 L1327.5,343.8438 A0,0 0 0 0 1327.5,343.8438 L1540.5,343.8438 A0,0 0 0 0 1540.5,343.8438 L1540.5,283.3125 L1530.5,273.3125 L1327.5,273.3125 A0,0 0 0 0 1327.5,273.3125 " fill="#FBFB77" filter="url(#f570iog4gags3)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1530.5,273.3125 L1530.5,283.3125 L1540.5,283.3125 L1530.5,273.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="159" x="1333.5" y="290.3794">helm-source-in-buffer</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="1492.5" y="290.3794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="192" x="1333.5" y="305.5122">Use this source to make helm</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="172" x="1333.5" y="320.645">sources storing candidates</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="94" x="1333.5" y="335.7778">inside a buffer.</text><!--MD5=[6a7a1e548828873723640eef38a6053c]
+class helm-semantic-source--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="48" id="helm-semantic-source" style="stroke: #A80036; stroke-width: 1.5;" width="188" x="6" y="477.8125"/><ellipse cx="21" cy="493.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,499.4531 Q23.3906,499.75 22.75,499.8906 Q22.1094,500.0469 21.4063,500.0469 Q18.9063,500.0469 17.5781,498.4063 Q16.2656,496.75 16.2656,493.625 Q16.2656,490.5 17.5781,488.8438 Q18.9063,487.1875 21.4063,487.1875 Q22.1094,487.1875 22.75,487.3438 Q23.4063,487.5 23.9688,487.7969 L23.9688,490.5156 Q23.3438,489.9375 22.75,489.6719 Q22.1563,489.3906 21.5313,489.3906 Q20.1875,489.3906 19.5,490.4688 Q18.8125,491.5313 18.8125,493.625 Q18.8125,495.7188 19.5,496.7969 Q20.1875,497.8594 21.5313,497.8594 Q22.1563,497.8594 22.75,497.5938 Q23.3438,497.3125 23.9688,496.7344 L23.9688,499.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="156" x="35" y="497.9668">helm-semantic-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="193" y1="509.8125" y2="509.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="193" y1="517.8125" y2="517.8125"/><!--MD5=[11858bbdb8c329cf3bf1e5498cb0b794]
+class helm-file-cache--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="48" id="helm-file-cache" style="stroke: #A80036; stroke-width: 1.5;" width="139" x="229.5" y="477.8125"/><ellipse cx="244.5" cy="493.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M247.4688,499.4531 Q246.8906,499.75 246.25,499.8906 Q245.6094,500.0469 244.9063,500.0469 Q242.4063,500.0469 241.0781,498.4063 Q239.7656,496.75 239.7656,493.625 Q239.7656,490.5 241.0781,488.8438 Q242.4063,487.1875 244.9063,487.1875 Q245.6094,487.1875 246.25,487.3438 Q246.9063,487.5 247.4688,487.7969 L247.4688,490.5156 Q246.8438,489.9375 246.25,489.6719 Q245.6563,489.3906 245.0313,489.3906 Q243.6875,489.3906 243,490.4688 Q242.3125,491.5313 242.3125,493.625 Q242.3125,495.7188 243,496.7969 Q243.6875,497.8594 245.0313,497.8594 Q245.6563,497.8594 246.25,497.5938 Q246.8438,497.3125 247.4688,496.7344 L247.4688,499.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="107" x="258.5" y="497.9668">helm-file-cache</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="230.5" x2="367.5" y1="509.8125" y2="509.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="230.5" x2="367.5" y1="517.8125" y2="517.8125"/><!--MD5=[cea65451dee1c19877355cf9a9f1c806]
+class helm-list-el-package-source--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="48" id="helm-list-el-package-source" style="stroke: #A80036; stroke-width: 1.5;" width="229" x="403.5" y="477.8125"/><ellipse cx="418.5" cy="493.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M421.4688,499.4531 Q420.8906,499.75 420.25,499.8906 Q419.6094,500.0469 418.9063,500.0469 Q416.4063,500.0469 415.0781,498.4063 Q413.7656,496.75 413.7656,493.625 Q413.7656,490.5 415.0781,488.8438 Q416.4063,487.1875 418.9063,487.1875 Q419.6094,487.1875 420.25,487.3438 Q420.9063,487.5 421.4688,487.7969 L421.4688,490.5156 Q420.8438,489.9375 420.25,489.6719 Q419.6563,489.3906 419.0313,489.3906 Q417.6875,489.3906 417,490.4688 Q416.3125,491.5313 416.3125,493.625 Q416.3125,495.7188 417,496.7969 Q417.6875,497.8594 419.0313,497.8594 Q419.6563,497.8594 420.25,497.5938 Q420.8438,497.3125 421.4688,496.7344 L421.4688,499.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="197" x="432.5" y="497.9668">helm-list-el-package-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="404.5" x2="631.5" y1="509.8125" y2="509.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="404.5" x2="631.5" y1="517.8125" y2="517.8125"/><!--MD5=[1b5f639ef80bc5f44c8cc4600bf3e2e4]
+class helm-source-filtered-bookmarks--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="48" id="helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.5;" width="259" x="667.5" y="477.8125"/><ellipse cx="682.5" cy="493.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M685.4688,499.4531 Q684.8906,499.75 684.25,499.8906 Q683.6094,500.0469 682.9063,500.0469 Q680.4063,500.0469 679.0781,498.4063 Q677.7656,496.75 677.7656,493.625 Q677.7656,490.5 679.0781,488.8438 Q680.4063,487.1875 682.9063,487.1875 Q683.6094,487.1875 684.25,487.3438 Q684.9063,487.5 685.4688,487.7969 L685.4688,490.5156 Q684.8438,489.9375 684.25,489.6719 Q683.6563,489.3906 683.0313,489.3906 Q681.6875,489.3906 681,490.4688 Q680.3125,491.5313 680.3125,493.625 Q680.3125,495.7188 681,496.7969 Q681.6875,497.8594 683.0313,497.8594 Q683.6563,497.8594 684.25,497.5938 Q684.8438,497.3125 685.4688,496.7344 L685.4688,499.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="227" x="696.5" y="497.9668">helm-source-filtered-bookmarks</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="668.5" x2="925.5" y1="509.8125" y2="509.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="668.5" x2="925.5" y1="517.8125" y2="517.8125"/><!--MD5=[bf73905ec5fe3c8fa1d96a26605c7c43]
+class helm-source-basic-bookmarks--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="48" id="helm-source-basic-bookmarks" style="stroke: #A80036; stroke-width: 1.5;" width="244" x="962" y="477.8125"/><ellipse cx="977" cy="493.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M979.9688,499.4531 Q979.3906,499.75 978.75,499.8906 Q978.1094,500.0469 977.4063,500.0469 Q974.9063,500.0469 973.5781,498.4063 Q972.2656,496.75 972.2656,493.625 Q972.2656,490.5 973.5781,488.8438 Q974.9063,487.1875 977.4063,487.1875 Q978.1094,487.1875 978.75,487.3438 Q979.4063,487.5 979.9688,487.7969 L979.9688,490.5156 Q979.3438,489.9375 978.75,489.6719 Q978.1563,489.3906 977.5313,489.3906 Q976.1875,489.3906 975.5,490.4688 Q974.8125,491.5313 974.8125,493.625 Q974.8125,495.7188 975.5,496.7969 Q976.1875,497.8594 977.5313,497.8594 Q978.1563,497.8594 978.75,497.5938 Q979.3438,497.3125 979.9688,496.7344 L979.9688,499.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="212" x="991" y="497.9668">helm-source-basic-bookmarks</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="963" x2="1205" y1="509.8125" y2="509.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="963" x2="1205" y1="517.8125" y2="517.8125"/><!--MD5=[1d6ee517c209485192c7fd1a0dfbbf09]
+class helm-info-source--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="48" id="helm-info-source" style="stroke: #A80036; stroke-width: 1.5;" width="151" x="1241.5" y="477.8125"/><ellipse cx="1256.5" cy="493.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1259.4688,499.4531 Q1258.8906,499.75 1258.25,499.8906 Q1257.6094,500.0469 1256.9063,500.0469 Q1254.4063,500.0469 1253.0781,498.4063 Q1251.7656,496.75 1251.7656,493.625 Q1251.7656,490.5 1253.0781,488.8438 Q1254.4063,487.1875 1256.9063,487.1875 Q1257.6094,487.1875 1258.25,487.3438 Q1258.9063,487.5 1259.4688,487.7969 L1259.4688,490.5156 Q1258.8438,489.9375 1258.25,489.6719 Q1257.6563,489.3906 1257.0313,489.3906 Q1255.6875,489.3906 1255,490.4688 Q1254.3125,491.5313 1254.3125,493.625 Q1254.3125,495.7188 1255,496.7969 Q1255.6875,497.8594 1257.0313,497.8594 Q1257.6563,497.8594 1258.25,497.5938 Q1258.8438,497.3125 1259.4688,496.7344 L1259.4688,499.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="119" x="1270.5" y="497.9668">helm-info-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1242.5" x2="1391.5" y1="509.8125" y2="509.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1242.5" x2="1391.5" y1="517.8125" y2="517.8125"/><!--MD5=[c55ffa29bbb752794a043d0ccea5fc00]
+class helm-browse-project-source--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="48" id="helm-browse-project-source" style="stroke: #A80036; stroke-width: 1.5;" width="232" x="1428" y="477.8125"/><ellipse cx="1443" cy="493.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1445.9688,499.4531 Q1445.3906,499.75 1444.75,499.8906 Q1444.1094,500.0469 1443.4063,500.0469 Q1440.9063,500.0469 1439.5781,498.4063 Q1438.2656,496.75 1438.2656,493.625 Q1438.2656,490.5 1439.5781,488.8438 Q1440.9063,487.1875 1443.4063,487.1875 Q1444.1094,487.1875 1444.75,487.3438 Q1445.4063,487.5 1445.9688,487.7969 L1445.9688,490.5156 Q1445.3438,489.9375 1444.75,489.6719 Q1444.1563,489.3906 1443.5313,489.3906 Q1442.1875,489.3906 1441.5,490.4688 Q1440.8125,491.5313 1440.8125,493.625 Q1440.8125,495.7188 1441.5,496.7969 Q1442.1875,497.8594 1443.5313,497.8594 Q1444.1563,497.8594 1444.75,497.5938 Q1445.3438,497.3125 1445.9688,496.7344 L1445.9688,499.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="200" x="1457" y="497.9668">helm-browse-project-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1429" x2="1659" y1="509.8125" y2="509.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1429" x2="1659" y1="517.8125" y2="517.8125"/><!--MD5=[073c45925f2697dc8d5dd1a44a8a3365]
+class helm-moccur-class--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="48" id="helm-moccur-class" style="stroke: #A80036; stroke-width: 1.5;" width="162" x="1695" y="477.8125"/><ellipse cx="1710" cy="493.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1712.9688,499.4531 Q1712.3906,499.75 1711.75,499.8906 Q1711.1094,500.0469 1710.4063,500.0469 Q1707.9063,500.0469 1706.5781,498.4063 Q1705.2656,496.75 1705.2656,493.625 Q1705.2656,490.5 1706.5781,488.8438 Q1707.9063,487.1875 1710.4063,487.1875 Q1711.1094,487.1875 1711.75,487.3438 Q1712.4063,487.5 1712.9688,487.7969 L1712.9688,490.5156 Q1712.3438,489.9375 1711.75,489.6719 Q1711.1563,489.3906 1710.5313,489.3906 Q1709.1875,489.3906 1708.5,490.4688 Q1707.8125,491.5313 1707.8125,493.625 Q1707.8125,495.7188 1708.5,496.7969 Q1709.1875,497.8594 1710.5313,497.8594 Q1711.1563,497.8594 1711.75,497.5938 Q1712.3438,497.3125 1712.9688,496.7344 L1712.9688,499.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="130" x="1724" y="497.9668">helm-moccur-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1696" x2="1856" y1="509.8125" y2="509.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1696" x2="1856" y1="517.8125" y2="517.8125"/><!--MD5=[56407064ffc9bf78a0cd848588044ef4]
+class helm-locate-subdirs-source--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="48" id="helm-locate-subdirs-source" style="stroke: #A80036; stroke-width: 1.5;" width="226" x="1892" y="477.8125"/><ellipse cx="1907" cy="493.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1909.9688,499.4531 Q1909.3906,499.75 1908.75,499.8906 Q1908.1094,500.0469 1907.4063,500.0469 Q1904.9063,500.0469 1903.5781,498.4063 Q1902.2656,496.75 1902.2656,493.625 Q1902.2656,490.5 1903.5781,488.8438 Q1904.9063,487.1875 1907.4063,487.1875 Q1908.1094,487.1875 1908.75,487.3438 Q1909.4063,487.5 1909.9688,487.7969 L1909.9688,490.5156 Q1909.3438,489.9375 1908.75,489.6719 Q1908.1563,489.3906 1907.5313,489.3906 Q1906.1875,489.3906 1905.5,490.4688 Q1904.8125,491.5313 1904.8125,493.625 Q1904.8125,495.7188 1905.5,496.7969 Q1906.1875,497.8594 1907.5313,497.8594 Q1908.1563,497.8594 1908.75,497.5938 Q1909.3438,497.3125 1909.9688,496.7344 L1909.9688,499.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="194" x="1921" y="497.9668">helm-locate-subdirs-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1893" x2="2117" y1="509.8125" y2="509.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1893" x2="2117" y1="517.8125" y2="517.8125"/><!--MD5=[2a25ce0fce2e5578c6c8a1e5bf210dba]
+class helm-source-in-file--><rect fill="#FEFECE" filter="url(#f570iog4gags3)" height="48" id="helm-source-in-file" style="stroke: #A80036; stroke-width: 1.5;" width="164" x="2153" y="477.8125"/><ellipse cx="2168" cy="493.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2170.9688,499.4531 Q2170.3906,499.75 2169.75,499.8906 Q2169.1094,500.0469 2168.4063,500.0469 Q2165.9063,500.0469 2164.5781,498.4063 Q2163.2656,496.75 2163.2656,493.625 Q2163.2656,490.5 2164.5781,488.8438 Q2165.9063,487.1875 2168.4063,487.1875 Q2169.1094,487.1875 2169.75,487.3438 Q2170.4063,487.5 2170.9688,487.7969 L2170.9688,490.5156 Q2170.3438,489.9375 2169.75,489.6719 Q2169.1563,489.3906 2168.5313,489.3906 Q2167.1875,489.3906 2166.5,490.4688 Q2165.8125,491.5313 2165.8125,493.625 Q2165.8125,495.7188 2166.5,496.7969 Q2167.1875,497.8594 2168.5313,497.8594 Q2169.1563,497.8594 2169.75,497.5938 Q2170.3438,497.3125 2170.9688,496.7344 L2170.9688,499.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="132" x="2182" y="497.9668">helm-source-in-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2154" x2="2316" y1="509.8125" y2="509.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2154" x2="2316" y1="517.8125" y2="517.8125"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M1200,160.0425 C1200,172.0425 1200,185.6225 1200,199.5725 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1193,159.8525,1200,139.8525,1207,159.8525,1193,159.8525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[1ab4d17da5132a1e0f1c08a6c1bf0b9d]
+reverse link helm-source-in-buffer to helm-semantic-source--><path d="M1087.35,327.6825 C903.7,357.1125 528.47,418.4325 212,477.8125 C206.15,478.9125 200.13,480.0625 194.06,481.2525 " fill="none" id="helm-source-in-buffer&lt;-helm-semantic-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1086.33,320.7625,1107.19,324.5125,1088.54,334.5825,1086.33,320.7625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[c3c98643be5ce25a89a8fc176b95e73f]
+reverse link helm-source-in-buffer to helm-file-cache--><path d="M1087.58,330.9925 C930.14,361.1025 635.29,419.1825 386,477.8125 C380.37,479.1325 374.56,480.5525 368.72,482.0225 " fill="none" id="helm-source-in-buffer&lt;-helm-file-cache" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1086.51,324.0625,1107.47,327.1925,1089.14,337.8125,1086.51,324.0625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[5553b9a1bd6fa98417769ef19c0d46a1]
+reverse link helm-source-in-buffer to helm-list-el-package-source--><path d="M1087.78,341.2425 C950.73,379.6225 722.16,443.6325 600.34,477.7525 " fill="none" id="helm-source-in-buffer&lt;-helm-list-el-package-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1086.17,334.4225,1107.31,335.7725,1089.94,347.9025,1086.17,334.4225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[38d3222c9d6413d0e8be51642b02db5a]
+reverse link helm-source-in-buffer to helm-source-filtered-bookmarks--><path d="M1089.1,362.3725 C1009.28,400.2025 905.49,449.3925 845.55,477.8025 " fill="none" id="helm-source-in-buffer&lt;-helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1086.22,355.9925,1107.29,353.7525,1092.22,368.6425,1086.22,355.9925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[560569eff9650cc936c24e2acd6b7c35]
+reverse link helm-source-in-buffer to helm-source-basic-bookmarks--><path d="M1123.92,435.0825 C1114.1,451.2525 1105.05,466.1525 1098.06,477.6725 " fill="none" id="helm-source-in-buffer&lt;-helm-source-basic-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1118.01,431.3325,1134.37,417.8725,1129.97,438.6025,1118.01,431.3325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[c6f34f9bfe3eab31f5a0ea3dc389c5d2]
+reverse link helm-source-in-buffer to helm-info-source--><path d="M1276.74,435.0825 C1286.64,451.2525 1295.77,466.1525 1302.82,477.6725 " fill="none" id="helm-source-in-buffer&lt;-helm-info-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1270.67,438.5825,1266.19,417.8725,1282.61,431.2725,1270.67,438.5825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[bab36c04217b3237bb981b2ca6f1bcf5]
+reverse link helm-source-in-buffer to helm-browse-project-source--><path d="M1309.17,417.2925 C1309.45,417.4625 1309.72,417.6425 1310,417.8125 C1352.95,444.6525 1405.77,464.3425 1450.35,477.7825 " fill="none" id="helm-source-in-buffer&lt;-helm-browse-project-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1304.99,422.9125,1292.54,405.7625,1312.96,411.4025,1304.99,422.9125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[30ea2babd0fb514dd636adcbe39865ef]
+reverse link helm-source-in-buffer to helm-moccur-class--><path d="M1310.76,416.6825 C1462.25,489.3125 1521.49,446.7225 1678,477.8125 C1683.49,478.9025 1689.13,480.0825 1694.81,481.3025 " fill="none" id="helm-source-in-buffer&lt;-helm-moccur-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1307.61,422.9425,1292.82,407.7625,1313.85,410.4025,1307.61,422.9425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[e807cc974173119fa99446f26fc88bc8]
+reverse link helm-source-in-buffer to helm-locate-subdirs-source--><path d="M1311.04,416.7325 C1542.86,521.4525 1631.31,443.3625 1875,477.8125 C1880.56,478.6025 1886.25,479.4425 1891.98,480.3325 " fill="none" id="helm-source-in-buffer&lt;-helm-locate-subdirs-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1307.81,422.9525,1292.62,408.1725,1313.71,410.2525,1307.81,422.9525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[573dc56a4a24525e354df005e91e161f]
+reverse link helm-source-in-buffer to helm-source-in-file--><path d="M1311.01,416.1425 C1507.65,490.9125 1959.81,451.1125 2136,477.8125 C2141.5,478.6425 2147.14,479.6225 2152.81,480.6925 " fill="none" id="helm-source-in-buffer&lt;-helm-source-in-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1308.27,422.5825,1292.51,408.4125,1313.66,409.6625,1308.27,422.5825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ff26ec0166c5f2718acbee039c8cc2e1]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-in-buffer'**\n\n
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-source-in-buffer" {
+ Use this source to make helm
+ sources storing candidates
+ inside a buffer.
+ ==
+ __ some interesting slots __
+ init
+ candidates
+ data
+ get-line
+ match
+ migemo
+ search
+ search-strict
+ volatile
+}
+note right of "helm-source-in-buffer"
+ **helm-source-in-buffer**:
+ Use this source to make helm
+ sources storing candidates
+ inside a buffer.
+end note
+"helm-source-in-buffer" <|- - "helm-semantic-source"
+"helm-source-in-buffer" <|- - "helm-file-cache"
+"helm-source-in-buffer" <|- - "helm-list-el-package-source"
+"helm-source-in-buffer" <|- - "helm-source-filtered-bookmarks"
+"helm-source-in-buffer" <|- - "helm-source-basic-bookmarks"
+"helm-source-in-buffer" <|- - "helm-info-source"
+"helm-source-in-buffer" <|- - "helm-browse-project-source"
+"helm-source-in-buffer" <|- - "helm-moccur-class"
+"helm-source-in-buffer" <|- - "helm-locate-subdirs-source"
+"helm-source-in-buffer" <|- - "helm-source-in-file"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-source-in-file.png b/doc/helm-figures/helm-source-in-file.png
new file mode 100644
index 00000000..72434c06
--- /dev/null
+++ b/doc/helm-figures/helm-source-in-file.png
Binary files differ
diff --git a/doc/helm-figures/helm-source-in-file.svg b/doc/helm-figures/helm-source-in-file.svg
new file mode 100644
index 00000000..fd3c232d
--- /dev/null
+++ b/doc/helm-figures/helm-source-in-file.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="460px" preserveAspectRatio="none" style="width:424px;height:460px;" version="1.1" viewBox="0 0 424 460" width="424px" zoomAndPan="magnify"><defs><filter height="300%" id="f5kzyhvfe01ya" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="95.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="201" x="115" y="37.6611">'helm-source-in-file'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="218.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="218.5" y="79.5674"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#f5kzyhvfe01ya)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="35" y="219.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="190" y1="239.8125" y2="239.8125"/><!--MD5=[2a25ce0fce2e5578c6c8a1e5bf210dba]
+class helm-source-in-file--><rect fill="#FEFECE" filter="url(#f5kzyhvfe01ya)" height="141.6328" id="helm-source-in-file" style="stroke: #A80036; stroke-width: 1.5;" width="166" x="15.5" y="307.8125"/><ellipse cx="31.4" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M34.3688,329.4531 Q33.7906,329.75 33.15,329.8906 Q32.5094,330.0469 31.8063,330.0469 Q29.3063,330.0469 27.9781,328.4063 Q26.6656,326.75 26.6656,323.625 Q26.6656,320.5 27.9781,318.8438 Q29.3063,317.1875 31.8063,317.1875 Q32.5094,317.1875 33.15,317.3438 Q33.8063,317.5 34.3688,317.7969 L34.3688,320.5156 Q33.7438,319.9375 33.15,319.6719 Q32.5563,319.3906 31.9313,319.3906 Q30.5875,319.3906 29.9,320.4688 Q29.2125,321.5313 29.2125,323.625 Q29.2125,325.7188 29.9,326.7969 Q30.5875,327.8594 31.9313,327.8594 Q32.5563,327.8594 33.15,327.5938 Q33.7438,327.3125 34.3688,326.7344 L34.3688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="132" x="45.6" y="327.9668">helm-source-in-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="16.5" x2="180.5" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="154" x="21.5" y="354.0229">The contents of the FILE will</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="140" x="21.5" y="366.8276">be used as candidates in</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="38" x="21.5" y="379.6323">buffer.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="16.5" x2="180.5" y1="386.2266" y2="386.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="16.5" x2="180.5" y1="388.2266" y2="388.2266"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="21.5" y="417.2417">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="83" x="21.5" y="430.0464">candidates-file</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="42" x="21.5" y="442.8511">get-line</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="16.5" x2="35" y1="400.6289" y2="400.6289"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="35" y="403.937">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="162" x2="180.5" y1="400.6289" y2="400.6289"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f5kzyhvfe01ya)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="39" y="91.8125"/><ellipse cx="54" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.9688,113.4531 Q56.3906,113.75 55.75,113.8906 Q55.1094,114.0469 54.4063,114.0469 Q51.9063,114.0469 50.5781,112.4063 Q49.2656,110.75 49.2656,107.625 Q49.2656,104.5 50.5781,102.8438 Q51.9063,101.1875 54.4063,101.1875 Q55.1094,101.1875 55.75,101.3438 Q56.4063,101.5 56.9688,101.7969 L56.9688,104.5156 Q56.3438,103.9375 55.75,103.6719 Q55.1563,103.3906 54.5313,103.3906 Q53.1875,103.3906 52.5,104.4688 Q51.8125,105.5313 51.8125,107.625 Q51.8125,109.7188 52.5,110.7969 Q53.1875,111.8594 54.5313,111.8594 Q55.1563,111.8594 55.75,111.5938 Q56.3438,111.3125 56.9688,110.7344 L56.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="68" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="40" x2="157" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="40" x2="157" y1="131.8125" y2="131.8125"/><path d="M216.5,343.3125 L216.5,374.8125 L181.61,378.8125 L216.5,382.8125 L216.5,413.8438 A0,0 0 0 0 216.5,413.8438 L412.5,413.8438 A0,0 0 0 0 412.5,413.8438 L412.5,353.3125 L402.5,343.3125 L216.5,343.3125 A0,0 0 0 0 216.5,343.3125 " fill="#FBFB77" filter="url(#f5kzyhvfe01ya)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M402.5,343.3125 L402.5,353.3125 L412.5,353.3125 L402.5,343.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="136" x="222.5" y="360.3794">helm-source-in-file</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="358.5" y="360.3794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="175" x="222.5" y="375.5122">The contents of the FILE will</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="159" x="222.5" y="390.645">be used as candidates in</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="41" x="222.5" y="405.7778">buffer.</text><!--MD5=[573dc56a4a24525e354df005e91e161f]
+reverse link helm-source-in-buffer to helm-source-in-file--><path d="M98.5,268.2425 C98.5,280.5125 98.5,294.1725 98.5,307.5825 " fill="none" id="helm-source-in-buffer&lt;-helm-source-in-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91.5,268.0525,98.5,248.0525,105.5,268.0525,91.5,268.0525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M98.5,159.8325 C98.5,173.3925 98.5,187.8525 98.5,199.4925 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="91.5,159.8125,98.5,139.8125,105.5,159.8125,91.5,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[620af61ea4ca849a950d734ba6494c42]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-in-file'**\n\n
+"helm-source-in-buffer" <|- - "helm-source-in-file"
+class "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-in-buffer"
+class "helm-source"
+class "helm-source-in-file" {
+ The contents of the FILE will
+ be used as candidates in
+ buffer.
+ ==
+ __ some interesting slots __
+ init
+ candidates-file
+ get-line
+}
+note right of "helm-source-in-file"
+ **helm-source-in-file**:
+ The contents of the FILE will
+ be used as candidates in
+ buffer.
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-source-session-class.png b/doc/helm-figures/helm-source-session-class.png
new file mode 100644
index 00000000..72a7a99f
--- /dev/null
+++ b/doc/helm-figures/helm-source-session-class.png
Binary files differ
diff --git a/doc/helm-figures/helm-source-session-class.svg b/doc/helm-figures/helm-source-session-class.svg
new file mode 100644
index 00000000..792a4bf9
--- /dev/null
+++ b/doc/helm-figures/helm-source-session-class.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="426px" preserveAspectRatio="none" style="width:486px;height:426px;" version="1.1" viewBox="0 0 486 426" width="486px" zoomAndPan="magnify"><defs><filter height="300%" id="f1el3d0bmhyfr0" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="126.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="277" x="108" y="37.6611">'helm-source-session-class'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="249.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="249.5" y="79.5674"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#f1el3d0bmhyfr0)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="38" y="199.8125"/><ellipse cx="53" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M55.9688,221.4531 Q55.3906,221.75 54.75,221.8906 Q54.1094,222.0469 53.4063,222.0469 Q50.9063,222.0469 49.5781,220.4063 Q48.2656,218.75 48.2656,215.625 Q48.2656,212.5 49.5781,210.8438 Q50.9063,209.1875 53.4063,209.1875 Q54.1094,209.1875 54.75,209.3438 Q55.4063,209.5 55.9688,209.7969 L55.9688,212.5156 Q55.3438,211.9375 54.75,211.6719 Q54.1563,211.3906 53.5313,211.3906 Q52.1875,211.3906 51.5,212.4688 Q50.8125,213.5313 50.8125,215.625 Q50.8125,217.7188 51.5,218.7969 Q52.1875,219.8594 53.5313,219.8594 Q54.1563,219.8594 54.75,219.5938 Q55.3438,219.3125 55.9688,218.7344 L55.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="67" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="39" x2="193" y1="231.8125" y2="231.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="39" x2="193" y1="239.8125" y2="239.8125"/><!--MD5=[47156fd6f6930ad01ab8c92c260b1066]
+class helm-source-session-class--><rect fill="#FEFECE" filter="url(#f1el3d0bmhyfr0)" height="108.0234" id="helm-source-session-class" style="stroke: #A80036; stroke-width: 1.5;" width="220" x="6" y="307.8125"/><ellipse cx="21" cy="323.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,329.4531 Q23.3906,329.75 22.75,329.8906 Q22.1094,330.0469 21.4063,330.0469 Q18.9063,330.0469 17.5781,328.4063 Q16.2656,326.75 16.2656,323.625 Q16.2656,320.5 17.5781,318.8438 Q18.9063,317.1875 21.4063,317.1875 Q22.1094,317.1875 22.75,317.3438 Q23.4063,317.5 23.9688,317.7969 L23.9688,320.5156 Q23.3438,319.9375 22.75,319.6719 Q22.1563,319.3906 21.5313,319.3906 Q20.1875,319.3906 19.5,320.4688 Q18.8125,321.5313 18.8125,323.625 Q18.8125,325.7188 19.5,326.7969 Q20.1875,327.8594 21.5313,327.8594 Q22.1563,327.8594 22.75,327.5938 Q23.3438,327.3125 23.9688,326.7344 L23.9688,329.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="188" x="35" y="327.9668">helm-source-session-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="225" y1="339.8125" y2="339.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="12" y="370.8276">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="12" y="383.6323">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="12" y="396.437">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="12" y="409.2417">keymap</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="52.5" y1="354.2148" y2="354.2148"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="52.5" y="357.5229">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="179.5" x2="225" y1="354.2148" y2="354.2148"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1el3d0bmhyfr0)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="56.5" y="91.8125"/><ellipse cx="71.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M74.4688,113.4531 Q73.8906,113.75 73.25,113.8906 Q72.6094,114.0469 71.9063,114.0469 Q69.4063,114.0469 68.0781,112.4063 Q66.7656,110.75 66.7656,107.625 Q66.7656,104.5 68.0781,102.8438 Q69.4063,101.1875 71.9063,101.1875 Q72.6094,101.1875 73.25,101.3438 Q73.9063,101.5 74.4688,101.7969 L74.4688,104.5156 Q73.8438,103.9375 73.25,103.6719 Q72.6563,103.3906 72.0313,103.3906 Q70.6875,103.3906 70,104.4688 Q69.3125,105.5313 69.3125,107.625 Q69.3125,109.7188 70,110.7969 Q70.6875,111.8594 72.0313,111.8594 Q72.6563,111.8594 73.25,111.5938 Q73.8438,111.3125 74.4688,110.7344 L74.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="85.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="57.5" x2="174.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="57.5" x2="174.5" y1="131.8125" y2="131.8125"/><path d="M261.5,349.3125 L261.5,357.8125 L226.25,361.8125 L261.5,365.8125 L261.5,374.4453 A0,0 0 0 0 261.5,374.4453 L474.5,374.4453 A0,0 0 0 0 474.5,374.4453 L474.5,359.3125 L464.5,349.3125 L261.5,349.3125 A0,0 0 0 0 261.5,349.3125 " fill="#FBFB77" filter="url(#f1el3d0bmhyfr0)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M464.5,349.3125 L464.5,359.3125 L474.5,359.3125 L464.5,349.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="192" x="267.5" y="366.3794">helm-source-session-class</text><!--MD5=[52d97fd4d153f2c53b55b3f398cc83b3]
+reverse link helm-source-sync to helm-source-session-class--><path d="M116,268.0525 C116,280.6325 116,294.5225 116,307.6325 " fill="none" id="helm-source-sync&lt;-helm-source-session-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="109,267.8825,116,247.8825,123,267.8825,109,267.8825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M116,159.8325 C116,173.3925 116,187.8525 116,199.4925 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="109,159.8125,116,139.8125,123,159.8125,109,159.8125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[94019577c49d9fd63ba82dd181fa04ee]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-session-class'**\n\n
+"helm-source-sync" <|- - "helm-source-session-class"
+class "helm-source-sync"
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-source-session-class" {
+ __ some interesting slots __
+ action
+ candidates
+ help-message
+ keymap
+}
+note right of "helm-source-session-class"
+ **helm-source-session-class**
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-source-sync.png b/doc/helm-figures/helm-source-sync.png
new file mode 100644
index 00000000..243d7322
--- /dev/null
+++ b/doc/helm-figures/helm-source-sync.png
Binary files differ
diff --git a/doc/helm-figures/helm-source-sync.svg b/doc/helm-figures/helm-source-sync.svg
new file mode 100644
index 00000000..6b55b766
--- /dev/null
+++ b/doc/helm-figures/helm-source-sync.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="472px" preserveAspectRatio="none" style="width:2874px;height:472px;" version="1.1" viewBox="0 0 2874 472" width="2874px" zoomAndPan="magnify"><defs><filter height="300%" id="fr2saz3zqti4l" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="1321" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="190" x="1346" y="37.6611">'helm-source-sync'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="1444" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="1444" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="1465.5" y="91.8125"/><ellipse cx="1480.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1483.4688,113.4531 Q1482.8906,113.75 1482.25,113.8906 Q1481.6094,114.0469 1480.9063,114.0469 Q1478.4063,114.0469 1477.0781,112.4063 Q1475.7656,110.75 1475.7656,107.625 Q1475.7656,104.5 1477.0781,102.8438 Q1478.4063,101.1875 1480.9063,101.1875 Q1481.6094,101.1875 1482.25,101.3438 Q1482.9063,101.5 1483.4688,101.7969 L1483.4688,104.5156 Q1482.8438,103.9375 1482.25,103.6719 Q1481.6563,103.3906 1481.0313,103.3906 Q1479.6875,103.3906 1479,104.4688 Q1478.3125,105.5313 1478.3125,107.625 Q1478.3125,109.7188 1479,110.7969 Q1479.6875,111.8594 1481.0313,111.8594 Q1481.6563,111.8594 1482.25,111.5938 Q1482.8438,111.3125 1483.4688,110.7344 L1483.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="1494.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1466.5" x2="1583.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1466.5" x2="1583.5" y1="131.8125" y2="131.8125"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="154.4375" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="170" x="1440" y="199.8125"/><ellipse cx="1461.3" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1464.2688,221.4531 Q1463.6906,221.75 1463.05,221.8906 Q1462.4094,222.0469 1461.7063,222.0469 Q1459.2063,222.0469 1457.8781,220.4063 Q1456.5656,218.75 1456.5656,215.625 Q1456.5656,212.5 1457.8781,210.8438 Q1459.2063,209.1875 1461.7063,209.1875 Q1462.4094,209.1875 1463.05,209.3438 Q1463.7063,209.5 1464.2688,209.7969 L1464.2688,212.5156 Q1463.6438,211.9375 1463.05,211.6719 Q1462.4563,211.3906 1461.8313,211.3906 Q1460.4875,211.3906 1459.8,212.4688 Q1459.1125,213.5313 1459.1125,215.625 Q1459.1125,217.7188 1459.8,218.7969 Q1460.4875,219.8594 1461.8313,219.8594 Q1462.4563,219.8594 1463.05,219.5938 Q1463.6438,219.3125 1464.2688,218.7344 L1464.2688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="1476.7" y="219.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1441" x2="1609" y1="231.8125" y2="231.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="158" x="1446" y="246.0229">Use this class to make helm</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="124" x="1446" y="258.8276">sources using a list of</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="1446" y="271.6323">candidates.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="1441" x2="1609" y1="278.2266" y2="278.2266"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1441" x2="1609" y1="280.2266" y2="280.2266"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="1446" y="309.2417">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="1446" y="322.0464">match-dynamic</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="1446" y="334.8511">match-strict</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="46" x="1446" y="347.6558">migemo</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1441" x2="1461.5" y1="292.6289" y2="292.6289"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="1461.5" y="295.937">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1588.5" x2="1609" y1="292.6289" y2="292.6289"/><path d="M1645,241.3125 L1645,272.8125 L1610.03,276.8125 L1645,280.8125 L1645,311.8438 A0,0 0 0 0 1645,311.8438 L1847,311.8438 A0,0 0 0 0 1847,311.8438 L1847,251.3125 L1837,241.3125 L1645,241.3125 A0,0 0 0 0 1645,241.3125 " fill="#FBFB77" filter="url(#fr2saz3zqti4l)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1837,241.3125 L1837,251.3125 L1847,251.3125 L1837,241.3125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="128" x="1651" y="258.3794">helm-source-sync</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="1779" y="258.3794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="181" x="1651" y="273.5122">Use this class to make helm</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="138" x="1651" y="288.645">sources using a list of</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="74" x="1651" y="303.7778">candidates.</text><!--MD5=[47156fd6f6930ad01ab8c92c260b1066]
+class helm-source-session-class--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-source-session-class" style="stroke: #A80036; stroke-width: 1.5;" width="220" x="6" y="413.8125"/><ellipse cx="21" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,435.4531 Q23.3906,435.75 22.75,435.8906 Q22.1094,436.0469 21.4063,436.0469 Q18.9063,436.0469 17.5781,434.4063 Q16.2656,432.75 16.2656,429.625 Q16.2656,426.5 17.5781,424.8438 Q18.9063,423.1875 21.4063,423.1875 Q22.1094,423.1875 22.75,423.3438 Q23.4063,423.5 23.9688,423.7969 L23.9688,426.5156 Q23.3438,425.9375 22.75,425.6719 Q22.1563,425.3906 21.5313,425.3906 Q20.1875,425.3906 19.5,426.4688 Q18.8125,427.5313 18.8125,429.625 Q18.8125,431.7188 19.5,432.7969 Q20.1875,433.8594 21.5313,433.8594 Q22.1563,433.8594 22.75,433.5938 Q23.3438,433.3125 23.9688,432.7344 L23.9688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="188" x="35" y="433.9668">helm-source-session-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="225" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="225" y1="453.8125" y2="453.8125"/><!--MD5=[9c6bffcc58873ff705394a767f912448]
+class helm-files-dired-source--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-files-dired-source" style="stroke: #A80036; stroke-width: 1.5;" width="196" x="261" y="413.8125"/><ellipse cx="276" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M278.9688,435.4531 Q278.3906,435.75 277.75,435.8906 Q277.1094,436.0469 276.4063,436.0469 Q273.9063,436.0469 272.5781,434.4063 Q271.2656,432.75 271.2656,429.625 Q271.2656,426.5 272.5781,424.8438 Q273.9063,423.1875 276.4063,423.1875 Q277.1094,423.1875 277.75,423.3438 Q278.4063,423.5 278.9688,423.7969 L278.9688,426.5156 Q278.3438,425.9375 277.75,425.6719 Q277.1563,425.3906 276.5313,425.3906 Q275.1875,425.3906 274.5,426.4688 Q273.8125,427.5313 273.8125,429.625 Q273.8125,431.7188 274.5,432.7969 Q275.1875,433.8594 276.5313,433.8594 Q277.1563,433.8594 277.75,433.5938 Q278.3438,433.3125 278.9688,432.7344 L278.9688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="164" x="290" y="433.9668">helm-files-dired-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="262" x2="456" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="262" x2="456" y1="453.8125" y2="453.8125"/><!--MD5=[a7554553637232b99c06721dc00b929c]
+class helm-imenu-source--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-imenu-source" style="stroke: #A80036; stroke-width: 1.5;" width="167" x="492.5" y="413.8125"/><ellipse cx="507.5" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M510.4688,435.4531 Q509.8906,435.75 509.25,435.8906 Q508.6094,436.0469 507.9063,436.0469 Q505.4063,436.0469 504.0781,434.4063 Q502.7656,432.75 502.7656,429.625 Q502.7656,426.5 504.0781,424.8438 Q505.4063,423.1875 507.9063,423.1875 Q508.6094,423.1875 509.25,423.3438 Q509.9063,423.5 510.4688,423.7969 L510.4688,426.5156 Q509.8438,425.9375 509.25,425.6719 Q508.6563,425.3906 508.0313,425.3906 Q506.6875,425.3906 506,426.4688 Q505.3125,427.5313 505.3125,429.625 Q505.3125,431.7188 506,432.7969 Q506.6875,433.8594 508.0313,433.8594 Q508.6563,433.8594 509.25,433.5938 Q509.8438,433.3125 510.4688,432.7344 L510.4688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="135" x="521.5" y="433.9668">helm-imenu-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="493.5" x2="658.5" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="493.5" x2="658.5" y1="453.8125" y2="453.8125"/><!--MD5=[b49d18483e901ae1bf6135ad896f4fad]
+class helm-files-in-current-dir-source--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-files-in-current-dir-source" style="stroke: #A80036; stroke-width: 1.5;" width="253" x="694.5" y="413.8125"/><ellipse cx="709.5" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M712.4688,435.4531 Q711.8906,435.75 711.25,435.8906 Q710.6094,436.0469 709.9063,436.0469 Q707.4063,436.0469 706.0781,434.4063 Q704.7656,432.75 704.7656,429.625 Q704.7656,426.5 706.0781,424.8438 Q707.4063,423.1875 709.9063,423.1875 Q710.6094,423.1875 711.25,423.3438 Q711.9063,423.5 712.4688,423.7969 L712.4688,426.5156 Q711.8438,425.9375 711.25,425.6719 Q710.6563,425.3906 710.0313,425.3906 Q708.6875,425.3906 708,426.4688 Q707.3125,427.5313 707.3125,429.625 Q707.3125,431.7188 708,432.7969 Q708.6875,433.8594 710.0313,433.8594 Q710.6563,433.8594 711.25,433.5938 Q711.8438,433.3125 712.4688,432.7344 L712.4688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="221" x="723.5" y="433.9668">helm-files-in-current-dir-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="695.5" x2="946.5" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="695.5" x2="946.5" y1="453.8125" y2="453.8125"/><!--MD5=[f9787a7e913788f0fbbca93390d6041a]
+class helm-recentf-source--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-recentf-source" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="982.5" y="413.8125"/><ellipse cx="997.5" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1000.4688,435.4531 Q999.8906,435.75 999.25,435.8906 Q998.6094,436.0469 997.9063,436.0469 Q995.4063,436.0469 994.0781,434.4063 Q992.7656,432.75 992.7656,429.625 Q992.7656,426.5 994.0781,424.8438 Q995.4063,423.1875 997.9063,423.1875 Q998.6094,423.1875 999.25,423.3438 Q999.9063,423.5 1000.4688,423.7969 L1000.4688,426.5156 Q999.8438,425.9375 999.25,425.6719 Q998.6563,425.3906 998.0313,425.3906 Q996.6875,425.3906 996,426.4688 Q995.3125,427.5313 995.3125,429.625 Q995.3125,431.7188 996,432.7969 Q996.6875,433.8594 998.0313,433.8594 Q998.6563,433.8594 999.25,433.5938 Q999.8438,433.3125 1000.4688,432.7344 L1000.4688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="1011.5" y="433.9668">helm-recentf-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="983.5" x2="1156.5" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="983.5" x2="1156.5" y1="453.8125" y2="453.8125"/><!--MD5=[282aa25f9d306cf00c48aa2e4e60e732]
+class helm-eshell-history-source--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-eshell-history-source" style="stroke: #A80036; stroke-width: 1.5;" width="222" x="1193" y="413.8125"/><ellipse cx="1208" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1210.9688,435.4531 Q1210.3906,435.75 1209.75,435.8906 Q1209.1094,436.0469 1208.4063,436.0469 Q1205.9063,436.0469 1204.5781,434.4063 Q1203.2656,432.75 1203.2656,429.625 Q1203.2656,426.5 1204.5781,424.8438 Q1205.9063,423.1875 1208.4063,423.1875 Q1209.1094,423.1875 1209.75,423.3438 Q1210.4063,423.5 1210.9688,423.7969 L1210.9688,426.5156 Q1210.3438,425.9375 1209.75,425.6719 Q1209.1563,425.3906 1208.5313,425.3906 Q1207.1875,425.3906 1206.5,426.4688 Q1205.8125,427.5313 1205.8125,429.625 Q1205.8125,431.7188 1206.5,432.7969 Q1207.1875,433.8594 1208.5313,433.8594 Q1209.1563,433.8594 1209.75,433.5938 Q1210.3438,433.3125 1210.9688,432.7344 L1210.9688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="190" x="1222" y="433.9668">helm-eshell-history-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1194" x2="1414" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1194" x2="1414" y1="453.8125" y2="453.8125"/><!--MD5=[3960967beb69c61591e67bd0b8c5ae1c]
+class helm-esh-source--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-esh-source" style="stroke: #A80036; stroke-width: 1.5;" width="150" x="1450" y="413.8125"/><ellipse cx="1465" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1467.9688,435.4531 Q1467.3906,435.75 1466.75,435.8906 Q1466.1094,436.0469 1465.4063,436.0469 Q1462.9063,436.0469 1461.5781,434.4063 Q1460.2656,432.75 1460.2656,429.625 Q1460.2656,426.5 1461.5781,424.8438 Q1462.9063,423.1875 1465.4063,423.1875 Q1466.1094,423.1875 1466.75,423.3438 Q1467.4063,423.5 1467.9688,423.7969 L1467.9688,426.5156 Q1467.3438,425.9375 1466.75,425.6719 Q1466.1563,425.3906 1465.5313,425.3906 Q1464.1875,425.3906 1463.5,426.4688 Q1462.8125,427.5313 1462.8125,429.625 Q1462.8125,431.7188 1463.5,432.7969 Q1464.1875,433.8594 1465.5313,433.8594 Q1466.1563,433.8594 1466.75,433.5938 Q1467.3438,433.3125 1467.9688,432.7344 L1467.9688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="118" x="1479" y="433.9668">helm-esh-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1451" x2="1599" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1451" x2="1599" y1="453.8125" y2="453.8125"/><!--MD5=[75687e4369f49c6cba1a6ff12ff0e7fa]
+class helm-epa--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-epa" style="stroke: #A80036; stroke-width: 1.5;" width="98" x="1635" y="413.8125"/><ellipse cx="1650" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1652.9688,435.4531 Q1652.3906,435.75 1651.75,435.8906 Q1651.1094,436.0469 1650.4063,436.0469 Q1647.9063,436.0469 1646.5781,434.4063 Q1645.2656,432.75 1645.2656,429.625 Q1645.2656,426.5 1646.5781,424.8438 Q1647.9063,423.1875 1650.4063,423.1875 Q1651.1094,423.1875 1651.75,423.3438 Q1652.4063,423.5 1652.9688,423.7969 L1652.9688,426.5156 Q1652.3438,425.9375 1651.75,425.6719 Q1651.1563,425.3906 1650.5313,425.3906 Q1649.1875,425.3906 1648.5,426.4688 Q1647.8125,427.5313 1647.8125,429.625 Q1647.8125,431.7188 1648.5,432.7969 Q1649.1875,433.8594 1650.5313,433.8594 Q1651.1563,433.8594 1651.75,433.5938 Q1652.3438,433.3125 1652.9688,432.7344 L1652.9688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="66" x="1664" y="433.9668">helm-epa</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1636" x2="1732" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1636" x2="1732" y1="453.8125" y2="453.8125"/><!--MD5=[9bb915cdd04b5f6bf4c2c1633cbdfbdc]
+class helm-M-x-class--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-M-x-class" style="stroke: #A80036; stroke-width: 1.5;" width="136" x="1768" y="413.8125"/><ellipse cx="1783" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1785.9688,435.4531 Q1785.3906,435.75 1784.75,435.8906 Q1784.1094,436.0469 1783.4063,436.0469 Q1780.9063,436.0469 1779.5781,434.4063 Q1778.2656,432.75 1778.2656,429.625 Q1778.2656,426.5 1779.5781,424.8438 Q1780.9063,423.1875 1783.4063,423.1875 Q1784.1094,423.1875 1784.75,423.3438 Q1785.4063,423.5 1785.9688,423.7969 L1785.9688,426.5156 Q1785.3438,425.9375 1784.75,425.6719 Q1784.1563,425.3906 1783.5313,425.3906 Q1782.1875,425.3906 1781.5,426.4688 Q1780.8125,427.5313 1780.8125,429.625 Q1780.8125,431.7188 1781.5,432.7969 Q1782.1875,433.8594 1783.5313,433.8594 Q1784.1563,433.8594 1784.75,433.5938 Q1785.3438,433.3125 1785.9688,432.7344 L1785.9688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="104" x="1797" y="433.9668">helm-M-x-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1769" x2="1903" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1769" x2="1903" y1="453.8125" y2="453.8125"/><!--MD5=[65c9e2a5e033ac2de329b35010304c74]
+class helm-idle-time-timers-class--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-idle-time-timers-class" style="stroke: #A80036; stroke-width: 1.5;" width="224" x="1939" y="413.8125"/><ellipse cx="1954" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1956.9688,435.4531 Q1956.3906,435.75 1955.75,435.8906 Q1955.1094,436.0469 1954.4063,436.0469 Q1951.9063,436.0469 1950.5781,434.4063 Q1949.2656,432.75 1949.2656,429.625 Q1949.2656,426.5 1950.5781,424.8438 Q1951.9063,423.1875 1954.4063,423.1875 Q1955.1094,423.1875 1955.75,423.3438 Q1956.4063,423.5 1956.9688,423.7969 L1956.9688,426.5156 Q1956.3438,425.9375 1955.75,425.6719 Q1955.1563,425.3906 1954.5313,425.3906 Q1953.1875,425.3906 1952.5,426.4688 Q1951.8125,427.5313 1951.8125,429.625 Q1951.8125,431.7188 1952.5,432.7969 Q1953.1875,433.8594 1954.5313,433.8594 Q1955.1563,433.8594 1955.75,433.5938 Q1956.3438,433.3125 1956.9688,432.7344 L1956.9688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="192" x="1968" y="433.9668">helm-idle-time-timers-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1940" x2="2162" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1940" x2="2162" y1="453.8125" y2="453.8125"/><!--MD5=[b0e60113aba2bebbe59d6cbba30a4a7f]
+class helm-absolute-time-timers-class--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-absolute-time-timers-class" style="stroke: #A80036; stroke-width: 1.5;" width="261" x="2198.5" y="413.8125"/><ellipse cx="2213.5" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2216.4688,435.4531 Q2215.8906,435.75 2215.25,435.8906 Q2214.6094,436.0469 2213.9063,436.0469 Q2211.4063,436.0469 2210.0781,434.4063 Q2208.7656,432.75 2208.7656,429.625 Q2208.7656,426.5 2210.0781,424.8438 Q2211.4063,423.1875 2213.9063,423.1875 Q2214.6094,423.1875 2215.25,423.3438 Q2215.9063,423.5 2216.4688,423.7969 L2216.4688,426.5156 Q2215.8438,425.9375 2215.25,425.6719 Q2214.6563,425.3906 2214.0313,425.3906 Q2212.6875,425.3906 2212,426.4688 Q2211.3125,427.5313 2211.3125,429.625 Q2211.3125,431.7188 2212,432.7969 Q2212.6875,433.8594 2214.0313,433.8594 Q2214.6563,433.8594 2215.25,433.5938 Q2215.8438,433.3125 2216.4688,432.7344 L2216.4688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="229" x="2227.5" y="433.9668">helm-absolute-time-timers-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2199.5" x2="2458.5" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2199.5" x2="2458.5" y1="453.8125" y2="453.8125"/><!--MD5=[4700ddfab9e311ad1ae5061cdd5496ba]
+class helm-source-ffiles--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-source-ffiles" style="stroke: #A80036; stroke-width: 1.5;" width="159" x="2494.5" y="413.8125"/><ellipse cx="2509.5" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2512.4688,435.4531 Q2511.8906,435.75 2511.25,435.8906 Q2510.6094,436.0469 2509.9063,436.0469 Q2507.4063,436.0469 2506.0781,434.4063 Q2504.7656,432.75 2504.7656,429.625 Q2504.7656,426.5 2506.0781,424.8438 Q2507.4063,423.1875 2509.9063,423.1875 Q2510.6094,423.1875 2511.25,423.3438 Q2511.9063,423.5 2512.4688,423.7969 L2512.4688,426.5156 Q2511.8438,425.9375 2511.25,425.6719 Q2510.6563,425.3906 2510.0313,425.3906 Q2508.6875,425.3906 2508,426.4688 Q2507.3125,427.5313 2507.3125,429.625 Q2507.3125,431.7188 2508,432.7969 Q2508.6875,433.8594 2510.0313,433.8594 Q2510.6563,433.8594 2511.25,433.5938 Q2511.8438,433.3125 2512.4688,432.7344 L2512.4688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="127" x="2523.5" y="433.9668">helm-source-ffiles</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2495.5" x2="2652.5" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2495.5" x2="2652.5" y1="453.8125" y2="453.8125"/><!--MD5=[5e8ec52a80544584992cb03033476cca]
+class helm-source-buffers--><rect fill="#FEFECE" filter="url(#fr2saz3zqti4l)" height="48" id="helm-source-buffers" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="2688.5" y="413.8125"/><ellipse cx="2703.5" cy="429.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2706.4688,435.4531 Q2705.8906,435.75 2705.25,435.8906 Q2704.6094,436.0469 2703.9063,436.0469 Q2701.4063,436.0469 2700.0781,434.4063 Q2698.7656,432.75 2698.7656,429.625 Q2698.7656,426.5 2700.0781,424.8438 Q2701.4063,423.1875 2703.9063,423.1875 Q2704.6094,423.1875 2705.25,423.3438 Q2705.9063,423.5 2706.4688,423.7969 L2706.4688,426.5156 Q2705.8438,425.9375 2705.25,425.6719 Q2704.6563,425.3906 2704.0313,425.3906 Q2702.6875,425.3906 2702,426.4688 Q2701.3125,427.5313 2701.3125,429.625 Q2701.3125,431.7188 2702,432.7969 Q2702.6875,433.8594 2704.0313,433.8594 Q2704.6563,433.8594 2705.25,433.5938 Q2705.8438,433.3125 2706.4688,432.7344 L2706.4688,435.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="2717.5" y="433.9668">helm-source-buffers</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2689.5" x2="2862.5" y1="445.8125" y2="445.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2689.5" x2="2862.5" y1="453.8125" y2="453.8125"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M1525,160.0225 C1525,172.2425 1525,185.9225 1525,199.4825 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1518,159.9325,1525,139.9325,1532,159.9325,1518,159.9325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[52d97fd4d153f2c53b55b3f398cc83b3]
+reverse link helm-source-sync to helm-source-session-class--><path d="M1420.03,286.3125 C1200.76,304.6625 678.38,351.3825 243,413.8125 C237.45,414.6125 231.78,415.4625 226.06,416.3725 " fill="none" id="helm-source-sync&lt;-helm-source-session-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1419.46,279.3425,1439.98,284.6525,1420.63,293.2925,1419.46,279.3425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[808f17c2ae4c57b94c9dcfc78a1aa516]
+reverse link helm-source-sync to helm-files-dired-source--><path d="M1419.91,289.0625 C1230.48,309.8725 819.4,357.4325 475,413.8125 C469.12,414.7725 463.09,415.8125 457.01,416.9025 " fill="none" id="helm-source-sync&lt;-helm-files-dired-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1419.35,282.0825,1440,286.8725,1420.88,296.0025,1419.35,282.0825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ca4b9f09c13c1ff3b2602cf75a58548c]
+reverse link helm-source-sync to helm-imenu-source--><path d="M1419.6,292.4725 C1258.87,315.3325 943.09,362.2325 677,413.8125 C671.35,414.9125 665.54,416.0925 659.68,417.3125 " fill="none" id="helm-source-sync&lt;-helm-imenu-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1419.04,285.4825,1439.82,289.6025,1421,299.3425,1419.04,285.4825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[5935dd93b3799671c2a2f238d681efd2]
+reverse link helm-source-sync to helm-files-in-current-dir-source--><path d="M1419.87,301.5525 C1285.78,331.8425 1055.43,383.8625 922.9,413.8025 " fill="none" id="helm-source-sync&lt;-helm-files-in-current-dir-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1418.68,294.6525,1439.73,297.0725,1421.76,308.3025,1418.68,294.6525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[c61a2677e41aced0f206eca3fb3deace]
+reverse link helm-source-sync to helm-recentf-source--><path d="M1420.97,314.1625 C1333.29,344.8025 1210.51,387.7125 1135.83,413.8125 " fill="none" id="helm-source-sync&lt;-helm-recentf-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1418.76,307.5225,1439.95,307.5325,1423.38,320.7425,1418.76,307.5225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[fef6fcdc8cf3b550f0b2dccd98f262c8]
+reverse link helm-source-sync to helm-eshell-history-source--><path d="M1423.48,350.8525 C1391.86,373.6025 1359.25,397.0625 1336.1,413.7125 " fill="none" id="helm-source-sync&lt;-helm-eshell-history-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1419.55,345.0525,1439.87,339.0625,1427.72,356.4225,1419.55,345.0525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[3538d698cbe22ffcb5425ab9a9243391]
+reverse link helm-source-sync to helm-esh-source--><path d="M1525,374.2725 C1525,388.8825 1525,402.6925 1525,413.5925 " fill="none" id="helm-source-sync&lt;-helm-esh-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1518,374.0525,1525,354.0525,1532,374.0525,1518,374.0525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7e5f38bd9ae0e1bb94a273709f715bc1]
+reverse link helm-source-sync to helm-epa--><path d="M1615.45,368.2625 C1632.25,385.0625 1648.39,401.2025 1660.78,413.5925 " fill="none" id="helm-source-sync&lt;-helm-epa" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1610.43,373.1425,1601.24,354.0525,1620.33,363.2425,1610.43,373.1425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[9f4d7494bd3425cac0331b57ecd466c2]
+reverse link helm-source-sync to helm-M-x-class--><path d="M1627.44,353.5025 C1627.63,353.6025 1627.81,353.7125 1628,353.8125 C1672.68,378.6725 1726.34,399.8925 1767.97,414.6525 " fill="none" id="helm-source-sync&lt;-helm-M-x-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1623.74,359.4425,1610.17,343.1625,1630.93,347.4325,1623.74,359.4425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[e9dfd0d46d933b60dace2e76a6fa8e40]
+reverse link helm-source-sync to helm-idle-time-timers-class--><path d="M1627.72,353.6925 C1627.81,353.7325 1627.91,353.7725 1628,353.8125 C1642.32,360.1125 1818.48,393.6125 1938.9,416.0725 " fill="none" id="helm-source-sync&lt;-helm-idle-time-timers-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1624.83,360.0725,1610.12,344.8125,1631.13,347.5725,1624.83,360.0725" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[2dab3ea9bdbd523a70d6b4309b981517]
+reverse link helm-source-sync to helm-absolute-time-timers-class--><path d="M1629.1,352.8825 C1862.45,440.4925 1942.24,382.3225 2181,413.8125 C2186.67,414.5625 2192.46,415.3525 2198.31,416.1725 " fill="none" id="helm-source-sync&lt;-helm-absolute-time-timers-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1626.32,359.3125,1610.17,345.5825,1631.35,346.2425,1626.32,359.3125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[016784bd64bc0242128ed351709a683a]
+reverse link helm-source-sync to helm-source-ffiles--><path d="M1629.22,352.4225 C1835.46,417.1625 2295.88,386.1225 2477,413.8125 C2482.65,414.6725 2488.45,415.7025 2494.27,416.8225 " fill="none" id="helm-source-sync&lt;-helm-source-ffiles" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1626.72,358.9625,1610.07,345.8525,1631.26,345.7225,1626.72,358.9625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[bd9832b2051106d13c2f652e2dc85e4c]
+reverse link helm-source-sync to helm-source-buffers--><path d="M1629.09,352.4025 C1876.89,430.1125 2446.95,383.0225 2671,413.8125 C2676.64,414.5825 2682.42,415.5025 2688.24,416.5225 " fill="none" id="helm-source-sync&lt;-helm-source-buffers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1626.73,358.9925,1610.04,345.9425,1631.23,345.7425,1626.73,358.9925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[1478e29fc9fbb23173ed85ea36686ac5]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-sync'**\n\n
+"helm-source" <|- - "helm-source-sync"
+class "helm-source"
+class "helm-source-sync" {
+ Use this class to make helm
+ sources using a list of
+ candidates.
+ ==
+ __ some interesting slots __
+ candidates
+ match-dynamic
+ match-strict
+ migemo
+}
+note right of "helm-source-sync"
+ **helm-source-sync**:
+ Use this class to make helm
+ sources using a list of
+ candidates.
+end note
+"helm-source-sync" <|- - "helm-source-session-class"
+"helm-source-sync" <|- - "helm-files-dired-source"
+"helm-source-sync" <|- - "helm-imenu-source"
+"helm-source-sync" <|- - "helm-files-in-current-dir-source"
+"helm-source-sync" <|- - "helm-recentf-source"
+"helm-source-sync" <|- - "helm-eshell-history-source"
+"helm-source-sync" <|- - "helm-esh-source"
+"helm-source-sync" <|- - "helm-epa"
+"helm-source-sync" <|- - "helm-M-x-class"
+"helm-source-sync" <|- - "helm-idle-time-timers-class"
+"helm-source-sync" <|- - "helm-absolute-time-timers-class"
+"helm-source-sync" <|- - "helm-source-ffiles"
+"helm-source-sync" <|- - "helm-source-buffers"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-source.png b/doc/helm-figures/helm-source.png
new file mode 100644
index 00000000..1bf51bc7
--- /dev/null
+++ b/doc/helm-figures/helm-source.png
Binary files differ
diff --git a/doc/helm-figures/helm-source.svg b/doc/helm-figures/helm-source.svg
new file mode 100644
index 00000000..f80d3bde
--- /dev/null
+++ b/doc/helm-figures/helm-source.svg
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="879px" preserveAspectRatio="none" style="width:2275px;height:879px;" version="1.1" viewBox="0 0 2275 879" width="2275px" zoomAndPan="magnify"><defs><filter height="300%" id="fk5yunu3qcgyq" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="1021" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="136" x="1073" y="37.6611">'helm-source'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="1144" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="1144" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="666.625" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="184" x="1097" y="91.8125"/><ellipse cx="1141.25" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1144.2188,113.4531 Q1143.6406,113.75 1143,113.8906 Q1142.3594,114.0469 1141.6563,114.0469 Q1139.1563,114.0469 1137.8281,112.4063 Q1136.5156,110.75 1136.5156,107.625 Q1136.5156,104.5 1137.8281,102.8438 Q1139.1563,101.1875 1141.6563,101.1875 Q1142.3594,101.1875 1143,101.3438 Q1143.6563,101.5 1144.2188,101.7969 L1144.2188,104.5156 Q1143.5938,103.9375 1143,103.6719 Q1142.4063,103.3906 1141.7813,103.3906 Q1140.4375,103.3906 1139.75,104.4688 Q1139.0625,105.5313 1139.0625,107.625 Q1139.0625,109.7188 1139.75,110.7969 Q1140.4375,111.8594 1141.7813,111.8594 Q1142.4063,111.8594 1143,111.5938 Q1143.5938,111.3125 1144.2188,110.7344 L1144.2188,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="1161.75" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1098" x2="1280" y1="123.8125" y2="123.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="162" x="1103" y="138.0229">Main interface to define helm</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="50" x="1103" y="150.8276">sources.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="1098" x2="1280" y1="157.4219" y2="157.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="1098" x2="1280" y1="159.4219" y2="159.4219"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="1103" y="188.437">init</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="32" x="1103" y="201.2417">name</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="1103" y="214.0464">action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="1103" y="226.8511">action-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="1103" y="239.6558">after-init-hook</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="61" x="1103" y="252.4604">allow-dups</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="1103" y="265.2651">before-init-hook</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="131" x="1103" y="278.0698">candidate-number-limit</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="128" x="1103" y="290.8745">candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="1103" y="303.6792">candidates</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="1103" y="316.4839">cleanup</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="38" x="1103" y="329.2886">coerce</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="1103" y="342.0933">delayed</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="1103" y="354.8979">display-to-real</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1103" y="367.7026">filter-one-by-one</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="172" x="1103" y="380.5073">filtered-candidate-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="33" x="1103" y="393.312">follow</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="1103" y="406.1167">follow-delay</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="66" x="1103" y="418.9214">fuzzy-match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="33" x="1103" y="431.7261">group</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="1103" y="444.5308">header-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="1103" y="457.3354">header-name</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="1103" y="470.1401">help-message</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="1103" y="482.9448">history</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="1103" y="495.7495">keymap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="1103" y="508.5542">marked-with-props</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="1103" y="521.3589">match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="79" x="1103" y="534.1636">match-on-real</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="1103" y="546.9683">match-part</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="1103" y="559.7729">mode-line</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="48" x="1103" y="572.5776">multiline</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="63" x="1103" y="585.3823">multimatch</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="68" x="1103" y="598.187">must-match</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="1103" y="610.9917">nohighlight</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="43" x="1103" y="623.7964">nomark</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="114" x="1103" y="636.6011">pattern-transformer</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="96" x="1103" y="649.4058">persistent-action</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="1103" y="662.2104">persistent-action-if</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="86" x="1103" y="675.0151">persistent-help</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="81" x="1103" y="687.8198">real-to-display</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="52" x="1103" y="700.6245">redisplay</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="1103" y="713.4292">requires-pattern</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="44" x="1103" y="726.2339">resume</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="39" x="1103" y="739.0386">update</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="40" x="1103" y="751.8433">volatile</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1098" x2="1125.5" y1="171.8242" y2="171.8242"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="1125.5" y="175.1323">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1252.5" x2="1280" y1="171.8242" y2="171.8242"/><path d="M1316.5,397.8125 L1316.5,421.3125 L1281.04,425.3125 L1316.5,429.3125 L1316.5,453.2109 A0,0 0 0 0 1316.5,453.2109 L1523.5,453.2109 A0,0 0 0 0 1523.5,453.2109 L1523.5,407.8125 L1513.5,397.8125 L1316.5,397.8125 A0,0 0 0 0 1316.5,397.8125 " fill="#FBFB77" filter="url(#fk5yunu3qcgyq)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1513.5,397.8125 L1513.5,407.8125 L1523.5,407.8125 L1513.5,397.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="90" x="1322.5" y="414.8794">helm-source</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="1412.5" y="414.8794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="186" x="1322.5" y="430.0122">Main interface to define helm</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="54" x="1322.5" y="445.145">sources.</text><!--MD5=[1a4f21f1efd4e6c0dd550e1e5e387e5d]
+class helm-bookmark-override-inheritor--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="48" id="helm-bookmark-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="272" x="6" y="818.8125"/><ellipse cx="21" cy="834.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,840.4531 Q23.3906,840.75 22.75,840.8906 Q22.1094,841.0469 21.4063,841.0469 Q18.9063,841.0469 17.5781,839.4063 Q16.2656,837.75 16.2656,834.625 Q16.2656,831.5 17.5781,829.8438 Q18.9063,828.1875 21.4063,828.1875 Q22.1094,828.1875 22.75,828.3438 Q23.4063,828.5 23.9688,828.7969 L23.9688,831.5156 Q23.3438,830.9375 22.75,830.6719 Q22.1563,830.3906 21.5313,830.3906 Q20.1875,830.3906 19.5,831.4688 Q18.8125,832.5313 18.8125,834.625 Q18.8125,836.7188 19.5,837.7969 Q20.1875,838.8594 21.5313,838.8594 Q22.1563,838.8594 22.75,838.5938 Q23.3438,838.3125 23.9688,837.7344 L23.9688,840.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="35" y="838.9668">helm-bookmark-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="277" y1="850.8125" y2="850.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="277" y1="858.8125" y2="858.8125"/><!--MD5=[d89fbe3a66aa0ad58442d3fbb0e3c04d]
+class helm-type-timers--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="48" id="helm-type-timers" style="stroke: #A80036; stroke-width: 1.5;" width="153" x="313.5" y="818.8125"/><ellipse cx="328.5" cy="834.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M331.4688,840.4531 Q330.8906,840.75 330.25,840.8906 Q329.6094,841.0469 328.9063,841.0469 Q326.4063,841.0469 325.0781,839.4063 Q323.7656,837.75 323.7656,834.625 Q323.7656,831.5 325.0781,829.8438 Q326.4063,828.1875 328.9063,828.1875 Q329.6094,828.1875 330.25,828.3438 Q330.9063,828.5 331.4688,828.7969 L331.4688,831.5156 Q330.8438,830.9375 330.25,830.6719 Q329.6563,830.3906 329.0313,830.3906 Q327.6875,830.3906 327,831.4688 Q326.3125,832.5313 326.3125,834.625 Q326.3125,836.7188 327,837.7969 Q327.6875,838.8594 329.0313,838.8594 Q329.6563,838.8594 330.25,838.5938 Q330.8438,838.3125 331.4688,837.7344 L331.4688,840.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="121" x="342.5" y="838.9668">helm-type-timers</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="314.5" x2="465.5" y1="850.8125" y2="850.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="314.5" x2="465.5" y1="858.8125" y2="858.8125"/><!--MD5=[beabceb98eda0d1152a0edf286dc7000]
+class helm-type-command--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="48" id="helm-type-command" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="501.5" y="818.8125"/><ellipse cx="516.5" cy="834.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M519.4688,840.4531 Q518.8906,840.75 518.25,840.8906 Q517.6094,841.0469 516.9063,841.0469 Q514.4063,841.0469 513.0781,839.4063 Q511.7656,837.75 511.7656,834.625 Q511.7656,831.5 513.0781,829.8438 Q514.4063,828.1875 516.9063,828.1875 Q517.6094,828.1875 518.25,828.3438 Q518.9063,828.5 519.4688,828.7969 L519.4688,831.5156 Q518.8438,830.9375 518.25,830.6719 Q517.6563,830.3906 517.0313,830.3906 Q515.6875,830.3906 515,831.4688 Q514.3125,832.5313 514.3125,834.625 Q514.3125,836.7188 515,837.7969 Q515.6875,838.8594 517.0313,838.8594 Q517.6563,838.8594 518.25,838.5938 Q518.8438,838.3125 519.4688,837.7344 L519.4688,840.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="530.5" y="838.9668">helm-type-command</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="502.5" x2="675.5" y1="850.8125" y2="850.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="502.5" x2="675.5" y1="858.8125" y2="858.8125"/><!--MD5=[e7e10cea49efd04a6bea9ed9f44f1841]
+class helm-type-function--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="48" id="helm-type-function" style="stroke: #A80036; stroke-width: 1.5;" width="166" x="712" y="818.8125"/><ellipse cx="727" cy="834.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M729.9688,840.4531 Q729.3906,840.75 728.75,840.8906 Q728.1094,841.0469 727.4063,841.0469 Q724.9063,841.0469 723.5781,839.4063 Q722.2656,837.75 722.2656,834.625 Q722.2656,831.5 723.5781,829.8438 Q724.9063,828.1875 727.4063,828.1875 Q728.1094,828.1875 728.75,828.3438 Q729.4063,828.5 729.9688,828.7969 L729.9688,831.5156 Q729.3438,830.9375 728.75,830.6719 Q728.1563,830.3906 727.5313,830.3906 Q726.1875,830.3906 725.5,831.4688 Q724.8125,832.5313 724.8125,834.625 Q724.8125,836.7188 725.5,837.7969 Q726.1875,838.8594 727.5313,838.8594 Q728.1563,838.8594 728.75,838.5938 Q729.3438,838.3125 729.9688,837.7344 L729.9688,840.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="134" x="741" y="838.9668">helm-type-function</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="713" x2="877" y1="850.8125" y2="850.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="713" x2="877" y1="858.8125" y2="858.8125"/><!--MD5=[44eb50c21698d944c3f7c5a7441762ef]
+class helm-type-buffer--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="48" id="helm-type-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="151" x="913.5" y="818.8125"/><ellipse cx="928.5" cy="834.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M931.4688,840.4531 Q930.8906,840.75 930.25,840.8906 Q929.6094,841.0469 928.9063,841.0469 Q926.4063,841.0469 925.0781,839.4063 Q923.7656,837.75 923.7656,834.625 Q923.7656,831.5 925.0781,829.8438 Q926.4063,828.1875 928.9063,828.1875 Q929.6094,828.1875 930.25,828.3438 Q930.9063,828.5 931.4688,828.7969 L931.4688,831.5156 Q930.8438,830.9375 930.25,830.6719 Q929.6563,830.3906 929.0313,830.3906 Q927.6875,830.3906 927,831.4688 Q926.3125,832.5313 926.3125,834.625 Q926.3125,836.7188 927,837.7969 Q927.6875,838.8594 929.0313,838.8594 Q929.6563,838.8594 930.25,838.5938 Q930.8438,838.3125 931.4688,837.7344 L931.4688,840.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="119" x="942.5" y="838.9668">helm-type-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="914.5" x2="1063.5" y1="850.8125" y2="850.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="914.5" x2="1063.5" y1="858.8125" y2="858.8125"/><!--MD5=[257e0c9decabcf296fc5e077c0fe3da7]
+class helm-type-bookmark--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="48" id="helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.5;" width="178" x="1100" y="818.8125"/><ellipse cx="1115" cy="834.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1117.9688,840.4531 Q1117.3906,840.75 1116.75,840.8906 Q1116.1094,841.0469 1115.4063,841.0469 Q1112.9063,841.0469 1111.5781,839.4063 Q1110.2656,837.75 1110.2656,834.625 Q1110.2656,831.5 1111.5781,829.8438 Q1112.9063,828.1875 1115.4063,828.1875 Q1116.1094,828.1875 1116.75,828.3438 Q1117.4063,828.5 1117.9688,828.7969 L1117.9688,831.5156 Q1117.3438,830.9375 1116.75,830.6719 Q1116.1563,830.3906 1115.5313,830.3906 Q1114.1875,830.3906 1113.5,831.4688 Q1112.8125,832.5313 1112.8125,834.625 Q1112.8125,836.7188 1113.5,837.7969 Q1114.1875,838.8594 1115.5313,838.8594 Q1116.1563,838.8594 1116.75,838.5938 Q1117.3438,838.3125 1117.9688,837.7344 L1117.9688,840.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="146" x="1129" y="838.9668">helm-type-bookmark</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1101" x2="1277" y1="850.8125" y2="850.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1101" x2="1277" y1="858.8125" y2="858.8125"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="48" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="130" x="1313" y="818.8125"/><ellipse cx="1328" cy="834.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1330.9688,840.4531 Q1330.3906,840.75 1329.75,840.8906 Q1329.1094,841.0469 1328.4063,841.0469 Q1325.9063,841.0469 1324.5781,839.4063 Q1323.2656,837.75 1323.2656,834.625 Q1323.2656,831.5 1324.5781,829.8438 Q1325.9063,828.1875 1328.4063,828.1875 Q1329.1094,828.1875 1329.75,828.3438 Q1330.4063,828.5 1330.9688,828.7969 L1330.9688,831.5156 Q1330.3438,830.9375 1329.75,830.6719 Q1329.1563,830.3906 1328.5313,830.3906 Q1327.1875,830.3906 1326.5,831.4688 Q1325.8125,832.5313 1325.8125,834.625 Q1325.8125,836.7188 1326.5,837.7969 Q1327.1875,838.8594 1328.5313,838.8594 Q1329.1563,838.8594 1329.75,838.5938 Q1330.3438,838.3125 1330.9688,837.7344 L1330.9688,840.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="1342" y="838.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1314" x2="1442" y1="850.8125" y2="850.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1314" x2="1442" y1="858.8125" y2="858.8125"/><!--MD5=[5adfb603e84a1ac071a064f5c8c4d8a3]
+class helm-source-dummy--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="48" id="helm-source-dummy" style="stroke: #A80036; stroke-width: 1.5;" width="174" x="1478" y="818.8125"/><ellipse cx="1493" cy="834.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1495.9688,840.4531 Q1495.3906,840.75 1494.75,840.8906 Q1494.1094,841.0469 1493.4063,841.0469 Q1490.9063,841.0469 1489.5781,839.4063 Q1488.2656,837.75 1488.2656,834.625 Q1488.2656,831.5 1489.5781,829.8438 Q1490.9063,828.1875 1493.4063,828.1875 Q1494.1094,828.1875 1494.75,828.3438 Q1495.4063,828.5 1495.9688,828.7969 L1495.9688,831.5156 Q1495.3438,830.9375 1494.75,830.6719 Q1494.1563,830.3906 1493.5313,830.3906 Q1492.1875,830.3906 1491.5,831.4688 Q1490.8125,832.5313 1490.8125,834.625 Q1490.8125,836.7188 1491.5,837.7969 Q1492.1875,838.8594 1493.5313,838.8594 Q1494.1563,838.8594 1494.75,838.5938 Q1495.3438,838.3125 1495.9688,837.7344 L1495.9688,840.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="142" x="1507" y="838.9668">helm-source-dummy</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1479" x2="1651" y1="850.8125" y2="850.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1479" x2="1651" y1="858.8125" y2="858.8125"/><!--MD5=[df56542e8c7b1aabe649dc484b739778]
+class helm-source-in-buffer--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="48" id="helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="185" x="1687.5" y="818.8125"/><ellipse cx="1702.5" cy="834.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1705.4688,840.4531 Q1704.8906,840.75 1704.25,840.8906 Q1703.6094,841.0469 1702.9063,841.0469 Q1700.4063,841.0469 1699.0781,839.4063 Q1697.7656,837.75 1697.7656,834.625 Q1697.7656,831.5 1699.0781,829.8438 Q1700.4063,828.1875 1702.9063,828.1875 Q1703.6094,828.1875 1704.25,828.3438 Q1704.9063,828.5 1705.4688,828.7969 L1705.4688,831.5156 Q1704.8438,830.9375 1704.25,830.6719 Q1703.6563,830.3906 1703.0313,830.3906 Q1701.6875,830.3906 1701,831.4688 Q1700.3125,832.5313 1700.3125,834.625 Q1700.3125,836.7188 1701,837.7969 Q1701.6875,838.8594 1703.0313,838.8594 Q1703.6563,838.8594 1704.25,838.5938 Q1704.8438,838.3125 1705.4688,837.7344 L1705.4688,840.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="1716.5" y="838.9668">helm-source-in-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1688.5" x2="1871.5" y1="850.8125" y2="850.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1688.5" x2="1871.5" y1="858.8125" y2="858.8125"/><!--MD5=[12d16a9c65828dace8d907a7ab3ef450]
+class helm-source-async--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="48" id="helm-source-async" style="stroke: #A80036; stroke-width: 1.5;" width="165" x="1907.5" y="818.8125"/><ellipse cx="1922.5" cy="834.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1925.4688,840.4531 Q1924.8906,840.75 1924.25,840.8906 Q1923.6094,841.0469 1922.9063,841.0469 Q1920.4063,841.0469 1919.0781,839.4063 Q1917.7656,837.75 1917.7656,834.625 Q1917.7656,831.5 1919.0781,829.8438 Q1920.4063,828.1875 1922.9063,828.1875 Q1923.6094,828.1875 1924.25,828.3438 Q1924.9063,828.5 1925.4688,828.7969 L1925.4688,831.5156 Q1924.8438,830.9375 1924.25,830.6719 Q1923.6563,830.3906 1923.0313,830.3906 Q1921.6875,830.3906 1921,831.4688 Q1920.3125,832.5313 1920.3125,834.625 Q1920.3125,836.7188 1921,837.7969 Q1921.6875,838.8594 1923.0313,838.8594 Q1923.6563,838.8594 1924.25,838.5938 Q1924.8438,838.3125 1925.4688,837.7344 L1925.4688,840.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="133" x="1936.5" y="838.9668">helm-source-async</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1908.5" x2="2071.5" y1="850.8125" y2="850.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1908.5" x2="2071.5" y1="858.8125" y2="858.8125"/><!--MD5=[29825b4f2a07190321f66d6028a4dd26]
+class helm-source-sync--><rect fill="#FEFECE" filter="url(#fk5yunu3qcgyq)" height="48" id="helm-source-sync" style="stroke: #A80036; stroke-width: 1.5;" width="156" x="2108" y="818.8125"/><ellipse cx="2123" cy="834.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M2125.9688,840.4531 Q2125.3906,840.75 2124.75,840.8906 Q2124.1094,841.0469 2123.4063,841.0469 Q2120.9063,841.0469 2119.5781,839.4063 Q2118.2656,837.75 2118.2656,834.625 Q2118.2656,831.5 2119.5781,829.8438 Q2120.9063,828.1875 2123.4063,828.1875 Q2124.1094,828.1875 2124.75,828.3438 Q2125.4063,828.5 2125.9688,828.7969 L2125.9688,831.5156 Q2125.3438,830.9375 2124.75,830.6719 Q2124.1563,830.3906 2123.5313,830.3906 Q2122.1875,830.3906 2121.5,831.4688 Q2120.8125,832.5313 2120.8125,834.625 Q2120.8125,836.7188 2121.5,837.7969 Q2122.1875,838.8594 2123.5313,838.8594 Q2124.1563,838.8594 2124.75,838.5938 Q2125.3438,838.3125 2125.9688,837.7344 L2125.9688,840.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="124" x="2137" y="838.9668">helm-source-sync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="2109" x2="2263" y1="850.8125" y2="850.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="2109" x2="2263" y1="858.8125" y2="858.8125"/><!--MD5=[116a0e90e894ac99238d97b5f2f654c6]
+reverse link helm-source to helm-bookmark-override-inheritor--><path d="M1077.91,470.4025 C856.79,558.1525 368.44,751.9525 200.26,818.6925 " fill="none" id="helm-source&lt;-helm-bookmark-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1075.37,463.8725,1096.55,463.0025,1080.54,476.8825,1075.37,463.8725" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[687fc8ec140e945488f732dae3c46e2b]
+reverse link helm-source to helm-type-timers--><path d="M1079.21,483.4025 C901.11,576.0225 556.84,755.0525 434.48,818.6825 " fill="none" id="helm-source&lt;-helm-type-timers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1075.98,477.1925,1096.95,474.1825,1082.44,489.6125,1075.98,477.1925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[fde896bcedf28e4926ec99232971bb19]
+reverse link helm-source to helm-type-command--><path d="M1080.44,501.4925 C941.55,597.6725 708.65,758.9525 622.43,818.6625 " fill="none" id="helm-source&lt;-helm-type-command" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1076.46,495.7325,1096.89,490.0925,1084.44,507.2425,1076.46,495.7325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[cb8c671e8f25dea26b71b20786c595d4]
+reverse link helm-source to helm-type-function--><path d="M1083.09,538.0025 C991.75,634.3225 866.93,765.9625 816.97,818.6425 " fill="none" id="helm-source&lt;-helm-type-function" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1078.03,533.1625,1096.87,523.4625,1088.19,542.7925,1078.03,533.1625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[528fc0d38c023ea499a6c44f22caf734]
+reverse link helm-source to helm-type-buffer--><path d="M1088.15,635.8325 C1052.72,709.4325 1017.44,782.7225 1000.09,818.7825 " fill="none" id="helm-source&lt;-helm-type-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1081.92,632.6325,1096.9,617.6425,1094.54,638.7025,1081.92,632.6325" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[b3073f519ff1e7a9af7ffffd7406ad63]
+reverse link helm-source to helm-type-bookmark--><path d="M1189,779.3125 C1189,794.9425 1189,808.3725 1189,818.7325 " fill="none" id="helm-source&lt;-helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1182,779.2225,1189,759.2225,1196,779.2225,1182,779.2225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M1290.55,744.1525 C1293.3,749.1125 1296.12,754.0025 1299,758.8125 C1312.71,781.6725 1333.71,803.3425 1350.61,818.8025 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1284.35,747.3925,1281.15,726.4525,1296.71,740.8325,1284.35,747.3925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[08cc1f31d63ae7c2a5398bb390fce2ff]
+reverse link helm-source to helm-source-dummy--><path d="M1294.64,754.4025 C1296.07,755.8925 1297.53,757.3625 1299,758.8125 C1312.26,771.8525 1405.54,799.1625 1477.94,818.9025 " fill="none" id="helm-source&lt;-helm-source-dummy" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1289.22,758.8425,1281.2,739.2325,1299.7,749.5625,1289.22,758.8425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[720fe72c7a837b3f6a94e411349ef229]
+reverse link helm-source to helm-source-in-buffer--><path d="M1295.81,756.0325 C1296.86,756.9725 1297.93,757.8925 1299,758.8125 C1426.12,867.1625 1505.76,788.3825 1670,818.8125 C1675.66,819.8625 1681.47,820.9725 1687.34,822.1225 " fill="none" id="helm-source&lt;-helm-source-in-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1290.68,760.8025,1281.3,741.8025,1300.48,750.8125,1290.68,760.8025" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[894eacf2e17d1c2f4b307c7f81f3aeea]
+reverse link helm-source to helm-source-async--><path d="M1296.08,756.4225 C1297.05,757.2325 1298.02,758.0225 1299,758.8125 C1401.96,841.4325 1759.75,797.3125 1890,818.8125 C1895.71,819.7525 1901.59,820.8325 1907.49,821.9825 " fill="none" id="helm-source&lt;-helm-source-async" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1291.11,761.3625,1281.2,742.6325,1300.63,751.0925,1291.11,761.3625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7fac0f6d78841877506d9722364fbb5e]
+reverse link helm-source to helm-source-sync--><path d="M1296.05,756.4625 C1297.03,757.2525 1298.01,758.0325 1299,758.8125 C1368.44,813.0925 2002.92,805.1725 2090,818.8125 C2095.84,819.7325 2101.85,820.8125 2107.88,822.0125 " fill="none" id="helm-source&lt;-helm-source-sync" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1291.15,761.4625,1281.03,742.8525,1300.55,751.0825,1291.15,761.4625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[c8ae02deb66d539a4211bd8e57a6a66b]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source'**\n\n
+class "helm-source" {
+ Main interface to define helm
+ sources.
+ ==
+ __ some interesting slots __
+ init
+ name
+ action
+ action-transformer
+ after-init-hook
+ allow-dups
+ before-init-hook
+ candidate-number-limit
+ candidate-transformer
+ candidates
+ cleanup
+ coerce
+ delayed
+ display-to-real
+ filter-one-by-one
+ filtered-candidate-transformer
+ follow
+ follow-delay
+ fuzzy-match
+ group
+ header-line
+ header-name
+ help-message
+ history
+ keymap
+ marked-with-props
+ match
+ match-on-real
+ match-part
+ mode-line
+ multiline
+ multimatch
+ must-match
+ nohighlight
+ nomark
+ pattern-transformer
+ persistent-action
+ persistent-action-if
+ persistent-help
+ real-to-display
+ redisplay
+ requires-pattern
+ resume
+ update
+ volatile
+}
+note right of "helm-source"
+ **helm-source**:
+ Main interface to define helm
+ sources.
+end note
+"helm-source" <|- - "helm-bookmark-override-inheritor"
+"helm-source" <|- - "helm-type-timers"
+"helm-source" <|- - "helm-type-command"
+"helm-source" <|- - "helm-type-function"
+"helm-source" <|- - "helm-type-buffer"
+"helm-source" <|- - "helm-type-bookmark"
+"helm-source" <|- - "helm-type-file"
+"helm-source" <|- - "helm-source-dummy"
+"helm-source" <|- - "helm-source-in-buffer"
+"helm-source" <|- - "helm-source-async"
+"helm-source" <|- - "helm-source-sync"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-type-bookmark.png b/doc/helm-figures/helm-type-bookmark.png
new file mode 100644
index 00000000..e385d46a
--- /dev/null
+++ b/doc/helm-figures/helm-type-bookmark.png
Binary files differ
diff --git a/doc/helm-figures/helm-type-bookmark.svg b/doc/helm-figures/helm-type-bookmark.svg
new file mode 100644
index 00000000..1ca8abfa
--- /dev/null
+++ b/doc/helm-figures/helm-type-bookmark.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="411px" preserveAspectRatio="none" style="width:594px;height:411px;" version="1.1" viewBox="0 0 594 411" width="594px" zoomAndPan="magnify"><defs><filter height="300%" id="fibyuj8fy77pf" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="180" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="221" x="189.5" y="37.6611">'helm-type-bookmark'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="303" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="303" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fibyuj8fy77pf)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="219" y="91.8125"/><ellipse cx="234" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M236.9688,113.4531 Q236.3906,113.75 235.75,113.8906 Q235.1094,114.0469 234.4063,114.0469 Q231.9063,114.0469 230.5781,112.4063 Q229.2656,110.75 229.2656,107.625 Q229.2656,104.5 230.5781,102.8438 Q231.9063,101.1875 234.4063,101.1875 Q235.1094,101.1875 235.75,101.3438 Q236.4063,101.5 236.9688,101.7969 L236.9688,104.5156 Q236.3438,103.9375 235.75,103.6719 Q235.1563,103.3906 234.5313,103.3906 Q233.1875,103.3906 232.5,104.4688 Q231.8125,105.5313 231.8125,107.625 Q231.8125,109.7188 232.5,110.7969 Q233.1875,111.8594 234.5313,111.8594 Q235.1563,111.8594 235.75,111.5938 Q236.3438,111.3125 236.9688,110.7344 L236.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="248" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="220" x2="337" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="220" x2="337" y1="131.8125" y2="131.8125"/><!--MD5=[257e0c9decabcf296fc5e077c0fe3da7]
+class helm-type-bookmark--><rect fill="#FEFECE" filter="url(#fibyuj8fy77pf)" height="92.8164" id="helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.5;" width="178" x="189.5" y="199.8125"/><ellipse cx="204.5" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M207.4688,221.4531 Q206.8906,221.75 206.25,221.8906 Q205.6094,222.0469 204.9063,222.0469 Q202.4063,222.0469 201.0781,220.4063 Q199.7656,218.75 199.7656,215.625 Q199.7656,212.5 201.0781,210.8438 Q202.4063,209.1875 204.9063,209.1875 Q205.6094,209.1875 206.25,209.3438 Q206.9063,209.5 207.4688,209.7969 L207.4688,212.5156 Q206.8438,211.9375 206.25,211.6719 Q205.6563,211.3906 205.0313,211.3906 Q203.6875,211.3906 203,212.4688 Q202.3125,213.5313 202.3125,215.625 Q202.3125,217.7188 203,218.7969 Q203.6875,219.8594 205.0313,219.8594 Q205.6563,219.8594 206.25,219.5938 Q206.8438,219.3125 207.4688,218.7344 L207.4688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="146" x="218.5" y="219.9668">helm-type-bookmark</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="190.5" x2="366.5" y1="231.8125" y2="231.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="119" x="195.5" y="246.0229">A class to define type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="67" x="195.5" y="258.8276">bookmarks.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="190.5" x2="366.5" y1="265.4219" y2="265.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="190.5" x2="366.5" y1="267.4219" y2="267.4219"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="190.5" x2="215" y1="279.8242" y2="279.8242"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="215" y="283.1323">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="342" x2="366.5" y1="279.8242" y2="279.8242"/><path d="M403,218.8125 L403,242.3125 L367.53,246.3125 L403,250.3125 L403,274.2109 A0,0 0 0 0 403,274.2109 L582,274.2109 A0,0 0 0 0 582,274.2109 L582,228.8125 L572,218.8125 L403,218.8125 A0,0 0 0 0 403,218.8125 " fill="#FBFB77" filter="url(#fibyuj8fy77pf)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M572,218.8125 L572,228.8125 L582,228.8125 L572,218.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="154" x="409" y="235.8794">helm-type-bookmark</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="563" y="235.8794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="137" x="409" y="251.0122">A class to define type</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="75" x="409" y="266.145">bookmarks.</text><!--MD5=[1b5f639ef80bc5f44c8cc4600bf3e2e4]
+class helm-source-filtered-bookmarks--><rect fill="#FEFECE" filter="url(#fibyuj8fy77pf)" height="48" id="helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.5;" width="259" x="6" y="352.8125"/><ellipse cx="21" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,374.4531 Q23.3906,374.75 22.75,374.8906 Q22.1094,375.0469 21.4063,375.0469 Q18.9063,375.0469 17.5781,373.4063 Q16.2656,371.75 16.2656,368.625 Q16.2656,365.5 17.5781,363.8438 Q18.9063,362.1875 21.4063,362.1875 Q22.1094,362.1875 22.75,362.3438 Q23.4063,362.5 23.9688,362.7969 L23.9688,365.5156 Q23.3438,364.9375 22.75,364.6719 Q22.1563,364.3906 21.5313,364.3906 Q20.1875,364.3906 19.5,365.4688 Q18.8125,366.5313 18.8125,368.625 Q18.8125,370.7188 19.5,371.7969 Q20.1875,372.8594 21.5313,372.8594 Q22.1563,372.8594 22.75,372.5938 Q23.3438,372.3125 23.9688,371.7344 L23.9688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="227" x="35" y="372.9668">helm-source-filtered-bookmarks</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="264" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="264" y1="392.8125" y2="392.8125"/><!--MD5=[bf73905ec5fe3c8fa1d96a26605c7c43]
+class helm-source-basic-bookmarks--><rect fill="#FEFECE" filter="url(#fibyuj8fy77pf)" height="48" id="helm-source-basic-bookmarks" style="stroke: #A80036; stroke-width: 1.5;" width="244" x="300.5" y="352.8125"/><ellipse cx="315.5" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M318.4688,374.4531 Q317.8906,374.75 317.25,374.8906 Q316.6094,375.0469 315.9063,375.0469 Q313.4063,375.0469 312.0781,373.4063 Q310.7656,371.75 310.7656,368.625 Q310.7656,365.5 312.0781,363.8438 Q313.4063,362.1875 315.9063,362.1875 Q316.6094,362.1875 317.25,362.3438 Q317.9063,362.5 318.4688,362.7969 L318.4688,365.5156 Q317.8438,364.9375 317.25,364.6719 Q316.6563,364.3906 316.0313,364.3906 Q314.6875,364.3906 314,365.4688 Q313.3125,366.5313 313.3125,368.625 Q313.3125,370.7188 314,371.7969 Q314.6875,372.8594 316.0313,372.8594 Q316.6563,372.8594 317.25,372.5938 Q317.8438,372.3125 318.4688,371.7344 L318.4688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="212" x="329.5" y="372.9668">helm-source-basic-bookmarks</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="301.5" x2="543.5" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="301.5" x2="543.5" y1="392.8125" y2="392.8125"/><!--MD5=[b3073f519ff1e7a9af7ffffd7406ad63]
+reverse link helm-source to helm-type-bookmark--><path d="M278.5,160.4125 C278.5,173.0325 278.5,186.8425 278.5,199.5825 " fill="none" id="helm-source&lt;-helm-type-bookmark" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="271.5,160.0825,278.5,140.0825,285.5,160.0825,271.5,160.0825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[36bf56344c9fb562b92d13c27d56d2e6]
+reverse link helm-type-bookmark to helm-source-filtered-bookmarks--><path d="M212.61,306.5225 C194.4,322.8825 175.7,339.6825 161.28,352.6425 " fill="none" id="helm-type-bookmark&lt;-helm-source-filtered-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="208.13,301.1425,227.68,292.9825,217.48,311.5525,208.13,301.1425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[d74130942a07ed6c44229600fa80fecc]
+reverse link helm-type-bookmark to helm-source-basic-bookmarks--><path d="M344.85,306.5225 C363.19,322.8825 382.02,339.6825 396.54,352.6425 " fill="none" id="helm-type-bookmark&lt;-helm-source-basic-bookmarks" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="339.94,311.5225,329.67,292.9825,349.26,301.0725,339.94,311.5225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[b53f6f79b67e2b8ebf99e4330447bc90]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-bookmark'**\n\n
+"helm-source" <|- - "helm-type-bookmark"
+class "helm-source"
+class "helm-type-bookmark" {
+ A class to define type
+ bookmarks.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-bookmark"
+ **helm-type-bookmark**:
+ A class to define type
+ bookmarks.
+end note
+"helm-type-bookmark" <|- - "helm-source-filtered-bookmarks"
+"helm-type-bookmark" <|- - "helm-source-basic-bookmarks"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-type-buffer.png b/doc/helm-figures/helm-type-buffer.png
new file mode 100644
index 00000000..5b402c18
--- /dev/null
+++ b/doc/helm-figures/helm-type-buffer.png
Binary files differ
diff --git a/doc/helm-figures/helm-type-buffer.svg b/doc/helm-figures/helm-type-buffer.svg
new file mode 100644
index 00000000..41c90275
--- /dev/null
+++ b/doc/helm-figures/helm-type-buffer.svg
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="398px" preserveAspectRatio="none" style="width:430px;height:398px;" version="1.1" viewBox="0 0 430 398" width="430px" zoomAndPan="magnify"><defs><filter height="300%" id="fuko8b35atc2d" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="98" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="184" x="126" y="37.6611">'helm-type-buffer'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="221" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="221" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fuko8b35atc2d)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="34" y="91.8125"/><ellipse cx="49" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M51.9688,113.4531 Q51.3906,113.75 50.75,113.8906 Q50.1094,114.0469 49.4063,114.0469 Q46.9063,114.0469 45.5781,112.4063 Q44.2656,110.75 44.2656,107.625 Q44.2656,104.5 45.5781,102.8438 Q46.9063,101.1875 49.4063,101.1875 Q50.1094,101.1875 50.75,101.3438 Q51.4063,101.5 51.9688,101.7969 L51.9688,104.5156 Q51.3438,103.9375 50.75,103.6719 Q50.1563,103.3906 49.5313,103.3906 Q48.1875,103.3906 47.5,104.4688 Q46.8125,105.5313 46.8125,107.625 Q46.8125,109.7188 47.5,110.7969 Q48.1875,111.8594 49.5313,111.8594 Q50.1563,111.8594 50.75,111.5938 Q51.3438,111.3125 51.9688,110.7344 L51.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="63" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="35" x2="152" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="35" x2="152" y1="131.8125" y2="131.8125"/><!--MD5=[44eb50c21698d944c3f7c5a7441762ef]
+class helm-type-buffer--><rect fill="#FEFECE" filter="url(#fuko8b35atc2d)" height="80.0117" id="helm-type-buffer" style="stroke: #A80036; stroke-width: 1.5;" width="172" x="7.5" y="199.8125"/><ellipse cx="31.95" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M34.9188,221.4531 Q34.3406,221.75 33.7,221.8906 Q33.0594,222.0469 32.3563,222.0469 Q29.8563,222.0469 28.5281,220.4063 Q27.2156,218.75 27.2156,215.625 Q27.2156,212.5 28.5281,210.8438 Q29.8563,209.1875 32.3563,209.1875 Q33.0594,209.1875 33.7,209.3438 Q34.3563,209.5 34.9188,209.7969 L34.9188,212.5156 Q34.2938,211.9375 33.7,211.6719 Q33.1063,211.3906 32.4813,211.3906 Q31.1375,211.3906 30.45,212.4688 Q29.7625,213.5313 29.7625,215.625 Q29.7625,217.7188 30.45,218.7969 Q31.1375,219.8594 32.4813,219.8594 Q33.1063,219.8594 33.7,219.5938 Q34.2938,219.3125 34.9188,218.7344 L34.9188,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="119" x="48.05" y="219.9668">helm-type-buffer</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="8.5" x2="178.5" y1="231.8125" y2="231.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="160" x="13.5" y="246.0229">A class to define type buffer.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="8.5" x2="178.5" y1="252.6172" y2="252.6172"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="8.5" x2="178.5" y1="254.6172" y2="254.6172"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="8.5" x2="30" y1="267.0195" y2="267.0195"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="30" y="270.3276">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="157" x2="178.5" y1="267.0195" y2="267.0195"/><path d="M215,219.8125 L215,235.8125 L179.74,239.8125 L215,243.8125 L215,260.0781 A0,0 0 0 0 215,260.0781 L418,260.0781 A0,0 0 0 0 418,260.0781 L418,229.8125 L408,219.8125 L215,219.8125 A0,0 0 0 0 215,219.8125 " fill="#FBFB77" filter="url(#fuko8b35atc2d)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M408,219.8125 L408,229.8125 L418,229.8125 L408,219.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="125" x="221" y="236.8794">helm-type-buffer</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="346" y="236.8794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="182" x="221" y="252.0122">A class to define type buffer.</text><!--MD5=[5e8ec52a80544584992cb03033476cca]
+class helm-source-buffers--><rect fill="#FEFECE" filter="url(#fuko8b35atc2d)" height="48" id="helm-source-buffers" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="6" y="339.8125"/><ellipse cx="21" cy="355.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,361.4531 Q23.3906,361.75 22.75,361.8906 Q22.1094,362.0469 21.4063,362.0469 Q18.9063,362.0469 17.5781,360.4063 Q16.2656,358.75 16.2656,355.625 Q16.2656,352.5 17.5781,350.8438 Q18.9063,349.1875 21.4063,349.1875 Q22.1094,349.1875 22.75,349.3438 Q23.4063,349.5 23.9688,349.7969 L23.9688,352.5156 Q23.3438,351.9375 22.75,351.6719 Q22.1563,351.3906 21.5313,351.3906 Q20.1875,351.3906 19.5,352.4688 Q18.8125,353.5313 18.8125,355.625 Q18.8125,357.7188 19.5,358.7969 Q20.1875,359.8594 21.5313,359.8594 Q22.1563,359.8594 22.75,359.5938 Q23.3438,359.3125 23.9688,358.7344 L23.9688,361.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="35" y="359.9668">helm-source-buffers</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="180" y1="371.8125" y2="371.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="180" y1="379.8125" y2="379.8125"/><!--MD5=[528fc0d38c023ea499a6c44f22caf734]
+reverse link helm-source to helm-type-buffer--><path d="M93.5,160.0625 C93.5,172.8525 93.5,186.7925 93.5,199.3425 " fill="none" id="helm-source&lt;-helm-type-buffer" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="86.5,160.0425,93.5,140.0425,100.5,160.0425,86.5,160.0425" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[88c02f9cf13fd6689df37b68aefeb8b8]
+reverse link helm-type-buffer to helm-source-buffers--><path d="M93.5,300.1925 C93.5,314.2125 93.5,328.3425 93.5,339.6225 " fill="none" id="helm-type-buffer&lt;-helm-source-buffers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="86.5,300.0825,93.5,280.0825,100.5,300.0825,86.5,300.0825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4eb9053afec4b05814ad68d4d45dac60]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-buffer'**\n\n
+"helm-source" <|- - "helm-type-buffer"
+class "helm-source"
+class "helm-type-buffer" {
+ A class to define type buffer.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-buffer"
+ **helm-type-buffer**:
+ A class to define type buffer.
+end note
+"helm-type-buffer" <|- - "helm-source-buffers"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-type-command.png b/doc/helm-figures/helm-type-command.png
new file mode 100644
index 00000000..90a27956
--- /dev/null
+++ b/doc/helm-figures/helm-type-command.png
Binary files differ
diff --git a/doc/helm-figures/helm-type-command.svg b/doc/helm-figures/helm-type-command.svg
new file mode 100644
index 00000000..759d5606
--- /dev/null
+++ b/doc/helm-figures/helm-type-command.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="411px" preserveAspectRatio="none" style="width:422px;height:411px;" version="1.1" viewBox="0 0 422 411" width="422px" zoomAndPan="magnify"><defs><filter height="300%" id="f1cfbaeqz53hlj" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="94.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="218" x="105.5" y="37.6611">'helm-type-command'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="217.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="217.5" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1cfbaeqz53hlj)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="34" y="91.8125"/><ellipse cx="49" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M51.9688,113.4531 Q51.3906,113.75 50.75,113.8906 Q50.1094,114.0469 49.4063,114.0469 Q46.9063,114.0469 45.5781,112.4063 Q44.2656,110.75 44.2656,107.625 Q44.2656,104.5 45.5781,102.8438 Q46.9063,101.1875 49.4063,101.1875 Q50.1094,101.1875 50.75,101.3438 Q51.4063,101.5 51.9688,101.7969 L51.9688,104.5156 Q51.3438,103.9375 50.75,103.6719 Q50.1563,103.3906 49.5313,103.3906 Q48.1875,103.3906 47.5,104.4688 Q46.8125,105.5313 46.8125,107.625 Q46.8125,109.7188 47.5,110.7969 Q48.1875,111.8594 49.5313,111.8594 Q50.1563,111.8594 50.75,111.5938 Q51.3438,111.3125 51.9688,110.7344 L51.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="63" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="35" x2="152" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="35" x2="152" y1="131.8125" y2="131.8125"/><!--MD5=[beabceb98eda0d1152a0edf286dc7000]
+class helm-type-command--><rect fill="#FEFECE" filter="url(#f1cfbaeqz53hlj)" height="92.8164" id="helm-type-command" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="35" y="219.9668">helm-type-command</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="180" y1="231.8125" y2="231.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="150" x="12" y="246.0229">A class to define helm type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="60" x="12" y="258.8276">command.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="7" x2="180" y1="265.4219" y2="265.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="7" x2="180" y1="267.4219" y2="267.4219"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="30" y1="279.8242" y2="279.8242"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="30" y="283.1323">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="157" x2="180" y1="279.8242" y2="279.8242"/><path d="M216.5,218.8125 L216.5,242.3125 L181.16,246.3125 L216.5,250.3125 L216.5,274.2109 A0,0 0 0 0 216.5,274.2109 L410.5,274.2109 A0,0 0 0 0 410.5,274.2109 L410.5,228.8125 L400.5,218.8125 L216.5,218.8125 A0,0 0 0 0 216.5,218.8125 " fill="#FBFB77" filter="url(#f1cfbaeqz53hlj)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M400.5,218.8125 L400.5,228.8125 L410.5,228.8125 L400.5,218.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="152" x="222.5" y="235.8794">helm-type-command</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="374.5" y="235.8794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="173" x="222.5" y="251.0122">A class to define helm type</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="69" x="222.5" y="266.145">command.</text><!--MD5=[9bb915cdd04b5f6bf4c2c1633cbdfbdc]
+class helm-M-x-class--><rect fill="#FEFECE" filter="url(#f1cfbaeqz53hlj)" height="48" id="helm-M-x-class" style="stroke: #A80036; stroke-width: 1.5;" width="136" x="25.5" y="352.8125"/><ellipse cx="40.5" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M43.4688,374.4531 Q42.8906,374.75 42.25,374.8906 Q41.6094,375.0469 40.9063,375.0469 Q38.4063,375.0469 37.0781,373.4063 Q35.7656,371.75 35.7656,368.625 Q35.7656,365.5 37.0781,363.8438 Q38.4063,362.1875 40.9063,362.1875 Q41.6094,362.1875 42.25,362.3438 Q42.9063,362.5 43.4688,362.7969 L43.4688,365.5156 Q42.8438,364.9375 42.25,364.6719 Q41.6563,364.3906 41.0313,364.3906 Q39.6875,364.3906 39,365.4688 Q38.3125,366.5313 38.3125,368.625 Q38.3125,370.7188 39,371.7969 Q39.6875,372.8594 41.0313,372.8594 Q41.6563,372.8594 42.25,372.5938 Q42.8438,372.3125 43.4688,371.7344 L43.4688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="104" x="54.5" y="372.9668">helm-M-x-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="26.5" x2="160.5" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="26.5" x2="160.5" y1="392.8125" y2="392.8125"/><!--MD5=[fde896bcedf28e4926ec99232971bb19]
+reverse link helm-source to helm-type-command--><path d="M93.5,160.4125 C93.5,173.0325 93.5,186.8425 93.5,199.5825 " fill="none" id="helm-source&lt;-helm-type-command" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="86.5,160.0825,93.5,140.0825,100.5,160.0825,86.5,160.0825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[4ac71f6dd5cea0c13d2b9c31bc00a812]
+reverse link helm-type-command to helm-M-x-class--><path d="M93.5,313.4125 C93.5,327.5125 93.5,341.5025 93.5,352.6425 " fill="none" id="helm-type-command&lt;-helm-M-x-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="86.5,312.9825,93.5,292.9825,100.5,312.9825,86.5,312.9825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[1ef70213ca09967b8d79aac4350d6b32]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-command'**\n\n
+"helm-source" <|- - "helm-type-command"
+class "helm-source"
+class "helm-type-command" {
+ A class to define helm type
+ command.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-command"
+ **helm-type-command**:
+ A class to define helm type
+ command.
+end note
+"helm-type-command" <|- - "helm-M-x-class"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-type-file.png b/doc/helm-figures/helm-type-file.png
new file mode 100644
index 00000000..052cd196
--- /dev/null
+++ b/doc/helm-figures/helm-type-file.png
Binary files differ
diff --git a/doc/helm-figures/helm-type-file.svg b/doc/helm-figures/helm-type-file.svg
new file mode 100644
index 00000000..74215a0b
--- /dev/null
+++ b/doc/helm-figures/helm-type-file.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="411px" preserveAspectRatio="none" style="width:1768px;height:411px;" version="1.1" viewBox="0 0 1768 411" width="1768px" zoomAndPan="magnify"><defs><filter height="300%" id="ff6var1b9e2it" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="768" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="811.5" y="37.6611">'helm-type-file'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="891" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="891" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#ff6var1b9e2it)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="810" y="91.8125"/><ellipse cx="825" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M827.9688,113.4531 Q827.3906,113.75 826.75,113.8906 Q826.1094,114.0469 825.4063,114.0469 Q822.9063,114.0469 821.5781,112.4063 Q820.2656,110.75 820.2656,107.625 Q820.2656,104.5 821.5781,102.8438 Q822.9063,101.1875 825.4063,101.1875 Q826.1094,101.1875 826.75,101.3438 Q827.4063,101.5 827.9688,101.7969 L827.9688,104.5156 Q827.3438,103.9375 826.75,103.6719 Q826.1563,103.3906 825.5313,103.3906 Q824.1875,103.3906 823.5,104.4688 Q822.8125,105.5313 822.8125,107.625 Q822.8125,109.7188 823.5,110.7969 Q824.1875,111.8594 825.5313,111.8594 Q826.1563,111.8594 826.75,111.5938 Q827.3438,111.3125 827.9688,110.7344 L827.9688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="839" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="811" x2="928" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="811" x2="928" y1="131.8125" y2="131.8125"/><!--MD5=[d7d577ca8c64ccce694dba4b3c283648]
+class helm-type-file--><rect fill="#FEFECE" filter="url(#ff6var1b9e2it)" height="92.8164" id="helm-type-file" style="stroke: #A80036; stroke-width: 1.5;" width="162" x="788.5" y="199.8125"/><ellipse cx="817.9" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M820.8688,221.4531 Q820.2906,221.75 819.65,221.8906 Q819.0094,222.0469 818.3063,222.0469 Q815.8063,222.0469 814.4781,220.4063 Q813.1656,218.75 813.1656,215.625 Q813.1656,212.5 814.4781,210.8438 Q815.8063,209.1875 818.3063,209.1875 Q819.0094,209.1875 819.65,209.3438 Q820.3063,209.5 820.8688,209.7969 L820.8688,212.5156 Q820.2438,211.9375 819.65,211.6719 Q819.0563,211.3906 818.4313,211.3906 Q817.0875,211.3906 816.4,212.4688 Q815.7125,213.5313 815.7125,215.625 Q815.7125,217.7188 816.4,218.7969 Q817.0875,219.8594 818.4313,219.8594 Q819.0563,219.8594 819.65,219.5938 Q820.2438,219.3125 820.8688,218.7344 L820.8688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="98" x="835.1" y="219.9668">helm-type-file</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="789.5" x2="949.5" y1="231.8125" y2="231.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="150" x="794.5" y="246.0229">A class to define helm type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="21" x="794.5" y="258.8276">file.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="789.5" x2="949.5" y1="265.4219" y2="265.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="789.5" x2="949.5" y1="267.4219" y2="267.4219"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="789.5" x2="806" y1="279.8242" y2="279.8242"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="806" y="283.1323">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="933" x2="949.5" y1="279.8242" y2="279.8242"/><path d="M985.5,218.8125 L985.5,242.3125 L950.62,246.3125 L985.5,250.3125 L985.5,274.2109 A0,0 0 0 0 985.5,274.2109 L1179.5,274.2109 A0,0 0 0 0 1179.5,274.2109 L1179.5,228.8125 L1169.5,218.8125 L985.5,218.8125 A0,0 0 0 0 985.5,218.8125 " fill="#FBFB77" filter="url(#ff6var1b9e2it)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1169.5,218.8125 L1169.5,228.8125 L1179.5,228.8125 L1169.5,218.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="102" x="991.5" y="235.8794">helm-type-file</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="1093.5" y="235.8794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="173" x="991.5" y="251.0122">A class to define helm type</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="22" x="991.5" y="266.145">file.</text><!--MD5=[acc538c4de58be324c7884953f9df4c3]
+class helm-mac-spotlight-source--><rect fill="#FEFECE" filter="url(#ff6var1b9e2it)" height="48" id="helm-mac-spotlight-source" style="stroke: #A80036; stroke-width: 1.5;" width="221" x="6" y="352.8125"/><ellipse cx="21" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,374.4531 Q23.3906,374.75 22.75,374.8906 Q22.1094,375.0469 21.4063,375.0469 Q18.9063,375.0469 17.5781,373.4063 Q16.2656,371.75 16.2656,368.625 Q16.2656,365.5 17.5781,363.8438 Q18.9063,362.1875 21.4063,362.1875 Q22.1094,362.1875 22.75,362.3438 Q23.4063,362.5 23.9688,362.7969 L23.9688,365.5156 Q23.3438,364.9375 22.75,364.6719 Q22.1563,364.3906 21.5313,364.3906 Q20.1875,364.3906 19.5,365.4688 Q18.8125,366.5313 18.8125,368.625 Q18.8125,370.7188 19.5,371.7969 Q20.1875,372.8594 21.5313,372.8594 Q22.1563,372.8594 22.75,372.5938 Q23.3438,372.3125 23.9688,371.7344 L23.9688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="189" x="35" y="372.9668">helm-mac-spotlight-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="226" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="226" y1="392.8125" y2="392.8125"/><!--MD5=[9c6bffcc58873ff705394a767f912448]
+class helm-files-dired-source--><rect fill="#FEFECE" filter="url(#ff6var1b9e2it)" height="48" id="helm-files-dired-source" style="stroke: #A80036; stroke-width: 1.5;" width="196" x="262.5" y="352.8125"/><ellipse cx="277.5" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M280.4688,374.4531 Q279.8906,374.75 279.25,374.8906 Q278.6094,375.0469 277.9063,375.0469 Q275.4063,375.0469 274.0781,373.4063 Q272.7656,371.75 272.7656,368.625 Q272.7656,365.5 274.0781,363.8438 Q275.4063,362.1875 277.9063,362.1875 Q278.6094,362.1875 279.25,362.3438 Q279.9063,362.5 280.4688,362.7969 L280.4688,365.5156 Q279.8438,364.9375 279.25,364.6719 Q278.6563,364.3906 278.0313,364.3906 Q276.6875,364.3906 276,365.4688 Q275.3125,366.5313 275.3125,368.625 Q275.3125,370.7188 276,371.7969 Q276.6875,372.8594 278.0313,372.8594 Q278.6563,372.8594 279.25,372.5938 Q279.8438,372.3125 280.4688,371.7344 L280.4688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="164" x="291.5" y="372.9668">helm-files-dired-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="263.5" x2="457.5" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="263.5" x2="457.5" y1="392.8125" y2="392.8125"/><!--MD5=[b49d18483e901ae1bf6135ad896f4fad]
+class helm-files-in-current-dir-source--><rect fill="#FEFECE" filter="url(#ff6var1b9e2it)" height="48" id="helm-files-in-current-dir-source" style="stroke: #A80036; stroke-width: 1.5;" width="253" x="494" y="352.8125"/><ellipse cx="509" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M511.9688,374.4531 Q511.3906,374.75 510.75,374.8906 Q510.1094,375.0469 509.4063,375.0469 Q506.9063,375.0469 505.5781,373.4063 Q504.2656,371.75 504.2656,368.625 Q504.2656,365.5 505.5781,363.8438 Q506.9063,362.1875 509.4063,362.1875 Q510.1094,362.1875 510.75,362.3438 Q511.4063,362.5 511.9688,362.7969 L511.9688,365.5156 Q511.3438,364.9375 510.75,364.6719 Q510.1563,364.3906 509.5313,364.3906 Q508.1875,364.3906 507.5,365.4688 Q506.8125,366.5313 506.8125,368.625 Q506.8125,370.7188 507.5,371.7969 Q508.1875,372.8594 509.5313,372.8594 Q510.1563,372.8594 510.75,372.5938 Q511.3438,372.3125 511.9688,371.7344 L511.9688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="221" x="523" y="372.9668">helm-files-in-current-dir-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="495" x2="746" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="495" x2="746" y1="392.8125" y2="392.8125"/><!--MD5=[f9787a7e913788f0fbbca93390d6041a]
+class helm-recentf-source--><rect fill="#FEFECE" filter="url(#ff6var1b9e2it)" height="48" id="helm-recentf-source" style="stroke: #A80036; stroke-width: 1.5;" width="175" x="782" y="352.8125"/><ellipse cx="797" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M799.9688,374.4531 Q799.3906,374.75 798.75,374.8906 Q798.1094,375.0469 797.4063,375.0469 Q794.9063,375.0469 793.5781,373.4063 Q792.2656,371.75 792.2656,368.625 Q792.2656,365.5 793.5781,363.8438 Q794.9063,362.1875 797.4063,362.1875 Q798.1094,362.1875 798.75,362.3438 Q799.4063,362.5 799.9688,362.7969 L799.9688,365.5156 Q799.3438,364.9375 798.75,364.6719 Q798.1563,364.3906 797.5313,364.3906 Q796.1875,364.3906 795.5,365.4688 Q794.8125,366.5313 794.8125,368.625 Q794.8125,370.7188 795.5,371.7969 Q796.1875,372.8594 797.5313,372.8594 Q798.1563,372.8594 798.75,372.5938 Q799.3438,372.3125 799.9688,371.7344 L799.9688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="143" x="811" y="372.9668">helm-recentf-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="783" x2="956" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="783" x2="956" y1="392.8125" y2="392.8125"/><!--MD5=[11858bbdb8c329cf3bf1e5498cb0b794]
+class helm-file-cache--><rect fill="#FEFECE" filter="url(#ff6var1b9e2it)" height="48" id="helm-file-cache" style="stroke: #A80036; stroke-width: 1.5;" width="139" x="992" y="352.8125"/><ellipse cx="1007" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1009.9688,374.4531 Q1009.3906,374.75 1008.75,374.8906 Q1008.1094,375.0469 1007.4063,375.0469 Q1004.9063,375.0469 1003.5781,373.4063 Q1002.2656,371.75 1002.2656,368.625 Q1002.2656,365.5 1003.5781,363.8438 Q1004.9063,362.1875 1007.4063,362.1875 Q1008.1094,362.1875 1008.75,362.3438 Q1009.4063,362.5 1009.9688,362.7969 L1009.9688,365.5156 Q1009.3438,364.9375 1008.75,364.6719 Q1008.1563,364.3906 1007.5313,364.3906 Q1006.1875,364.3906 1005.5,365.4688 Q1004.8125,366.5313 1004.8125,368.625 Q1004.8125,370.7188 1005.5,371.7969 Q1006.1875,372.8594 1007.5313,372.8594 Q1008.1563,372.8594 1008.75,372.5938 Q1009.3438,372.3125 1009.9688,371.7344 L1009.9688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="107" x="1021" y="372.9668">helm-file-cache</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="993" x2="1130" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="993" x2="1130" y1="392.8125" y2="392.8125"/><!--MD5=[473c7582700aad271b06bfe20c99b25e]
+class helm-browse-project-override-inheritor--><rect fill="#FEFECE" filter="url(#ff6var1b9e2it)" height="48" id="helm-browse-project-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="310" x="1166.5" y="352.8125"/><ellipse cx="1181.5" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1184.4688,374.4531 Q1183.8906,374.75 1183.25,374.8906 Q1182.6094,375.0469 1181.9063,375.0469 Q1179.4063,375.0469 1178.0781,373.4063 Q1176.7656,371.75 1176.7656,368.625 Q1176.7656,365.5 1178.0781,363.8438 Q1179.4063,362.1875 1181.9063,362.1875 Q1182.6094,362.1875 1183.25,362.3438 Q1183.9063,362.5 1184.4688,362.7969 L1184.4688,365.5156 Q1183.8438,364.9375 1183.25,364.6719 Q1182.6563,364.3906 1182.0313,364.3906 Q1180.6875,364.3906 1180,365.4688 Q1179.3125,366.5313 1179.3125,368.625 Q1179.3125,370.7188 1180,371.7969 Q1180.6875,372.8594 1182.0313,372.8594 Q1182.6563,372.8594 1183.25,372.5938 Q1183.8438,372.3125 1184.4688,371.7344 L1184.4688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="278" x="1195.5" y="372.9668">helm-browse-project-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1167.5" x2="1475.5" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1167.5" x2="1475.5" y1="392.8125" y2="392.8125"/><!--MD5=[2e3d3b2922e1daf59c103872c87a469e]
+class helm-locate-override-inheritor--><rect fill="#FEFECE" filter="url(#ff6var1b9e2it)" height="48" id="helm-locate-override-inheritor" style="stroke: #A80036; stroke-width: 1.5;" width="246" x="1511.5" y="352.8125"/><ellipse cx="1526.5" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1529.4688,374.4531 Q1528.8906,374.75 1528.25,374.8906 Q1527.6094,375.0469 1526.9063,375.0469 Q1524.4063,375.0469 1523.0781,373.4063 Q1521.7656,371.75 1521.7656,368.625 Q1521.7656,365.5 1523.0781,363.8438 Q1524.4063,362.1875 1526.9063,362.1875 Q1527.6094,362.1875 1528.25,362.3438 Q1528.9063,362.5 1529.4688,362.7969 L1529.4688,365.5156 Q1528.8438,364.9375 1528.25,364.6719 Q1527.6563,364.3906 1527.0313,364.3906 Q1525.6875,364.3906 1525,365.4688 Q1524.3125,366.5313 1524.3125,368.625 Q1524.3125,370.7188 1525,371.7969 Q1525.6875,372.8594 1527.0313,372.8594 Q1527.6563,372.8594 1528.25,372.5938 Q1528.8438,372.3125 1529.4688,371.7344 L1529.4688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="214" x="1540.5" y="372.9668">helm-locate-override-inheritor</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1512.5" x2="1756.5" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1512.5" x2="1756.5" y1="392.8125" y2="392.8125"/><!--MD5=[4dcf8b063d240b570d0bdaa319fd46e4]
+reverse link helm-source to helm-type-file--><path d="M869.5,160.4125 C869.5,173.0325 869.5,186.8425 869.5,199.5825 " fill="none" id="helm-source&lt;-helm-type-file" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="862.5,160.0825,869.5,140.0825,876.5,160.0825,862.5,160.0825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[a474bc848475b2374c1d2bb84f271e9b]
+reverse link helm-type-file to helm-mac-spotlight-source--><path d="M768.27,264.0625 C644.62,284.6025 429.09,320.6525 244.5,352.8125 C238.83,353.8025 233.02,354.8225 227.15,355.8525 " fill="none" id="helm-type-file&lt;-helm-mac-spotlight-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="767.17,257.1525,788.05,260.7825,769.47,270.9625,767.17,257.1525" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[05800070c5d625a950fe67b1123c2019]
+reverse link helm-type-file to helm-files-dired-source--><path d="M768.7,272.7625 C676.38,296.0625 540.92,330.2625 451.74,352.7825 " fill="none" id="helm-type-file&lt;-helm-files-dired-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="767.18,265.9225,788.28,267.8125,770.61,279.5025,767.18,265.9225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[3570d02ac558741aaeedfaae7abb82a0]
+reverse link helm-type-file to helm-files-in-current-dir-source--><path d="M770.21,298.5525 C733.86,317.3125 694.51,337.6125 665.29,352.7025 " fill="none" id="helm-type-file&lt;-helm-files-in-current-dir-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="767.33,292.1625,788.31,289.2125,773.75,304.6025,767.33,292.1625" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[c214b1996ffa22e8ee90459314819dd7]
+reverse link helm-type-file to helm-recentf-source--><path d="M869.5,313.4125 C869.5,327.5125 869.5,341.5025 869.5,352.6425 " fill="none" id="helm-type-file&lt;-helm-recentf-source" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="862.5,312.9825,869.5,292.9825,876.5,312.9825,862.5,312.9825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[20fb0892ad389f5d9224faeaf3fbf8f9]
+reverse link helm-type-file to helm-file-cache--><path d="M954.68,304.3225 C980.15,321.3625 1006.65,339.1025 1026.88,352.6425 " fill="none" id="helm-type-file&lt;-helm-file-cache" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="950.46,309.9225,937.73,292.9825,958.25,298.2825,950.46,309.9225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[7dce46f1711674df8238e0c6e8679f53]
+reverse link helm-type-file to helm-browse-project-override-inheritor--><path d="M969.6,292.6425 C1054.4,321.0625 1132.88,339.5825 1196.44,352.7625 " fill="none" id="helm-type-file&lt;-helm-browse-project-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="967.21,299.2225,950.55,286.1225,971.74,285.9725,967.21,299.2225" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[ea3943677655752665563907a8ed1189]
+reverse link helm-type-file to helm-locate-override-inheritor--><path d="M969.9,292.3625 C1198.81,354.2025 1267.71,321.2725 1494.5,352.8125 C1499.99,353.5725 1505.59,354.3825 1511.25,355.2225 " fill="none" id="helm-type-file&lt;-helm-locate-override-inheritor" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="967.99,299.0925,950.58,287.0225,971.72,285.6025,967.99,299.0925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[f161b674adc892f9bea226323700e36f]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-file'**\n\n
+"helm-source" <|- - "helm-type-file"
+class "helm-source"
+class "helm-type-file" {
+ A class to define helm type
+ file.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-file"
+ **helm-type-file**:
+ A class to define helm type
+ file.
+end note
+"helm-type-file" <|- - "helm-mac-spotlight-source"
+"helm-type-file" <|- - "helm-files-dired-source"
+"helm-type-file" <|- - "helm-files-in-current-dir-source"
+"helm-type-file" <|- - "helm-recentf-source"
+"helm-type-file" <|- - "helm-file-cache"
+"helm-type-file" <|- - "helm-browse-project-override-inheritor"
+"helm-type-file" <|- - "helm-locate-override-inheritor"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-type-function.png b/doc/helm-figures/helm-type-function.png
new file mode 100644
index 00000000..6ea89caf
--- /dev/null
+++ b/doc/helm-figures/helm-type-function.png
Binary files differ
diff --git a/doc/helm-figures/helm-type-function.svg b/doc/helm-figures/helm-type-function.svg
new file mode 100644
index 00000000..8610e22a
--- /dev/null
+++ b/doc/helm-figures/helm-type-function.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="303px" preserveAspectRatio="none" style="width:413px;height:303px;" version="1.1" viewBox="0 0 413 303" width="413px" zoomAndPan="magnify"><defs><filter height="300%" id="f1mjft7fad5upw" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="89.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="206" x="106.5" y="37.6611">'helm-type-function'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="212.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="212.5" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#f1mjft7fad5upw)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="29.5" y="91.8125"/><ellipse cx="44.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M47.4688,113.4531 Q46.8906,113.75 46.25,113.8906 Q45.6094,114.0469 44.9063,114.0469 Q42.4063,114.0469 41.0781,112.4063 Q39.7656,110.75 39.7656,107.625 Q39.7656,104.5 41.0781,102.8438 Q42.4063,101.1875 44.9063,101.1875 Q45.6094,101.1875 46.25,101.3438 Q46.9063,101.5 47.4688,101.7969 L47.4688,104.5156 Q46.8438,103.9375 46.25,103.6719 Q45.6563,103.3906 45.0313,103.3906 Q43.6875,103.3906 43,104.4688 Q42.3125,105.5313 42.3125,107.625 Q42.3125,109.7188 43,110.7969 Q43.6875,111.8594 45.0313,111.8594 Q45.6563,111.8594 46.25,111.5938 Q46.8438,111.3125 47.4688,110.7344 L47.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="58.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="30.5" x2="147.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="30.5" x2="147.5" y1="131.8125" y2="131.8125"/><!--MD5=[e7e10cea49efd04a6bea9ed9f44f1841]
+class helm-type-function--><rect fill="#FEFECE" filter="url(#f1mjft7fad5upw)" height="92.8164" id="helm-type-function" style="stroke: #A80036; stroke-width: 1.5;" width="166" x="6" y="199.8125"/><ellipse cx="21" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,221.4531 Q23.3906,221.75 22.75,221.8906 Q22.1094,222.0469 21.4063,222.0469 Q18.9063,222.0469 17.5781,220.4063 Q16.2656,218.75 16.2656,215.625 Q16.2656,212.5 17.5781,210.8438 Q18.9063,209.1875 21.4063,209.1875 Q22.1094,209.1875 22.75,209.3438 Q23.4063,209.5 23.9688,209.7969 L23.9688,212.5156 Q23.3438,211.9375 22.75,211.6719 Q22.1563,211.3906 21.5313,211.3906 Q20.1875,211.3906 19.5,212.4688 Q18.8125,213.5313 18.8125,215.625 Q18.8125,217.7188 19.5,218.7969 Q20.1875,219.8594 21.5313,219.8594 Q22.1563,219.8594 22.75,219.5938 Q23.3438,219.3125 23.9688,218.7344 L23.9688,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="134" x="35" y="219.9668">helm-type-function</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="171" y1="231.8125" y2="231.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="150" x="12" y="246.0229">A class to define helm type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="49" x="12" y="258.8276">function.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="7" x2="171" y1="265.4219" y2="265.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="7" x2="171" y1="267.4219" y2="267.4219"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="25.5" y1="279.8242" y2="279.8242"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="25.5" y="283.1323">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="152.5" x2="171" y1="279.8242" y2="279.8242"/><path d="M207,218.8125 L207,242.3125 L172.14,246.3125 L207,250.3125 L207,274.2109 A0,0 0 0 0 207,274.2109 L401,274.2109 A0,0 0 0 0 401,274.2109 L401,228.8125 L391,218.8125 L207,218.8125 A0,0 0 0 0 207,218.8125 " fill="#FBFB77" filter="url(#f1mjft7fad5upw)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M391,218.8125 L391,228.8125 L401,228.8125 L391,218.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="139" x="213" y="235.8794">helm-type-function</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="352" y="235.8794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="173" x="213" y="251.0122">A class to define helm type</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="55" x="213" y="266.145">function.</text><!--MD5=[cb8c671e8f25dea26b71b20786c595d4]
+reverse link helm-source to helm-type-function--><path d="M89,160.4125 C89,173.0325 89,186.8425 89,199.5825 " fill="none" id="helm-source&lt;-helm-type-function" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="82,160.0825,89,140.0825,96,160.0825,82,160.0825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[41647364c12015674602e36cc85d91a6]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-function'**\n\n
+"helm-source" <|- - "helm-type-function"
+class "helm-source"
+class "helm-type-function" {
+ A class to define helm type
+ function.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-function"
+ **helm-type-function**:
+ A class to define helm type
+ function.
+end note
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-figures/helm-type-timers.png b/doc/helm-figures/helm-type-timers.png
new file mode 100644
index 00000000..e7c3794a
--- /dev/null
+++ b/doc/helm-figures/helm-type-timers.png
Binary files differ
diff --git a/doc/helm-figures/helm-type-timers.svg b/doc/helm-figures/helm-type-timers.svg
new file mode 100644
index 00000000..6acd471b
--- /dev/null
+++ b/doc/helm-figures/helm-type-timers.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="411px" preserveAspectRatio="none" style="width:579px;height:411px;" version="1.1" viewBox="0 0 579 411" width="579px" zoomAndPan="magnify"><defs><filter height="300%" id="fi9dpor0vd2ar" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="240" x="172.5" y="16.708">Parents and Children of</text><text fill="#000000" font-family="sans-serif" font-size="18" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="186" x="199.5" y="37.6611">'helm-type-timers'</text><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="295.5" y="58.6143"/><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacingAndGlyphs" textLength="0" x="295.5" y="79.5674"/><!--MD5=[8da85e6ec6935d54267014e974a66b51]
+class helm-source--><rect fill="#FEFECE" filter="url(#fi9dpor0vd2ar)" height="48" id="helm-source" style="stroke: #A80036; stroke-width: 1.5;" width="119" x="197.5" y="91.8125"/><ellipse cx="212.5" cy="107.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M215.4688,113.4531 Q214.8906,113.75 214.25,113.8906 Q213.6094,114.0469 212.9063,114.0469 Q210.4063,114.0469 209.0781,112.4063 Q207.7656,110.75 207.7656,107.625 Q207.7656,104.5 209.0781,102.8438 Q210.4063,101.1875 212.9063,101.1875 Q213.6094,101.1875 214.25,101.3438 Q214.9063,101.5 215.4688,101.7969 L215.4688,104.5156 Q214.8438,103.9375 214.25,103.6719 Q213.6563,103.3906 213.0313,103.3906 Q211.6875,103.3906 211,104.4688 Q210.3125,105.5313 210.3125,107.625 Q210.3125,109.7188 211,110.7969 Q211.6875,111.8594 213.0313,111.8594 Q213.6563,111.8594 214.25,111.5938 Q214.8438,111.3125 215.4688,110.7344 L215.4688,113.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="87" x="226.5" y="111.9668">helm-source</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="198.5" x2="315.5" y1="123.8125" y2="123.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="198.5" x2="315.5" y1="131.8125" y2="131.8125"/><!--MD5=[d89fbe3a66aa0ad58442d3fbb0e3c04d]
+class helm-type-timers--><rect fill="#FEFECE" filter="url(#fi9dpor0vd2ar)" height="92.8164" id="helm-type-timers" style="stroke: #A80036; stroke-width: 1.5;" width="162" x="176" y="199.8125"/><ellipse cx="195.05" cy="215.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M198.0188,221.4531 Q197.4406,221.75 196.8,221.8906 Q196.1594,222.0469 195.4563,222.0469 Q192.9563,222.0469 191.6281,220.4063 Q190.3156,218.75 190.3156,215.625 Q190.3156,212.5 191.6281,210.8438 Q192.9563,209.1875 195.4563,209.1875 Q196.1594,209.1875 196.8,209.3438 Q197.4563,209.5 198.0188,209.7969 L198.0188,212.5156 Q197.3938,211.9375 196.8,211.6719 Q196.2063,211.3906 195.5813,211.3906 Q194.2375,211.3906 193.55,212.4688 Q192.8625,213.5313 192.8625,215.625 Q192.8625,217.7188 193.55,218.7969 Q194.2375,219.8594 195.5813,219.8594 Q196.2063,219.8594 196.8,219.5938 Q197.3938,219.3125 198.0188,218.7344 L198.0188,221.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="121" x="209.95" y="219.9668">helm-type-timers</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="177" x2="337" y1="231.8125" y2="231.8125"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="150" x="182" y="246.0229">A class to define helm type</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="41" x="182" y="258.8276">timers.</text><line style="stroke: #A80036; stroke-width: 1.0;" x1="177" x2="337" y1="265.4219" y2="265.4219"/><line style="stroke: #A80036; stroke-width: 1.0;" x1="177" x2="337" y1="267.4219" y2="267.4219"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="177" x2="193.5" y1="279.8242" y2="279.8242"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="127" x="193.5" y="283.1323">some interesting slots</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="320.5" x2="337" y1="279.8242" y2="279.8242"/><path d="M373,218.8125 L373,242.3125 L338.12,246.3125 L373,250.3125 L373,274.2109 A0,0 0 0 0 373,274.2109 L567,274.2109 A0,0 0 0 0 567,274.2109 L567,228.8125 L557,218.8125 L373,218.8125 A0,0 0 0 0 373,218.8125 " fill="#FBFB77" filter="url(#fi9dpor0vd2ar)" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M557,218.8125 L557,228.8125 L567,228.8125 L557,218.8125 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="126" x="379" y="235.8794">helm-type-timers</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="4" x="505" y="235.8794">:</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="173" x="379" y="251.0122">A class to define helm type</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="45" x="379" y="266.145">timers.</text><!--MD5=[65c9e2a5e033ac2de329b35010304c74]
+class helm-idle-time-timers-class--><rect fill="#FEFECE" filter="url(#fi9dpor0vd2ar)" height="48" id="helm-idle-time-timers-class" style="stroke: #A80036; stroke-width: 1.5;" width="224" x="6" y="352.8125"/><ellipse cx="21" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M23.9688,374.4531 Q23.3906,374.75 22.75,374.8906 Q22.1094,375.0469 21.4063,375.0469 Q18.9063,375.0469 17.5781,373.4063 Q16.2656,371.75 16.2656,368.625 Q16.2656,365.5 17.5781,363.8438 Q18.9063,362.1875 21.4063,362.1875 Q22.1094,362.1875 22.75,362.3438 Q23.4063,362.5 23.9688,362.7969 L23.9688,365.5156 Q23.3438,364.9375 22.75,364.6719 Q22.1563,364.3906 21.5313,364.3906 Q20.1875,364.3906 19.5,365.4688 Q18.8125,366.5313 18.8125,368.625 Q18.8125,370.7188 19.5,371.7969 Q20.1875,372.8594 21.5313,372.8594 Q22.1563,372.8594 22.75,372.5938 Q23.3438,372.3125 23.9688,371.7344 L23.9688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="192" x="35" y="372.9668">helm-idle-time-timers-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="229" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="229" y1="392.8125" y2="392.8125"/><!--MD5=[b0e60113aba2bebbe59d6cbba30a4a7f]
+class helm-absolute-time-timers-class--><rect fill="#FEFECE" filter="url(#fi9dpor0vd2ar)" height="48" id="helm-absolute-time-timers-class" style="stroke: #A80036; stroke-width: 1.5;" width="261" x="265.5" y="352.8125"/><ellipse cx="280.5" cy="368.8125" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M283.4688,374.4531 Q282.8906,374.75 282.25,374.8906 Q281.6094,375.0469 280.9063,375.0469 Q278.4063,375.0469 277.0781,373.4063 Q275.7656,371.75 275.7656,368.625 Q275.7656,365.5 277.0781,363.8438 Q278.4063,362.1875 280.9063,362.1875 Q281.6094,362.1875 282.25,362.3438 Q282.9063,362.5 283.4688,362.7969 L283.4688,365.5156 Q282.8438,364.9375 282.25,364.6719 Q281.6563,364.3906 281.0313,364.3906 Q279.6875,364.3906 279,365.4688 Q278.3125,366.5313 278.3125,368.625 Q278.3125,370.7188 279,371.7969 Q279.6875,372.8594 281.0313,372.8594 Q281.6563,372.8594 282.25,372.5938 Q282.8438,372.3125 283.4688,371.7344 L283.4688,374.4531 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="229" x="294.5" y="372.9668">helm-absolute-time-timers-class</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="266.5" x2="525.5" y1="384.8125" y2="384.8125"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="266.5" x2="525.5" y1="392.8125" y2="392.8125"/><!--MD5=[687fc8ec140e945488f732dae3c46e2b]
+reverse link helm-source to helm-type-timers--><path d="M257,160.4125 C257,173.0325 257,186.8425 257,199.5825 " fill="none" id="helm-source&lt;-helm-type-timers" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="250,160.0825,257,140.0825,264,160.0825,250,160.0825" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[f7040a49218bb3669d1c90cd85142f6d]
+reverse link helm-type-timers to helm-idle-time-timers-class--><path d="M192.68,306.7725 C175.07,323.0525 157.01,339.7525 143.06,352.6425 " fill="none" id="helm-type-timers&lt;-helm-idle-time-timers-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="188.16,301.4125,207.6,292.9825,197.67,311.6925,188.16,301.4125" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[69966f233324ab1b41ca6bc5703528d7]
+reverse link helm-type-timers to helm-absolute-time-timers-class--><path d="M321.32,306.7725 C338.93,323.0525 356.99,339.7525 370.94,352.6425 " fill="none" id="helm-type-timers&lt;-helm-absolute-time-timers-class" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="316.33,311.6925,306.4,292.9825,325.84,301.4125,316.33,311.6925" style="stroke: #A80036; stroke-width: 1.0;"/><!--MD5=[d3375284f3586b03537d153f4c9a45f6]
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-timers'**\n\n
+"helm-source" <|- - "helm-type-timers"
+class "helm-source"
+class "helm-type-timers" {
+ A class to define helm type
+ timers.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-timers"
+ **helm-type-timers**:
+ A class to define helm type
+ timers.
+end note
+"helm-type-timers" <|- - "helm-idle-time-timers-class"
+"helm-type-timers" <|- - "helm-absolute-time-timers-class"
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 15:52:07 IST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.11-ea+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: IN
+--></g></svg> \ No newline at end of file
diff --git a/doc/helm-file-cache.plantuml b/doc/helm-file-cache.plantuml
new file mode 100644
index 00000000..a48f33db
--- /dev/null
+++ b/doc/helm-file-cache.plantuml
@@ -0,0 +1,28 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-file-cache'**\n\n
+"helm-source-in-buffer" <|-- "helm-file-cache"
+"helm-type-file" <|-- "helm-file-cache"
+class "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-type-file"
+"helm-source" <|-- "helm-type-file"
+class "helm-source"
+class "helm-file-cache" {
+ __ some interesting slots __
+ init
+ candidates
+ data
+ get-line
+ match
+ migemo
+ search
+ search-strict
+ volatile
+}
+note right of "helm-file-cache"
+ **helm-file-cache**
+end note
+@enduml
diff --git a/doc/helm-files-dired-source.plantuml b/doc/helm-files-dired-source.plantuml
new file mode 100644
index 00000000..89ab14c5
--- /dev/null
+++ b/doc/helm-files-dired-source.plantuml
@@ -0,0 +1,23 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-files-dired-source'**\n\n
+"helm-source-sync" <|-- "helm-files-dired-source"
+"helm-type-file" <|-- "helm-files-dired-source"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-type-file"
+"helm-source" <|-- "helm-type-file"
+class "helm-source"
+class "helm-files-dired-source" {
+ __ some interesting slots __
+ candidates
+ match-dynamic
+ match-strict
+ migemo
+}
+note right of "helm-files-dired-source"
+ **helm-files-dired-source**
+end note
+@enduml
diff --git a/doc/helm-files-in-current-dir-source.plantuml b/doc/helm-files-in-current-dir-source.plantuml
new file mode 100644
index 00000000..da5e4f2b
--- /dev/null
+++ b/doc/helm-files-in-current-dir-source.plantuml
@@ -0,0 +1,26 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-files-in-current-dir-source'**\n\n
+"helm-source-sync" <|-- "helm-files-in-current-dir-source"
+"helm-type-file" <|-- "helm-files-in-current-dir-source"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-type-file"
+"helm-source" <|-- "helm-type-file"
+class "helm-source"
+class "helm-files-in-current-dir-source" {
+ __ some interesting slots __
+ candidates
+ fuzzy-match
+ match-dynamic
+ match-part
+ match-strict
+ migemo
+ pattern-transformer
+}
+note right of "helm-files-in-current-dir-source"
+ **helm-files-in-current-dir-source**
+end note
+@enduml
diff --git a/doc/helm-gid-source.plantuml b/doc/helm-gid-source.plantuml
new file mode 100644
index 00000000..f5958d13
--- /dev/null
+++ b/doc/helm-gid-source.plantuml
@@ -0,0 +1,26 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-gid-source'**\n\n
+"helm-source-async" <|-- "helm-gid-source"
+class "helm-source-async"
+"helm-source" <|-- "helm-source-async"
+class "helm-source"
+class "helm-gid-source" {
+ __ some interesting slots __
+ action
+ candidate-number-limit
+ candidates-process
+ db-dir
+ filtered-candidate-transformer
+ header-name
+ help-message
+ history
+ nohighlight
+ persistent-action
+ requires-pattern
+}
+note right of "helm-gid-source"
+ **helm-gid-source**
+end note
+@enduml
diff --git a/doc/helm-grep-ag-class.plantuml b/doc/helm-grep-ag-class.plantuml
new file mode 100644
index 00000000..32d98715
--- /dev/null
+++ b/doc/helm-grep-ag-class.plantuml
@@ -0,0 +1,28 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-grep-ag-class'**\n\n
+"helm-source-async" <|-- "helm-grep-ag-class"
+class "helm-source-async"
+"helm-source" <|-- "helm-source-async"
+class "helm-source"
+class "helm-grep-ag-class" {
+ __ some interesting slots __
+ action
+ candidate-number-limit
+ filtered-candidate-transformer
+ group
+ help-message
+ history
+ keymap
+ nohighlight
+ nomark
+ pcre
+ persistent-action
+ persistent-help
+ requires-pattern
+}
+note right of "helm-grep-ag-class"
+ **helm-grep-ag-class**
+end note
+@enduml
diff --git a/doc/helm-grep-class.plantuml b/doc/helm-grep-class.plantuml
new file mode 100644
index 00000000..17bf4759
--- /dev/null
+++ b/doc/helm-grep-class.plantuml
@@ -0,0 +1,32 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-grep-class'**\n\n
+"helm-source-async" <|-- "helm-grep-class"
+class "helm-source-async"
+"helm-source" <|-- "helm-source-async"
+class "helm-source"
+class "helm-grep-class" {
+ __ some interesting slots __
+ action
+ after-init-hook
+ backend
+ before-init-hook
+ candidate-number-limit
+ candidates-process
+ filtered-candidate-transformer
+ group
+ help-message
+ history
+ keymap
+ nohighlight
+ nomark
+ pcre
+ persistent-action
+ persistent-help
+ requires-pattern
+}
+note right of "helm-grep-class"
+ **helm-grep-class**
+end note
+@enduml
diff --git a/doc/helm-idle-time-timers-class.plantuml b/doc/helm-idle-time-timers-class.plantuml
new file mode 100644
index 00000000..388c72d2
--- /dev/null
+++ b/doc/helm-idle-time-timers-class.plantuml
@@ -0,0 +1,25 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-idle-time-timers-class'**\n\n
+"helm-source-sync" <|-- "helm-idle-time-timers-class"
+"helm-type-timers" <|-- "helm-idle-time-timers-class"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-type-timers"
+"helm-source" <|-- "helm-type-timers"
+class "helm-source"
+class "helm-idle-time-timers-class" {
+ __ some interesting slots __
+ allow-dups
+ candidate-transformer
+ candidates
+ match-dynamic
+ match-strict
+ migemo
+}
+note right of "helm-idle-time-timers-class"
+ **helm-idle-time-timers-class**
+end note
+@enduml
diff --git a/doc/helm-imenu-source.plantuml b/doc/helm-imenu-source.plantuml
new file mode 100644
index 00000000..02805ffa
--- /dev/null
+++ b/doc/helm-imenu-source.plantuml
@@ -0,0 +1,24 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-imenu-source'**\n\n
+"helm-source-sync" <|-- "helm-imenu-source"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-imenu-source" {
+ __ some interesting slots __
+ action
+ candidate-transformer
+ candidates
+ group
+ help-message
+ keymap
+ nomark
+ persistent-action
+ persistent-help
+}
+note right of "helm-imenu-source"
+ **helm-imenu-source**
+end note
+@enduml
diff --git a/doc/helm-info-source.plantuml b/doc/helm-info-source.plantuml
new file mode 100644
index 00000000..1635bd30
--- /dev/null
+++ b/doc/helm-info-source.plantuml
@@ -0,0 +1,20 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-info-source'**\n\n
+"helm-source-in-buffer" <|-- "helm-info-source"
+class "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-info-source" {
+ __ some interesting slots __
+ init
+ action
+ display-to-real
+ get-line
+ info-file
+}
+note right of "helm-info-source"
+ **helm-info-source**
+end note
+@enduml
diff --git a/doc/helm-list-el-package-source.plantuml b/doc/helm-list-el-package-source.plantuml
new file mode 100644
index 00000000..598b2e8d
--- /dev/null
+++ b/doc/helm-list-el-package-source.plantuml
@@ -0,0 +1,25 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-list-el-package-source'**\n\n
+"helm-source-in-buffer" <|-- "helm-list-el-package-source"
+class "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-list-el-package-source" {
+ __ some interesting slots __
+ init
+ action
+ action-transformer
+ candidate-number-limit
+ filtered-candidate-transformer
+ get-line
+ group
+ help-message
+ keymap
+ update
+}
+note right of "helm-list-el-package-source"
+ **helm-list-el-package-source**
+end note
+@enduml
diff --git a/doc/helm-locate-override-inheritor.plantuml b/doc/helm-locate-override-inheritor.plantuml
new file mode 100644
index 00000000..61d74f96
--- /dev/null
+++ b/doc/helm-locate-override-inheritor.plantuml
@@ -0,0 +1,16 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-locate-override-inheritor'**\n\n
+"helm-type-file" <|-- "helm-locate-override-inheritor"
+class "helm-type-file"
+"helm-source" <|-- "helm-type-file"
+class "helm-source"
+class "helm-locate-override-inheritor" {
+ __ some interesting slots __
+}
+note right of "helm-locate-override-inheritor"
+ **helm-locate-override-inheritor**
+end note
+"helm-locate-override-inheritor" <|-- "helm-locate-source"
+@enduml
diff --git a/doc/helm-locate-source.plantuml b/doc/helm-locate-source.plantuml
new file mode 100644
index 00000000..333fe4dd
--- /dev/null
+++ b/doc/helm-locate-source.plantuml
@@ -0,0 +1,30 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-locate-source'**\n\n
+"helm-source-async" <|-- "helm-locate-source"
+"helm-locate-override-inheritor" <|-- "helm-locate-source"
+class "helm-source-async"
+"helm-source" <|-- "helm-source-async"
+class "helm-source"
+class "helm-locate-override-inheritor"
+"helm-type-file" <|-- "helm-locate-override-inheritor"
+class "helm-type-file"
+"helm-source" <|-- "helm-type-file"
+class "helm-source"
+class "helm-locate-source" {
+ __ some interesting slots __
+ init
+ candidate-number-limit
+ candidates-process
+ group
+ history
+ multimatch
+ persistent-action
+ redisplay
+ requires-pattern
+}
+note right of "helm-locate-source"
+ **helm-locate-source**
+end note
+@enduml
diff --git a/doc/helm-locate-subdirs-source.plantuml b/doc/helm-locate-subdirs-source.plantuml
new file mode 100644
index 00000000..47d7bb92
--- /dev/null
+++ b/doc/helm-locate-subdirs-source.plantuml
@@ -0,0 +1,19 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-locate-subdirs-source'**\n\n
+"helm-source-in-buffer" <|-- "helm-locate-subdirs-source"
+class "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-locate-subdirs-source" {
+ __ some interesting slots __
+ basedir
+ data
+ group
+ subdir
+}
+note right of "helm-locate-subdirs-source"
+ **helm-locate-subdirs-source**
+end note
+@enduml
diff --git a/doc/helm-mac-spotlight-source.plantuml b/doc/helm-mac-spotlight-source.plantuml
new file mode 100644
index 00000000..59a4033a
--- /dev/null
+++ b/doc/helm-mac-spotlight-source.plantuml
@@ -0,0 +1,22 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-mac-spotlight-source'**\n\n
+"helm-source-async" <|-- "helm-mac-spotlight-source"
+"helm-type-file" <|-- "helm-mac-spotlight-source"
+class "helm-source-async"
+"helm-source" <|-- "helm-source-async"
+class "helm-source"
+class "helm-type-file"
+"helm-source" <|-- "helm-type-file"
+class "helm-source"
+class "helm-mac-spotlight-source" {
+ __ some interesting slots __
+ candidates-process
+ multimatch
+ requires-pattern
+}
+note right of "helm-mac-spotlight-source"
+ **helm-mac-spotlight-source**
+end note
+@enduml
diff --git a/doc/helm-manual-1.org b/doc/helm-manual-1.org
new file mode 100644
index 00000000..a7803350
--- /dev/null
+++ b/doc/helm-manual-1.org
@@ -0,0 +1,935 @@
+#+title: Helm Wiki
+# #+subtitle: Release {{{version}}}
+#+subtitle: Release 3.6.2
+#+author: The Helm Developers
+# #+date: {{{modification-time}}}
+#+language: en
+
+# #+texinfo: @insertcopying
+
+* Table Of Contents :TOC_4:
+- [[#requirements][Requirements]]
+- [[#download][Download]]
+- [[#installation-upgrade-and-configuration][Installation, Upgrade, and Configuration]]
+ - [[#minimal-setup-using-straightel][Minimal setup using =straight.el=]]
+ - [[#minimal-setup-using-source][Minimal setup using source]]
+ - [[#minimal-setup-using-the-package-manager][Minimal setup using the Package Manager]]
+- [[#introduction][Introduction]]
+- [[#helm-completion-vs-emacs-completion][Helm Completion v.s. Emacs Completion]]
+ - [[#helm-interaction-model][Helm interaction model]]
+- [[#general-helm-commands][General Helm Commands]]
+ - [[#yanking-text][Yanking text]]
+- [[#preconfigured-helm-commands][Preconfigured Helm Commands]]
+- [[#helm-mode][Helm Mode]]
+ - [[#customize-helm-mode][Customize helm-mode]]
+ - [[#use-helm-mode-and-ido-mode][Use helm-mode and ido-mode]]
+- [[#helm-with-other-emacs-extensions][Helm With Other Emacs Extensions]]
+ - [[#linum-relative][linum-relative]]
+- [[#helm-workflow-for-files-directories-and-buffers][Helm Workflow for Files, Directories and Buffers]]
+- [[#quick-try-with-emacs-helmsh][Quick Try with =emacs-helm.sh=]]
+- [[#how-to-report-helm-bugs][How to report Helm Bugs]]
+ - [[#confirming-bugs][Confirming bugs]]
+ - [[#emacs-helmsh][=emacs-helm.sh=]]
+ - [[#emacs--q][=emacs -Q=]]
+ - [[#reporting-bugs][Reporting bugs]]
+ - [[#version-info][Version info]]
+- [[#useful-links][Useful links]]
+- [[#main-index][Main Index]]
+- [[#key-index][Key Index]]
+- [[#command-and-function-index][Command and Function Index]]
+- [[#variable-index][Variable Index]]
+- [[#footnotes][Footnotes]]
+
+* Requirements
+
+Helm 3.6.2 and later require
+
+ - =Emacs= version >= 25.1
+ - =emacs-async=[fn:xxx1]
+ - =popup-el=[fn:xxx2]
+
+# Helm require an =Emacs= version >= 25.1 starting from version 3.6.2.
+# Helm uses few dependencies, actually only (mandatory) and
+# popup (facultative) but if you install from
+# Melpa[fn:xxx3] you should not care of this.
+
+* Download
+
+- Home Page :: https://github.com/emacs-helm/helm
+
+- Git Url ::
+
+ https://github.com/emacs-helm/helm.git
+
+ git@github.com:emacs-helm/helm.git
+
+- Tagged Releases :: https://github.com/emacs-helm/helm/tags
+
+* Installation, Upgrade, and Configuration
+
+# 1. [[*Minimal setup using =straight.el=]]
+
+# 2. [[*Minimal setup using source]]
+
+# 3. [[*Minimal setup using the Package Manager]]
+
+** Minimal setup using =straight.el=
+
+=straight.el=[fn:xxx3]
+
+Add this to your init file,
+
+#+begin_src emacs-lisp
+ (straight-use-package 'helm)
+#+end_src
+
+or
+
+# #+begin_src emacs-lisp
+# (use-package helm
+# :straight t
+# :config
+# [...])
+# #+end_src
+
+#+begin_src emacs-lisp
+ (use-package helm :straight t)
+#+end_src
+
+For further information, see =straight.el='s user manual.
+
+To upgrade =helm=, do {{{kbd(M-x straight-pull-package)}}} and restart
+Emacs. =straight.el= will rebuild helm for you.
+
+** Minimal setup using source
+
+# This the best alternative to the standard Emacs package manager with
+# installation from source (see below).
+
+# This is the safest way to install Helm.
+
+1. Install the pre-requisites
+
+ Install =emacs-async=[fn:xxx1] and =popup-el=[fn:xxx2]. Ensure that they
+ are available in ~load-path~.
+
+2. Download, compile and install the sources
+
+ If you are using =git=,
+
+ #+begin_src sh
+ git clone https://github.com/emacs-helm/helm
+ cd helm
+ make
+ sudo make install
+ #+end_src
+
+ If you have a tarball[fn:xxx4],
+
+ #+begin_src sh
+ wget https://github.com/emacs-helm/helm/archive/refs/tags/v3.7.1.tar.gz
+ tar zxvf v3.7.1.tar.gz
+ cd helm-3.7.1/
+ make
+ sudo make install
+ #+end_src
+
+Above steps assume that you have installed =emacs-async= is in a
+standard location. If this is not the case, you need to tell =make=
+program where it is available using =EMACSLOADPATH=[fn:xxx5].
+
+ #+begin_src sh
+ git clone https://github.com/emacs-helm/helm
+ cd helm
+ EMACSLOADPATH="/path/to/emacs-async:" make
+ make
+ sudo make install
+ #+end_src
+
+Above steps
+
+- installs =helm= in =/usr/local/share/emacs/site-lisp/helm/=
+
+- creates an executable called =/usr/local/bin/helm=. This file is in
+ fact a symbolic link to to the script =emacs-helm.sh=.
+
+ #+cindex: emacs-helm.sh
+
+If you want to install =helm= in a path other than =/usr/local/=, pass
+that target path through a =PREFIX= variable.
+
+Add the one of the following to your init file,
+
+#+begin_src emacs-lisp
+ (add-to-list 'load-path "/path/to/helm/directory")
+ (require 'helm-config)
+#+end_src
+
+or
+
+#+begin_src emacs-lisp
+ (add-to-list 'load-path "/path/to/helm/directory")
+ (use-package helm :config (require 'helm-config))
+#+end_src
+
+and restart Emacs.
+
+The library =helm-config= loads =helm-autoloads.el=. This is
+essential for having a working install of =helm=.
+
+# *Note*: make install will NOT work on Windows system, but you can move
+# your helm directory to your ~load-path~ e.g. /site-lisp and run =make=
+# there.
+
+** Minimal setup using the Package Manager
+
+Helm is available on MELPA.[fn:xxx6]
+
+Release version of Helm is available in the stable repository while
+development version is available in the other repo.
+
+Assuming that you have setup ~package-archives~ to include the MELPA,
+you can install Helm with {{{kbd(M-x package-install RET helm RET)}}}.
+
+To upgrade =Helm=, use ~helm-list-elisp-packages~. This command is
+the Helm equivalent of Emacs' =list-packages=. Using
+~helm-list-elisp-packages~, ensures that =helm= is compiled in a clean
+environment.[fn:xxx7]
+
+# Helm upgrades from MELPA encountered errors because of the way the
+# Emacs package manager fetches and compiles updates for existing
+# packages.
+
+# To get around these errors, Helm has =emacs-async=[fn:xxx1] as a
+# dependency. =emacs-async= forces compilation in a clean environment,
+# which resolves the compilation errors.
+
+# When some changes are made in Helm-core and those changes are used in
+# Helm, package.el may install Helm before Helm-core which may create
+# errors depending on changes on Helm-core e.g. New macro, renaming
+# function or macro etc... In this case you will have a better time
+# uninstalling all (Helm+Helm-core), restarting Emacs and reinstalling
+# Helm. Installing from source doesn't suffer from this problem.
+
+# *Note*: always restart Emacs after reinstalling Helm (or other
+# packages) for updates to take effect.
+
+# ** Upgrading
+
+# The only thing you have to do is to upgrade from package manager.
+
+# Helm comes with convenient interface to package.el, see
+# ~helm-list-elisp-packages-no-fetch~ and ~helm-list-elisp-packages~.
+
+# Use ~helm-list-elisp-packages~ to upgrade Helm. If you use
+# ~list-packages~ to upgrade, you may run in to issues either at install
+# time or run time.[fn:xxx8]
+
+# * Upgrade or recompile
+
+# ** Melpa
+
+# *** Upgrade
+
+# *** COMMENT Recompile
+
+# To recompile Helm (or whatever packages), always recompile from a
+# clean environment, that is from outside you current Emacs, for this
+# use ~helm-list-elisp-packages-no-fetch~, go to installed packages with
+# ~M-I~ and use the recompile package action, from Lisp you can use
+# directly ~async-byte-recompile-directory~, if you installed from
+# source use make. And then RESTART Emacs.
+
+# ** Straight
+
+* COMMENT Configure
+
+# For further configuration like changing bindings in the ~helm-map~ you
+# will likely want to use a delayed method like ~with-eval-after-load~
+# or =use-package= to avoid loading all of Helm at startup.
+
+As example you can have a look at the maintainer helm config[fn:xxx8].
+
+To setup specific variables from the helm session you are in, use
+{{{kbd(C-h c)}}}.
+
+To enable helm completion everywhere in Emacs add this to your init
+file.
+
+#+begin_src emacs-lisp
+ (helm-mode 1)
+#+end_src
+
+* Introduction
+
+People often think helm is just something like ido([[info:Ido]]) but
+displaying completion in a vertical layout instead of an horizontal
+one, it is not, helm is much more powerful than that.
+
+- Helm is able to complete multiple lists dispatched in different
+ sources against a pattern.
+
+- Helm allows executing an unlimited number of actions on candidates.
+
+- Helm allows marking candidates to execute chosen action against this
+ set of candidates.
+
+- Helm can display its completion buffer in different window layouts
+ and in separate frame.
+
+Helm is divided in two distinct categories of commands,
+
+#+cindex: helm native commands
+#+cindex: helmized commands
+
+- *helm natives commands* :: these commands are a fresh implementation
+ of an existing Emacs command and enhance them in useful ways.
+
+- *helmized commands* :: these Emacs native commands modified by
+ helm-mode to provide helm completion and only that.
+
+When both are provided e.g ~switch-to-buffer~ vs ~helm-buffers-list~
+you will prefer the native helm commands generally more featured (more
+than one action, allows marking candidates, better display etc...).
+
+* Helm Completion v.s. Emacs Completion
+
+Differences between the two often trip up new users.
+
+Emacs completion is based on the *minibuffer*. Helm completion is
+based on the *completion window*.[fn:xxx9] [fn:xxx10] [fn:xxx11]
+
+In standard Emacs, interactivity happens in the /minibuffer/.
+
+- Typing new characters filters candidates in the minibuffer.
+ {{{kbd(<tab>)}}} may try to complete the typed characters with a
+ valid candidate.
+
+- Hitting {{{kbd(RET)}}} selects the current candidate from the minibuffer.
+
+In Helm, interactivity happens in the /completion window/, not the
+minibuffer
+
+- Typing new characters filters candidates in the completion window.
+ Keep typing until the desired candidate is highlighted, or navigate
+ to it using {{{kbd(C-n)}}}.
+
+- Hitting {{{kbd(RET)}}} selects the currently highlighted item in the
+ completion window.
+
+** Helm interaction model
+
+Helm's interactivity makes the {{{kbd(<tab>)}}} key redundant for
+completion because the selection candidates are already made visible
+in the Helm completion window. So, *tab completion is not
+supported*. In Helm, {{{kbd(<tab>)}}} is used to view available
+*actions* to be taken on a candidate.
+
+Because the {{{kbd(<tab>)}}} key is so ingrained in the muscle memory of
+long-time Emacs users, transition to Helm's interactive model
+requires:
+
+- A conscious visual adjustment to look at the completion window, and
+
+- A conscious mental adjustment to avoid using the {{{kbd(<tab>)}}}
+ key for completion and go straight to {{{kbd(RET)}}} key to select a
+ candidate. Helm's approach to completion provides better visual
+ cues, takes fewer keystrokes, and is much faster.
+
+* General Helm Commands
+
+#+CAPTION: A typical ~helm-M-x~ with =emacs-helm.sh=
+#+ATTR_HTML: :width 800
+#+ATTR_ORG: :width 800
+[[./helm-M-x.png]]
+
+Helm's functionality needs only a few general key bindings as shown
+below. These are also documented in the mode line.
+
+# Marking
+
+ # helm-mark-all
+ # helm-next-visible-mark
+ # helm-prev-visible-mark
+ # helm-toggle-all-marks
+ # helm-toggle-visible-mark
+ # helm-toggle-visible-mark-backward
+ #
+ # helm-unmark-all
+
+# Action
+
+ # helm-execute-persistent-action
+ # helm-follow-action-backward
+ # helm-follow-action-forward
+ # helm-select-action
+
+# - {{{kbd(C-c C-e)}}} (~org-export~) ::
+
+- {{{kbd(<tab>)}}} or {{{kbd(C-i)}}} (~helm-select-action~) :: lists available actions
+
+- {{{kbd(C-j)}}} or {{{kbd(C-z)}}} (~helm-execute-persistent-action~) :: invokes the persistent action
+
+- {{{kbd(M-SPC)}}} (~helm-toggle-visible-mark-backward~) or {{{kbd(C-SPC)}}} (~helm-toggle-visible-mark-forward~) or {{{kbd(C-@)}}} (~helm-toggle-visible-mark~) :: marks a candidate
+
+- {{{kbd(C-h m)}}} (~helm-help~) :: displays the embeded help in an org buffer without quitting
+ helm session.
+
+- {{{kbd(RET)}}} :: runs the first action of action list
+
+** Yanking text
+
+Yank symbol at point from ~helm-current-buffer~ (i.e. buffer where a
+helm command was invoked):
+
+# {{{kbd(M-n)}}} copies symbol at point to minibuffer
+
+# {{{kbd(C-w)}}} appends word next to point to the minibuffer and advance to next
+# word, hitting {{{kbd(C-_)}}} undo last insertion and rewind yank point in
+# ~helm-current-buffer~
+
+- {{{kbd(C-w)}}} (~helm-yank-text-at-point~) :: Append word next to
+ point to the minibuffer and advance to next word
+
+ (helm-yank-text-at-point ARG)
+
+ Yank text at point in `helm-current-buffer' into minibuffer.
+
+- {{{kbd(C-_)}}} (~helm-undo-yank-text-at-point~) :: Undo last
+ insertion and rewind yank point in ~helm-current-buffer~
+
+ Undo last entry added by `helm-yank-text-at-point'.
+
+* Preconfigured Helm Commands
+
+Invoke {{{kbd(M-x helm-M-x RET)}}} and type =helm= to discover Helm
+commands. The =Menu Bar -> Helm= menu item is another way to discover
+helm commands.
+
+- ~helm-command-prefix-key~ ::
+
+ #+vindex: helm-command-prefix-key
+
+ *Standard Value*: "C-x c"
+
+ The key ‘helm-command-prefix’ is bound to in the global map.
+
+- ~helm-minibuffer-history-key~ ::
+
+ #+vindex: helm-minibuffer-history-key
+
+ *Standard Value*: "C-r"
+
+ The key ‘helm-minibuffer-history’ is bound to in minibuffer local maps.
+
+# #+vindex: helm-command-prefix-key
+~helm-command-prefix-key~ (default value {{{kbd(C-x c)}}}) is the
+prefix for the preconfigured helm menu.
+
+~helm-command-prefix-key~ followed by any regular Emacs key invokes
+the Helm version of the same command.
+
+For example,
+
+- {{{kbd(C-x c M-x)}}} runs the command ~helm-M-x~, which is the helm
+ version of {{{kbd(M-x)}}} (~execute-extended-command~).
+
+- {{{kbd(C-x c C-x C-f)}}} runs the command ~helm-find-files~, which
+ is the helm version of {{{kbd(C-x C-f)}}} (~find-file~).
+
+To run the helm version of a command with a key binding, but without
+also typing {{{kbd(C-x c)}}}) (~helm-command-prefix-key~), add the
+following to your init file.
+
+#+begin_src emacs-lisp
+ (global-set-key (kbd "M-x") 'helm-M-x)
+#+end_src
+
+* COMMENT Show Helm Commands
+
+- {{{kbd(C-h m)}}} (~helm-help~) shows Helm commands and currently
+ active key bindings.
+
+# * Browse Other Tools
+
+# - Invoke {{{kbd(M-x)}}}, then type "helm" to browse other Helm tools.
+
+* Helm Mode
+
+# Toggle generic helm completion.
+
+# If called interactively, toggle ‘Helm mode’. If the prefix
+# argument is positive, enable the mode, and if it is zero or
+# negative, disable the mode.
+
+# If called from Lisp, toggle the mode if ARG is ‘toggle’. Enable
+# the mode if ARG is nil, omitted, or is a positive number.
+# Disable the mode if ARG is a negative number.
+
+# The mode’s hook is called both when the mode is enabled and when
+# it is disabled.
+
+# All functions in Emacs that use ‘completing-read’,
+# ‘read-file-name’, ‘completion-in-region’ and friends will use helm
+# interface when this mode is turned on.
+
+# However you can modify this behavior for functions of your choice
+# with ‘helm-completing-read-handlers-alist’.
+
+# Called with a positive arg, turn on unconditionally, with a
+# negative arg turn off.
+# You can toggle it with M-x ‘helm-mode’.
+
+# About ‘ido-mode’:
+# DO NOT enable ‘ido-everywhere’ when using ‘helm-mode’. Instead of
+# using ‘ido-mode’, add the commands where you want to use ido to
+# ‘helm-completing-read-handlers-alist’ with ‘ido’ as value.
+
+~helm-mode~ enables Helm completion globally for any Emacs command
+using ~completing-read~ or ~read-file-name~.
+
+~helm-mode~ completes with ~completion-at-point~ and implements
+~completion-in-region-function~ for ~completing-read-multiple~ for
+Emacs 24.4 and later.
+
+Helm provides generic functions for completions to replace
+tab-completion in Emacs with no loss of functionality. To use Helm's
+generic functions, first set them in your init file, e.g.:
+
+#+begin_src emacs-lisp
+ (global-set-key (kbd "M-x") #'helm-M-x)
+ (global-set-key (kbd "C-x r b") #'helm-filtered-bookmarks)
+ (global-set-key (kbd "C-x C-f") #'helm-find-files)
+#+end_src
+
+Then enable ~helm-mode~ with:
+
+#+begin_src emacs-lisp
+ (helm-mode 1)
+#+end_src
+
+Or, enable ~helm-mode~ interactively with {{{kbd(M-x helm-mode)}}}.
+
+- ~helm-mode~ ::
+
+ #+vindex: helm-mode
+
+ (helm-mode &optional ARG)
+
+ Toggle generic helm completion.
+
+ If called interactively, toggle `Helm mode'. If the prefix
+ argument is positive, enable the mode, and if it is zero or
+ negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is `toggle'. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+ All functions in Emacs that use `completing-read',
+ `read-file-name', `completion-in-region' and friends will use helm
+ interface when this mode is turned on.
+
+ However you can modify this behavior for functions of your choice
+ with `helm-completing-read-handlers-alist'.
+
+ Called with a positive arg, turn on unconditionally, with a
+ negative arg turn off.
+ You can toggle it with M-x `helm-mode'.
+
+ About `ido-mode':
+ DO NOT enable `ido-everywhere' when using `helm-mode'. Instead of
+ using `ido-mode', add the commands where you want to use ido to
+ `helm-completing-read-handlers-alist' with `ido' as value.
+
+ Note: This mode is incompatible with Emacs23.
+
+** Customize helm-mode
+
+- ~helm-completing-read-handlers-alist~ ::
+
+ #+vindex: helm-completing-read-handlers-alist
+
+ Completing read functions for specific Emacs commands.
+
+ By default ‘helm-mode’ use ‘helm-completing-read-default-handler’ to
+ provide helm completion in each ‘completing-read’ or ‘read-file-name’
+ found, but other functions can be specified here for specific
+ commands. This also allows disabling helm completion for some commands
+ when needed.
+
+ Each entry is a cons cell like (EMACS_COMMAND . COMPLETING-READ_HANDLER)
+ where key and value are symbols.
+
+ Each key is an Emacs command that use originaly ‘completing-read’.
+
+ Each value maybe a helm function that takes same arguments as
+ ‘completing-read’ plus NAME and BUFFER, where NAME is the name of the new
+ helm source and BUFFER the name of the buffer we will use, but it can
+ be also a function not using helm, in this case the function should
+ take the same args as ‘completing-read’ and not be prefixed by "helm-".
+
+ ‘helm’ will use the name of the command calling ‘completing-read’ as
+ NAME and BUFFER will be computed as well with NAME but prefixed with
+ "*helm-mode-".
+
+ This function prefix name must start by "helm-" when it uses helm,
+ otherwise ‘helm’ assumes the function is not a helm function and
+ expects the same args as ‘completing-read’, this allows you to define a
+ handler not using helm completion.
+
+ Example:
+
+ (defun foo/test ()
+ (interactive)
+ (message "%S" (completing-read "test: " ’(a b c d e))))
+
+ (defun helm-foo/test-completing-read-handler (prompt collection
+ predicate require-match
+ initial-input hist def
+ inherit-input-method
+ name buffer)
+ (helm-comp-read prompt collection :marked-candidates t
+ :name name
+ :buffer buffer))
+
+ (add-to-list ’helm-completing-read-handlers-alist
+ ’(foo/test . helm-foo/test-completing-read-handler))
+
+ We want here to make the regular ‘completing-read’ in ‘foo/test’
+ return a list of candidate(s) instead of a single candidate.
+
+ Note that this function will be reused for ALL the ‘completing-read’
+ of this command, so it should handle all cases. E.g.,
+ if first ‘completing-read’ completes against symbols and
+ second ‘completing-read’ should handle only buffer,
+ your specialized function should handle both.
+
+ If the value of an entry is nil completion will fall back to
+ Emacs vanilla behaviour.
+ Example:
+
+ If you want to disable helm completion for ‘describe-function’, use:
+
+ (describe-function . nil)
+
+ Ido is also supported, you can use ‘ido-completing-read’ and
+ ‘ido-read-file-name’ as value of an entry or just ’ido.
+ Example:
+ Enable ido completion for ‘find-file’:
+
+ (find-file . ido)
+
+ same as
+
+ (find-file . ido-read-file-name)
+
+ Note that you don’t need to enable ‘ido-mode’ for this to work, see
+ ‘helm-mode’ documentation.
+
+# #+vindex: helm-completing-read-handlers-alist
+To customize the completion interface or disable completion for
+specific commands in ~helm-mode~, edit
+~helm-completing-read-handlers-alist~. See {{{kbd(C-h v)}}}
+~helm-completing-read-handlers-alist~ for details.
+
+*** Use helm-mode and ido-mode
+
+To use
+[[https://www.gnu.org/software/emacs/manual/html_mono/ido.html][Ido]]
+for some commands and Helm for others, do not enable
+~ido-mode~. Instead, customize ~helm-completing-read-handlers-alist~
+to specify which command uses Ido.
+
+For example, suppose we want ~find-file-read-only~ to use Ido and
+~find-file~ to use Helm. Then:
+
+1. In your init file, turn on ~helm-mode~.
+
+2. In the ~helm-mode~ customize group, add a key to
+ ~helm-completing-read-handlers-alist~ for ~find-file-read-only~
+ with value =ido=, i.e.
+
+#+begin_src emacs-lisp
+ (find-file-read-only . ido)
+#+end_src
+
+With ~helm-mode~ active, to use Emacs default completion instead of
+either Helm or Ido, use ~nil~ for the key value:
+
+#+begin_src emacs-lisp
+ (find-alternate-file . nil)
+#+end_src
+
+* COMMENT Other Useful Extensions
+
+MELPA and other repositories have many useful extensions, some of
+which are redundant as Helm already provides them. Review if they
+already exist as part of the default Helm package before downloading
+new extensions.
+
+* Helm With Other Emacs Extensions
+
+** linum-relative
+
+~(helm-linum-relative-mode 1)~ enables ~linum-relative~ in Helm. Helm
+buffers then display line numbered candidates before and after the
+current candidate (highlighted line). {{{kbd(C-x <n>)}}} jumps to =n= lines
+before, before, and {{{kbd(C-c <n>)}}} jumps to =n= lines after, the current
+candidate.
+
+* Helm Workflow for Files, Directories and Buffers
+
+# The new Helm workflow uses fewer buffers. Whereas the old workflow
+# opened many Dired buffers stacked in the workspace, the new approach
+# uses virtual Dired buffers without cluttering the buffer list with
+# many Dired buffers. The decluttering of buffers also helps with
+# running ~helm-locate~ without conflicts; there's also less need to
+# resort to other workarounds, such as running ~helm-multi-files~.
+
+# The new approach uses ~helm-find-files~ as the starting point, never
+# opens Dired buffers yet provides easy access to common Helm commands,
+# such as =grep=, =locate=, =find=, etc. These Helm commands, moreover,
+# are not limited to the current directory because Helm now allows
+# marking files in other directories before running the commands.
+
+Other quick jumping off features of ~helm-find-files~:
+
+- {{{kbd(C-x C-d)}}} (~helm-browse-project~) shows buffers and files in the
+ project.
+
+- {{{kbd(C-c C-d)}}} with prefix argument shows files in this directory and its
+ subdirectories recursively.
+
+When using =helm-ls-git=[fn:xxx12] and =helm-ls-hg=[fn:xxx13] , files under
+version control have a corresponding backend indicator.
+
+- {{{kbd(C-x C-b)}}} to switch back to the resumed Helm sources.
+
+- {{{kbd(M-p)}}} to access history of ~helm-find-files~
+
+- {{{kbd(C-c h)}}} to access the full history of files (~file-name-history~)
+
+- {{{kbd(C-x C-f)}}} switches back to ~helm-find-files~
+
+* Quick Try with =emacs-helm.sh=
+
+#+cindex: emacs-helm.sh
+
+To try Helm with a default configurations in a minimal Emacs, run the
+provided =emacs-helm.sh= script in Helm's installation directory. If
+installed through the Emacs package manager,
+
+#+begin_src sh
+ ~/.emacs.d/elpa/helm-<VERSION>/emacs-helm.sh
+#+end_src
+
+=emacs-helm.sh= should also be used when
+[[https://github.com/emacs-helm/helm/wiki/Bugs][reporting bugs]].
+
+*Note*: If you have installed from Melpa, for convenience, consider
+creating a symlink of =emacs-helm.sh= to e.g =~/bin=, if you have
+installed from source (make && sudo make install) a symlink named
+=helm= have already been created.
+
+*Note*: For people using a non standard Elpa directory emacs-helm.sh may
+fail because it doesn't find its dependency (emacs-async), here's how
+you can do:
+
+#+begin_src sh
+ cd /your/path/to/helm
+ make # If not already done.
+ EMACSLOADPATH="../emacs-async:" ./emacs-helm.sh
+#+end_src
+
+But normally =emacs-helm.sh= should work out of the box with
+installations of emacs-async= done with package.el, straight.el or from
+source with the Makefile.
+
+* How to report Helm Bugs
+
+** Confirming bugs
+
+To confirm that a bug is, in fact, a Helm problem, it is important to
+/replicate the behavior with a minimal Emacs configuration/. This
+precludes the possibility that the bug is caused by factors outside of
+Helm.
+
+The easiest and recommended way to do so is through the
+=emacs-helm.sh= script.
+
+*** =emacs-helm.sh=
+
+If your system supports it, you should run the =emacs-helm.sh= script
+to start an Emacs instance with minimal, Helm-specific configuration.
+
+This is useful for debugging, and easier than starting Emacs with
+=emacs -Q= and configuring Helm from scratch.
+
+If Helm is installed via MELPA, the =emacs-helm.sh= script should be
+located at =~/.emacs.d/elpa/helm-<version>/emacs-helm.sh=.
+
+Of course you have to cd to your helm directory and run the script
+from there, an alternative is symlinking it to somewhere in your
+=PATH= e.g. "~/bin" (See note at bottom for those that have installed
+from source with =make=).
+
+You can use the -h argument for help:
+
+ : $ helm -h
+ : Usage: helm [-P} Emacs path [-h} help [--] EMACS ARGS
+
+If your emacs binary is not in a standard place i.e. "emacs", you can
+specify the path with "-P".
+
+~Note~: If you have installed Helm from Git and used =make && sudo
+make install= you can run directly =helm= at command line from any
+place i.e. no need to cd to helm directory.
+
+*** =emacs -Q=
+
+If you cannot run the =emacs-helm.sh= script, be sure to reproduce the
+problem with =emacs -Q=, then installing Helm as described in the
+Install section.
+
+** Reporting bugs
+
+To report a bug, [[https://github.com/emacs-helm/helm/issues][open an
+issue]]. Be sure that you've confirmed the bug as described in the
+previous section, and include relevant information for the maintainer
+to identify the bug.
+
+*** Version info
+
+When reporting bugs, it is important to include the Helm version
+number, which can be found in the
+[[https://github.com/emacs-helm/helm/blob/master/helm-pkg.el][helm-pkg.el]]
+file.
+
+* Useful links
+
+- [[https://github.com/emacs-helm/helm][Helm on GitHub]]
+
+- [[http://tuhdo.github.io/helm-intro.html][Tuhdo's Helm tutorial]]
+
+- [[https://groups.google.com/g/emacs-helm][Helm mailing list]]
+
+# gmane.emacs.helm.user
+# news://news.gwene.org:119/gmane.emacs.helm.user
+
+# - [[http://dir.gmane.org/gmane.emacs.helm.user][Helm Gmane]] (=gmane.emacs.helm.user=)
+
+* COMMENT Contributing to the Wiki
+
+1. Prefer using [[http://orgmode.org/][Org mode]] for Wiki pages.
+
+2. Install the [[https://github.com/snosov1/toc-org][toc-org]] package
+ to automatically generate tables of contents.
+
+3. Edit the Wiki.
+
+4. Before saving, run ~toc-org-insert-toc~.
+
+ - Consider adding something like the following to
+ ~before-save-hook~ to do this automatically:
+
+#+begin_src emacs-lisp
+ (defun *-org-insert-toc ()
+ "Create table of contents (TOC) if current buffer is in
+ `org-mode'."
+ (when (= major-mode 'org-mode)
+ toc-org-insert-toc))
+#+end_src
+
+* Main Index
+:PROPERTIES:
+:INDEX: cp
+:DESCRIPTION: An index of Helm's concepts and features.
+:END:
+
+* Key Index
+:PROPERTIES:
+:DESCRIPTION: Key bindings and where they are described.
+:INDEX: ky
+:END:
+
+* Command and Function Index
+:PROPERTIES:
+:DESCRIPTION: Command names and some internal functions.
+:INDEX: fn
+:END:
+
+* Variable Index
+:PROPERTIES:
+:DESCRIPTION: Variables mentioned in the manual.
+:INDEX: vr
+:END:
+
+This is not a complete index of variables and faces, only the ones
+that are mentioned in the manual. For a more complete list, use
+{{{kbd(M-x org-customize)}}} and then click yourself through the tree.
+
+* Export Setup :noexport:
+
+#+setupfile: doc-setup.org
+# #+options: H:4
+
+#+export_file_name: helm-manual-1.texi
+
+#+texinfo_dir_category: Emacs Add-ons
+#+texinfo_dir_title: Helm Wiki: (helm-manual-1)
+#+texinfo_dir_desc: Helm Wiki
+
+* Footnotes
+
+[fn:xxx1] [[https://github.com/jwiegley/emacs-async][emacs-async]]
+
+[fn:xxx2] [[https://github.com/auto-complete/popup-el][popup-el]]
+
+[fn:xxx3] https://github.com/raxod502/straight.el
+
+[fn:xxx4] https://github.com/emacs-helm/helm/releases
+
+[fn:xxx5] Don't forget the final =:= to use an absolute path (like
+=/home/you/foo/bar:=) instead of an abbreviated path like
+(=~/foo/bar:=), specify =EMACSLOADPATH=.
+
+[fn:xxx6] https://melpa.org
+
+[fn:xxx7] Helm uses async package to compile itself from Melpa. Ensure
+that ~async-bytecomp-package-mode~ is enabled by default. If this
+isn't so, add helm to ~async-bytecomp-allowed-packages~.
+
+[fn:xxx8] https://raw.githubusercontent.com/thierryvolpiatto/emacs-config/main/init-helm.el
+
+[fn:xxx9] [[https://github.com/emacs-helm/helm/issues/495][Different way of invoking commands]]
+
+[fn:xxx10] [[https://groups.google.com/g/emacs-helm/c/zaBbg2tFAuM][Finding files]]
+
+[fn:xxx11] [[https://github.com/emacs-helm/helm/issues/222][Lack of tab completion]]
+
+[fn:xxx12][[https://github.com/emacs-helm/helm-ls-git][helm-ls-git]]
+
+[fn:xxx13] [[https://github.com/emacs-helm/helm-ls-hg][helm-ls-hg]]
+
+[fn:xxx14][[http://melpa.org/#/helm][MELPA]]
+
+
+[fn:xxx15] [[http://stable.melpa.org/#/helm][MELPA Stable]]
+
+[fn:xxx16] https://github.com/emacs-helm/helm/tags
+
+[fn:xxx17] [[http://melpa.org/#/helm][Melpa ]]
+
+[fn:xxx18] helm-core have a new macro foo and helm use now
+this macro, ~list-packages~ will try to install and compile first helm
+and then helm-core resulting in an error like =void function foo...=.
+
+
+#+STARTUP: inlineimages
+#+EXCLUDE_TAGS: TOC_4
+
+# (info (org-texinfo-export-to-info))
diff --git a/doc/helm-manual.org b/doc/helm-manual.org
new file mode 100644
index 00000000..b855106e
--- /dev/null
+++ b/doc/helm-manual.org
@@ -0,0 +1,3358 @@
+#+title: M-x helm-documentation
+# #+subtitle: Release {{{version}}}
+#+subtitle: Release 3.6.2
+#+author: The Helm Developers
+# #+date: {{{modification-time}}}
+#+language: en
+
+# #+texinfo: @insertcopying
+
+* Table Of Contents :TOC_4:
+- [[#helm-generic-help][Helm Generic Help]]
+ - [[#basics][Basics]]
+ - [[#helm-sources][Helm sources]]
+ - [[#configure-sources][Configure sources]]
+ - [[#modify-keybindings-in-helm][Modify keybindings in Helm]]
+ - [[#matching-in-helm][Matching in Helm]]
+ - [[#completion-styles][Completion-styles]]
+ - [[#helm-mode][Helm mode]]
+ - [[#what-gets-or-does-not-get-helmized-when-helm-mode-is-enabled][What gets or does not get =helmized= when ~helm-mode~ is enabled?]]
+ - [[#helm-functions-vs-helmized-emacs-functions][Helm functions vs helmized Emacs functions]]
+ - [[#completion-behavior-with-helm-and-completion-at-point][Completion behavior with Helm and completion-at-point]]
+ - [[#helm-help][Helm help]]
+ - [[#customize-helm][Customize Helm]]
+ - [[#display-helm-in-windows-and-frames][Display Helm in windows and frames]]
+ - [[#helms-basic-operations-and-default-key-bindings][Helm’s basic operations and default key bindings]]
+ - [[#the-actions-menu][The actions menu]]
+ - [[#action-transformers][Action transformers]]
+ - [[#shortcuts-for-n-th-first-actions][Shortcuts for n-th first actions]]
+ - [[#shortcuts-for-executing-the-default-action-on-the-n-th-candidate][Shortcuts for executing the default action on the n-th candidate]]
+ - [[#mouse-control-in-helm][Mouse control in Helm]]
+ - [[#marked-candidates][Marked candidates]]
+ - [[#follow-candidates][Follow candidates]]
+ - [[#frequently-used-commands][Frequently Used Commands]]
+ - [[#special-yes-no-or-yes-for-all-answers][Special yes, no or yes for all answers]]
+ - [[#moving-in-helm-buffer][Moving in ~helm-buffer~]]
+ - [[#resume-previous-session-from-current-helm-session][Resume previous session from current Helm session]]
+ - [[#global-commands][Global commands]]
+ - [[#resume-helm-session-from-outside-helm][Resume Helm session from outside Helm]]
+ - [[#debugging-helm][Debugging Helm]]
+ - [[#writing-your-own-helm-sources][Writing your own Helm sources]]
+ - [[#helm-map][Helm Map]]
+- [[#helm-buffer][Helm Buffer]]
+ - [[#pattern-matching-in-helm-buffers][Pattern matching in helm-buffers]]
+ - [[#examples][Examples]]
+ - [[#tips][Tips]]
+ - [[#creating-buffers][Creating buffers]]
+ - [[#killing-buffers][Killing buffers]]
+ - [[#switching-to-buffers][Switching to buffers]]
+ - [[#saving-buffers][Saving buffers]]
+ - [[#meaning-of-colors-and-prefixes-for-buffers][Meaning of colors and prefixes for buffers]]
+ - [[#commands][Commands]]
+- [[#helm-find-files][Helm Find Files]]
+ - [[#tips-1][Tips]]
+ - [[#navigation-summary][Navigation summary]]
+ - [[#navigate-with-arrow-keys][Navigate with arrow keys]]
+ - [[#use-kbdc-j-persistent-action-on-a-directory-to-go-down-one-level][Use {{{kbd(C-j)}}} (persistent action) on a directory to go down one level]]
+ - [[#use-kbdc-l-or-kbddel-on-a-directory-to-go-up-one-level][Use {{{kbd(C-l)}}} or {{{kbd(DEL)}}} on a directory to go up one level]]
+ - [[#use-kbdc-r-to-walk-back-the-resulting-tree-of-all-the-kbdc-l-or-del-you-did][Use {{{kbd(C-r)}}} to walk back the resulting tree of all the {{{kbd(C-l)}}} or DEL you did]]
+ - [[#kbdret-behavior][{{{kbd(RET)}}} behavior]]
+ - [[#kbdtab-behavior][{{{kbd(TAB)}}} behavior]]
+ - [[#filter-out-files-or-directories][Filter out files or directories]]
+ - [[#sort-directory-contents][Sort directory contents]]
+ - [[#find-file-at-point][Find file at point]]
+ - [[#find-file-at-line-number][Find file at line number]]
+ - [[#find-url-at-point][Find URL at point]]
+ - [[#find-e-mail-address-at-point][Find e-mail address at point]]
+ - [[#quick-pattern-expansion][Quick pattern expansion]]
+ - [[#enter--at-end-of-pattern-to-quickly-reach-home-directory][Enter =~/= at end of pattern to quickly reach home directory]]
+ - [[#enter--at-end-of-pattern-to-quickly-reach-the-file-system-root][Enter =/= at end of pattern to quickly reach the file system root]]
+ - [[#enter--at-end-of-pattern-to-quickly-reach-default-directory][Enter =./= at end of pattern to quickly reach ~default-directory~]]
+ - [[#enter--at-end-of-pattern-will-reach-upper-directory-moving-cursor-to-the-top][Enter =../= at end of pattern will reach upper directory, moving cursor to the top]]
+ - [[#enter-name-at-end-of-pattern-to-start-a-recursive-search][Enter =..name/= at end of pattern to start a recursive search]]
+ - [[#any-environment-variable-eg-home-at-end-of-pattern-gets-expanded][Any environment variable (e.g. =$HOME=) at end of pattern gets expanded]]
+ - [[#any-valid-filename-yanked-after-pattern-gets-expanded][Any valid filename yanked after pattern gets expanded]]
+ - [[#special-case-url-at-point][Special case: URL at point]]
+ - [[#helm-find-files-supports-fuzzy-matching][Helm-find-files supports fuzzy matching]]
+ - [[#kbdc-j-on-a-filename-expands-to-that-filename-in-the-helm-buffer][{{{kbd(C-j)}}} on a filename expands to that filename in the Helm buffer]]
+ - [[#browse-images-directories-with-helm-follow-mode-and-navigate-updown][Browse images directories with ~helm-follow-mode~ and navigate up/down]]
+ - [[#open-files-externally][Open files externally]]
+ - [[#toggle-auto-completion][Toggle auto-completion]]
+ - [[#you-can-create-a-new-directory-and-a-new-file-at-the-same-time][You can create a new directory and a new file at the same time]]
+ - [[#to-create-a-new-directory-append-a--to-the-new-name-and-press-kbdret][To create a new directory, append a =/= to the new name and press {{{kbd(RET)}}}]]
+ - [[#to-create-a-new-file-enter-a-filename-not-ending-with-][To create a new file, enter a filename not ending with =/=]]
+ - [[#recursive-search-from-helm-find-files][Recursive search from Helm-find-files]]
+ - [[#you-can-use-helm-browse-project-see-binding-below][You can use helm-browse-project (see binding below)]]
+ - [[#you-can-start-a-recursive-search-with-locate-find-or-fdfn5][You can start a recursive search with =locate=, =find= or =Fd=[fn:5]]]
+ - [[#recursive-completion-on-subdirectories][Recursive completion on subdirectories]]
+ - [[#insert-filename-at-point-or-complete-filename-at-point][Insert filename at point or complete filename at point]]
+ - [[#use-the-wildcard-to-select-multiple-files][Use the wildcard to select multiple files]]
+ - [[#query-replace-regexp-on-filenames][Query replace regexp on filenames]]
+ - [[#syntax-of-the-first-prompt][Syntax of the first prompt]]
+ - [[#syntax-of-the-second-prompt][Syntax of the second prompt]]
+ - [[#examples-1][Examples]]
+ - [[#serial-renaming][Serial renaming]]
+ - [[#edit-marked-files-in-a-dired-buffer][Edit marked files in a dired buffer]]
+ - [[#defining-default-target-directory-for-copying-renaming-etc][Defining default target directory for copying, renaming, etc]]
+ - [[#copyingrenaming-from-or-to-remote-directories][Copying/Renaming from or to remote directories]]
+ - [[#copying-and-renaming-asynchronously][Copying and renaming asynchronously]]
+ - [[#use-rsync-to-copy-files][Use Rsync to copy files]]
+ - [[#bookmark-the-helm-find-files-session][Bookmark the ~helm-find-files~ session]]
+ - [[#grep-files-from-helm-find-files][Grep files from ~helm-find-files~]]
+ - [[#grepping-on-remote-files][Grepping on remote files]]
+ - [[#execute-eshell-commands-on-files][Execute Eshell commands on files]]
+ - [[#using-tramp-with-helm-find-files-to-read-remote-directories][Using TRAMP with ~helm-find-files~ to read remote directories]]
+ - [[#a-tramp-syntax-crash-course][A TRAMP syntax crash course]]
+ - [[#display-color-for-directories-symlinks-etc-with-tramp][Display color for directories, symlinks etc... with tramp]]
+ - [[#completing-host][Completing host]]
+ - [[#editing-local-files-as-root][Editing local files as root]]
+ - [[#attach-files-to-a-mail-buffer-message-mode][Attach files to a mail buffer (message-mode)]]
+ - [[#open-files-in-separate-windows][Open files in separate windows]]
+ - [[#expand-archives-as-directories-in-a-avfs-directory][Expand archives as directories in a avfs directory]]
+ - [[#tramp-archive-support-emacs-27-only][Tramp archive support (emacs-27+ only)]]
+ - [[#touch-files][Touch files]]
+ - [[#delete-files][Delete files]]
+ - [[#trashing-files][Trashing files]]
+ - [[#checksum-file][Checksum file]]
+ - [[#ignored-or-boring-files][Ignored or boring files]]
+ - [[#helm-find-files-is-using-a-cache][Helm-find-files is using a cache]]
+ - [[#commands-1][Commands]]
+- [[#helm-generic-read-file-name-completion][Helm ‘generic’ read file name completion]]
+ - [[#tips-2][Tips]]
+ - [[#navigation][Navigation]]
+ - [[#enter--at-end-of-pattern-to-quickly-reach-home-directory-1][Enter =~/= at end of pattern to quickly reach home directory]]
+ - [[#enter--at-end-of-pattern-to-quickly-reach-the-file-system-root-1][Enter =/= at end of pattern to quickly reach the file system root]]
+ - [[#enter--at-end-of-pattern-to-quickly-reach-default-directory-1][Enter =./= at end of pattern to quickly reach ~default-directory~]]
+ - [[#enter--at-end-of-pattern-will-reach-upper-directory-moving-cursor-on-top][Enter =../= at end of pattern will reach upper directory, moving cursor on top]]
+ - [[#you-can-complete-with-partial-basename][You can complete with partial basename]]
+ - [[#persistent-actions][Persistent actions]]
+ - [[#use-kbdc-u-c-j-to-display-an-image][Use {{{kbd(C-u C-j)}}} to display an image]]
+ - [[#kbdc-j-on-a-filename-will-expand-to-this-filename-in-helm-buffer][{{{kbd(C-j)}}} on a filename will expand to this filename in Helm-buffer]]
+ - [[#browse-images-directories-with-helm-follow-mode-and-navigate-updown-1][Browse images directories with ~helm-follow-mode~ and navigate up/down]]
+ - [[#delete-characters-backward][Delete characters backward]]
+ - [[#create-new-directories-and-files][Create new directories and files]]
+ - [[#you-can-create-a-new-directory-and-a-new-file-at-the-same-time-1][You can create a new directory and a new file at the same time]]
+ - [[#to-create-a-new-directory-append-a--at-to-the-new-name-and-press-kbdret][To create a new directory, append a =/= at to the new name and press {{{kbd(RET)}}}]]
+ - [[#to-create-a-new-file-enter-a-filename-not-ending-with--1][To create a new file, enter a filename not ending with =/=]]
+ - [[#exiting-minibuffer-with-empty-string][Exiting minibuffer with empty string]]
+ - [[#commands-2][Commands]]
+- [[#helm-generic-files][Helm Generic files]]
+ - [[#tips-3][Tips]]
+ - [[#locate][Locate]]
+ - [[#browse-project][Browse project]]
+ - [[#find-command][Find command]]
+ - [[#commands-3][Commands]]
+- [[#helm-fd][Helm fd]]
+ - [[#tips-4][Tips]]
+ - [[#commands-4][Commands]]
+- [[#helm-grep][Helm Grep]]
+ - [[#tips-5][Tips]]
+ - [[#meaning-of-the-prefix-argument][Meaning of the prefix argument]]
+ - [[#with-grep-or-ack-grep][With grep or ack-grep]]
+ - [[#with-ag-or-rg][With AG or RG]]
+ - [[#you-can-use-wild-cards-when-selecting-files-eg-el][You can use wild cards when selecting files (e.g. =*.el=)]]
+ - [[#grep-hidden-files][Grep hidden files]]
+ - [[#you-can-grep-in-different-directories-by-marking-files-or-using-wild-cards][You can grep in different directories by marking files or using wild cards]]
+ - [[#you-can-save-the-result-in-a-helm-grep-mode-buffer][You can save the result in a ~helm-grep-mode~ buffer]]
+ - [[#helm-grep-supports-multi-matching][Helm-grep supports multi-matching]]
+ - [[#see-full-path-of-selected-candidate][See full path of selected candidate]]
+ - [[#open-file-in-other-window][Open file in other window]]
+ - [[#performance-over-tramp][Performance over TRAMP]]
+- [[#helm-gid][Helm GID]]
+ - [[#tips-6][Tips]]
+- [[#helm-ag][Helm AG]]
+ - [[#tips-7][Tips]]
+- [[#helm-git-grep][Helm git-grep]]
+ - [[#commands-5][Commands]]
+- [[#helm-pdfgrep-map][Helm PDFgrep Map]]
+ - [[#commands-6][Commands]]
+- [[#helm-etags-map][Helm Etags Map]]
+ - [[#commands-7][Commands]]
+- [[#helm-ucs][Helm UCS]]
+ - [[#tips-8][Tips]]
+ - [[#commands-8][Commands]]
+- [[#helm-bookmark-name][Helm bookmark name]]
+ - [[#commands-9][Commands]]
+- [[#helm-eshell-on-file][Helm Eshell on file]]
+ - [[#tips-9][Tips]]
+ - [[#pass-extra-arguments-after-filename][Pass extra arguments after filename]]
+ - [[#use-placeholders-in-extra-arguments][Use placeholders in extra arguments]]
+ - [[#specify-marked-files-as-arguments][Specify marked files as arguments]]
+ - [[#run-eshell-commands-asynchronously][Run eshell commands asynchronously]]
+ - [[#commands-10][Commands]]
+- [[#helm-ido-virtual-buffers][Helm Ido virtual buffers]]
+ - [[#commands-11][Commands]]
+- [[#helm-moccur][Helm Moccur]]
+ - [[#tips-10][Tips]]
+ - [[#searching-in-many-buffers][Searching in many buffers]]
+ - [[#matching][Matching]]
+ - [[#automatically-match-symbol-at-point][Automatically match symbol at point]]
+ - [[#yank-word-at-point-in-minibuffer][Yank word at point in minibuffer]]
+ - [[#preselection][Preselection]]
+ - [[#jump-to-the-corresponding-line-in-the-searched-buffer][Jump to the corresponding line in the searched buffer]]
+ - [[#switch-to-buffer-in-other-window][Switch to buffer in other window]]
+ - [[#save-the-results][Save the results]]
+ - [[#refresh-the-resumed-session][Refresh the resumed session]]
+ - [[#refresh-a-saved-buffer][Refresh a saved buffer]]
+ - [[#edit-a-saved-buffer][Edit a saved buffer]]
+ - [[#search-in-region][Search in region]]
+ - [[#switch-to-next-or-previous-source][Switch to next or previous source]]
+ - [[#commands-12][Commands]]
+- [[#helm-top][Helm Top]]
+ - [[#commands-13][Commands]]
+- [[#helm-elisp-package][Helm Elisp package]]
+ - [[#tips-11][Tips]]
+ - [[#compile-all-your-packages-asynchronously][Compile all your packages asynchronously]]
+ - [[#upgrade-elisp-packages][Upgrade Elisp packages]]
+ - [[#meaning-of-flags-prefixing-packages][Meaning of flags prefixing packages]]
+ - [[#commands-14][Commands]]
+- [[#helm-m-x][Helm M-x]]
+ - [[#tips-12][Tips]]
+ - [[#you-can-get-help-on-any-command-with-persistent-action-c-j][You can get help on any command with persistent action (C-j)]]
+ - [[#prefix-arguments][Prefix arguments]]
+ - [[#completion-styles-in-kbdhelm-m-x][Completion styles in {{{kbd(helm-M-x)}}}]]
+ - [[#duplicate-entries-in-helm-m-x-history][Duplicate entries in helm-M-x history]]
+- [[#helm-imenu][Helm Imenu]]
+ - [[#commands-15][Commands]]
+- [[#helm-colors][Helm colors]]
+ - [[#commands-16][Commands]]
+- [[#helm-semantic][Helm Semantic]]
+ - [[#commands-17][Commands]]
+- [[#helm-kmacro][Helm kmacro]]
+ - [[#tips-13][Tips]]
+ - [[#commands-18][Commands]]
+- [[#helm-kill-ring][Helm kill ring]]
+ - [[#tips-14][Tips]]
+ - [[#commands-19][Commands]]
+- [[#footnotes][Footnotes]]
+
+* Helm Generic Help
+
+** Basics
+
+# To navigate in this Help buffer see [[Helm help][here]].
+
+Helm narrows down the list of candidates as you type a filter
+pattern. See [[Matching in Helm][Matching in Helm]].
+
+Helm accepts multiple space-separated patterns, each pattern can
+be negated with =!=.
+
+Helm also supports fuzzy matching in some places when specified, you
+will find several variables to enable fuzzy matching in diverse [[Helm
+sources][sources]].
+
+Helm generally uses familiar Emacs keys to navigate the list.
+Here follow some of the less obvious bindings:
+
+- {{{kbd(RET)}}} selects the
+ candidate from the list, executes the default action upon exiting
+ the Helm session.
+
+- {{{kbd(C-j)}}} executes the
+ default action but without exiting the Helm session. Not all
+ sources support this.
+
+- {{{kbd(TAB)}}} displays a list of actions
+ available on current candidate or all marked candidates. The
+ default binding <tab> is ordinarily used for completion, but that
+ would be redundant since Helm completes upon every character
+ entered in the prompt.
+
+*Note*: In addition to the default actions list, additional actions
+appear depending on the type of the selected candidate(s). They
+are called filtered actions.
+
+*Additional Readings*:
+
+- Fuzzy Matching :: https://github.com/emacs-helm/helm/wiki/Fuzzy-matching
+- Helm Completion vs Emacs Completion :: https://github.com/emacs-helm/helm/wiki#helm-completion-vs-emacs-completion
+
+** Helm sources
+
+Helm uses what’s called sources to provide different kinds of
+completions. Each Helm session can handle one or more source. A
+source is an alist object which is build from various classes, see
+[[Writing your own Helm sources][here]].
+
+*Additional Readings*:
+
+- Creating a Helm source :: https://github.com/emacs-helm/helm/wiki/Developing#creating-a-source
+
+*** Configure sources
+
+You will find in Helm sources already built and bound to a
+variable called generally ~helm-source-<something>~. In this case
+it is an alist and you can change the attributes (keys) values
+using ~helm-set-attr~ function in your configuration. Of course
+you have to ensure before calling ~helm-set-attr~ that the file
+containing source is loaded, e.g. with ~with-eval-after-load~. Of
+course you can also completely redefine the source but this is
+generally not elegant as it duplicate for its most part code
+already defined in Helm.
+
+You will find also sources that are not built and even not bound
+to any variables because they are rebuilded at each start of a
+Helm session. In this case you can add a defmethod called
+~helm-setup-user-source~ to your config:
+
+#+begin_src elisp
+ (cl-defmethod helm-setup-user-source ((source helm-moccur-class))
+ (setf (slot-value source ’follow) -1))
+#+end_src
+
+*Additional Readings*:
+
+- Helm FAQ: Why is a customizable helm source nil :: https://github.com/emacs-helm/helm/wiki/FAQ#why-is-a-customizable-helm-source-nil
+- Complex Examples Of Configuration :: https://github.com/thierryvolpiatto/emacs-tv-config/blob/master/init-helm.el#L340
+
+** Modify keybindings in Helm
+
+Helm main keymap is ~helm-map~, all keys bound in this map apply
+to all Helm sources. However, most sources have their own keymap,
+with each binding overriding its counterpart in ~helm-map~, you
+can see all bindings in effect in the [[Commands][Commands]]
+section (available only if the source has its own keymap and
+documentation of course).
+
+** Matching in Helm
+
+All that you write in minibuffer is interpreted as a regexp or
+multiple regexps if separated by a space. This is true for most
+sources unless the developer of the source has disabled it or
+have choosen to use fuzzy matching. Even if a source has fuzzy
+matching enabled, Helm will switch to multi match as soon as it
+detects a space in the pattern. It may also switch to multi match
+as well if pattern starts with a =^= beginning of line sign. In
+those cases each pattern separated with space should be a regexp
+and not a fuzzy pattern. When using multi match patterns, each
+pattern starting with =!= is interpreted as a negation i.e.
+match everything but this.
+
+*** Completion-styles
+
+Helm generally fetches its candidates with the ~:candidates~
+function up to ~helm-candidate-number-limit~ and then applies
+match functions to these candidates according to ~helm-pattern~.
+But Helm allows matching candidates directly from the ~:candidates~
+function using its own ~completion-styles~.
+Helm provides ’helm completion style but also ’helm-flex
+completion style for Emacs<27 that don’t have ’flex completion
+style, otherwise (emacs-27) ’flex completion style is used to
+provide fuzzy aka flex completion.
+By default, like in Emacs vanilla, all completion commands (e.g.,
+~completion-at-point~) using ~completion-in-region~ or
+~completing-read~ use ~completion-styles~.
+Some Helm native commands like ~helm-M-x~ do use
+~completion-styles~. Any Helm sources can use ~completion-styles~
+by using ~:match-dynamic~ slot and building their ~:candidates~
+function with ~helm-dynamic-completion~.
+
+Example:
+
+#+begin_src elisp
+ (helm :sources (helm-build-sync-source "test"
+ :candidates (helm-dynamic-completion
+ ’(foo bar baz foab)
+ ’symbolp)
+ :match-dynamic t)
+ :buffer "*helm test*")
+
+#+end_src
+
+By default Helm sets up ~completion-styles~ and always adds ’helm
+to it. However the flex completion styles are not added. This is
+up to the user if she wants to have such completion to enable
+this.
+As specified above use ’flex for emacs-27 and ’helm-flex for
+emacs-26. Anyway, ’helm-flex is not provided in
+~completion-styles-alist~ if ’flex is present.
+
+Finally Helm provides two user variables to control
+~completion-styles~ usage: ~helm-completion-style~ and
+~helm-completion-syles-alist~. Both variables are customizable.
+The former allows retrieving previous Helm behavior if needed, by
+setting it to ~helm~ or ~helm-fuzzy~, default being ~emacs~ which
+allows dynamic completion and usage of ~completion-styles~. The
+second allows setting ~helm-completion-style~ per mode and also
+specifying ~completion-styles~ per mode (see its docstring). Note
+that these two variables take effect only in helm-mode i.e. in
+all that uses ~completion-read~ or ~completion-in-region~, IOW all
+helmized commands. File completion in ~read-file-name~ family
+doesn’t obey completion-styles and has its own file completion
+implementation. Native Helm commands using ~completion-styles~
+doesn’t obey ~helm-completion-style~ and
+~helm-completion-syles-alist~ (e.g., ~helm-M-x~).
+
+Also for a better control of styles in native Helm sources (not
+helmized by helm-mode) using ~:match-dynamic~,
+~helm-dynamic-completion~ provides a STYLES argument that allows
+specifying explicitely styles for this source.
+
+*Note*: Some old completion styles are not working fine with Helm
+and are disabled by default in
+~helm-blacklist-completion-styles~. They are anyway not useful in
+Helm because ’helm style supersedes these styles.
+
+** Helm mode
+
+~helm-mode~ toggles Helm completion in native Emacs functions, so
+when you turn ~helm-mode~ on, commands like ~switch-to-buffer~
+will use Helm completion instead of the usual Emacs completion
+buffer.
+
+*** What gets or does not get =helmized= when ~helm-mode~ is enabled?
+
+Helm provides generic completion on all Emacs functions using
+~completing-read~, ~completion-in-region~ and their derivatives,
+e.g. ~read-file-name~. Helm exposes a user variable to control
+which function to use for a specific Emacs command:
+~helm-completing-read-handlers-alist~. If the function for a
+specific command is nil, it turns off Helm completion. See the
+variable documentation for more infos.
+
+*** Helm functions vs helmized Emacs functions
+
+While there are Helm functions that perform the same completion
+as other helmized Emacs functions, e.g. ~switch-to-buffer~ and
+~helm-buffers-list~, the native Helm functions like
+~helm-buffers-list~ can receive new features that allow marking
+candidates, have several actions, etc. Whereas the helmized Emacs
+functions only have Helm completion, Emacs can provide no more
+than one action for this function. This is the intended behavior.
+
+Generally you are better off using the native Helm command than
+the helmized Emacs equivalent.
+
+*** Completion behavior with Helm and completion-at-point
+
+Helm is NOT completing dynamically. That means that when you are
+completing some text at point, completion is done against this
+text and subsequent characters you add AFTER this text. This
+allows you to use matching methods provided by Helm, that is multi
+matching or fuzzy matching (see [[Matching in Helm][Matching in
+Helm]]).
+
+Completion is not done dynamically (against ~helm-pattern~)
+because backend functions (i.e. ~competion-at-point-functions~)
+are not aware of Helm matching methods.
+
+By behaving like this, the benefit is that you can fully use Helm
+matching methods but you can’t start a full completion against a
+prefix different than the initial text you have at point. Helm
+warns you against this by colorizing the initial input and sends
+a user-error message when trying to delete backward text beyond
+this limit at first hit on DEL. A second hit on DEL within a
+short delay (1s) quits Helm and delete-backward char in
+current-buffer.
+
+** Helm help
+
+{{{kbd(C-x c h h)}}}: Show all Helm documentations concatenated
+in one org file.
+
+From a Helm session, just hit {{{kbd(C-h m)}}} to have
+the documentation for the current source followed by the global
+Helm documentation.
+
+While in the help buffer, most of the Emacs regular key bindings
+are available; the most important ones are shown in minibuffer.
+However, due to implementation restrictions, no regular Emacs
+keymap is used (it runs in a loop when reading the help buffer).
+Only simple bindings are available and they are defined in
+~helm-help-hkmap~, which is a simple alist of (key . function).
+You can define or redefine bindings in help with
+~helm-help-define-key~ or by adding/removing entries directly in
+~helm-help-hkmap~.
+See ~helm-help-hkmap~ for restrictions on bindings and functions.
+
+The documentation of default bindings are:
+
+| Key | Alternative keys | Command |
+|-----------+------------------+---------------------|
+| C-v | Space next | Scroll up |
+| M-v | b prior | Scroll down |
+| C-s | | Isearch forward |
+| C-r | | Isearch backward |
+| C-a | | Beginning of line |
+| C-e | | End of line |
+| C-f | right | Forward char |
+| C-b | left | Backward char |
+| C-n | down | Next line |
+| C-p | up | Previous line |
+| M-a | | Backward sentence |
+| M-e | | Forward sentence |
+| M-f | | Forward word |
+| M-b | | Backward word |
+| M-> | | End of buffer |
+| M-< | | Beginning of buffer |
+| C-<SPACE> | | Toggle mark |
+| C-M-SPACE | | Mark sexp |
+| RET | | Follow org link |
+| C-% | | Push org mark |
+| C-& | | Goto org mark-ring |
+| TAB | | Org cycle |
+| M-<TAB> | | Toggle visibility |
+| M-w | | Copy region |
+| q | | Quit |
+
+** Customize Helm
+
+Helm provides a lot of user variables for extensive customization.
+From any Helm session, type {{{kbd(C-h c)}}}
+to jump to the current source ~custom~ group. Helm also has a
+special group for faces you can access via {{{kbd(M-x customize-group RET helm-faces)}}}.
+
+*Note*: Some sources may not have their group set and default to
+the ~helm~ group.
+
+** Display Helm in windows and frames
+
+You can display the Helm completion buffer in many different
+window configurations, see the custom interface to discover the
+different windows configurations available (See [[Customize Helm][Customize Helm]] to jump to custom interface).
+When using Emacs in a graphic display (i.e. not in a terminal) you can as
+well display your Helm buffers in separated frames globally for
+all Helm commands or separately for specific Helm commands.
+See ~helm-display-function~ and ~helm-commands-using-frame~.
+
+There is a variable to allow reusing frame instead of deleting
+and creating a new one at each session, see ~helm-display-buffer-reuse-frame~.
+Normally you don’t have to use this, it have been made to workaround
+slow frame popup in Emacs-26, to workaround this slowness in Emacs-26 use instead
+
+#+begin_src elisp
+ (when (= emacs-major-version 26)
+ (setq x-wait-for-event-timeout nil))
+#+end_src
+
+*Additional Readings*:
+
+- https://github.com/emacs-helm/helm/wiki/frame
+
+*Warning*:
+There is a package called posframe and also one called helm-posframe,
+you DO NOT need these packages to display helm buffers in frames.
+
+** Helm’s basic operations and default key bindings
+
+| Key | Alternative Keys | Command |
+|--------------+------------------+----------------------------------------------------------------------|
+| C-p | Up | Previous line |
+| C-n | Down | Next line |
+| M-v | prior | Previous page |
+| C-v | next | Next page |
+| Enter[fn:1] | | Execute first (default) action / Select [1] |
+| M-< | | First line |
+| M-> | | Last line |
+| C-M-S-v | M-prior, C-M-y | Previous page (other-window) |
+| C-M-v | M-next | Next page (other-window) |
+| Tab | C-i | Show action list |
+| M-o | left | Previous source |
+| C-o | right | Next source |
+| C-k[fn:2] | | Delete pattern (with prefix arg delete from point to end or all [2]) |
+| C-j | | Persistent action (Execute and keep Helm session) |
+
+*Note*: Any of these bindings are from ~helm-map~ and may be
+overriten by the map specific to the current source in use (each
+source can have its own keymap).
+
+** The actions menu
+
+You can display the action menu in the same window
+as helm candidates (default) or in a side window according to
+~helm-show-action-window-other-window~ value.
+
+When the action menu popup, the helm prompt is used to narrow
+down this menu, no more candidates.
+
+When ~helm-allow-mouse~ is non nil, you can use as well
+mouse-3 (right click) in the candidate zone to select actions
+with the mouse once your candidate is selected.
+
+** Action transformers
+
+You may be surprized to see your actions list changing depending
+on the context. This happen when a source has an action
+transformer function which checks the current selected candidate
+and adds specific actions for this candidate.
+
+** Shortcuts for n-th first actions
+
+{{{kbd(<f1>)}}}...{{{kbd(<f12>)}}}: Execute n-th action where n is 1 to 12.
+
+** Shortcuts for executing the default action on the n-th candidate
+
+Helm does not display line numbers by default, with Emacs-26+ you
+can enable it permanently in all helm buffers with:
+
+ #+begin_src elisp
+ (add-hook ’helm-after-initialize-hook ’helm-init-relative-display-line-numbers)
+ #+end_src
+
+You can also toggle line numbers with
+{{{kbd(C-c l)}}} in current Helm
+buffer.
+
+Of course when enabling ~global-display-line-numbers-mode~ Helm
+buffers will have line numbers as well. (Don’t forget to
+customize ~display-line-numbers-type~ to relative).
+
+In Emacs versions < to 26 you will have to use linum-relative[fn:3]
+package and ~helm-linum-relative-mode~.
+
+Then when line numbers are enabled with one of the methods above
+the following keys are available[fn:4]:
+
+{{{kbd(C-x <n>)}}}: Execute default action on the n-th candidate before
+currently selected candidate.
+
+{{{kbd(C-c <n>)}}}: Execute default action on the n-th candidate after
+current selected candidate.
+
+=n= is limited to 1-9. For larger jumps use other navigation
+keys.
+
+** Mouse control in Helm
+
+A basic support for the mouse is provided when the user sets
+~helm-allow-mouse~ to non-nil.
+
+- mouse-1 selects the candidate.
+- mouse-2 executes the default action on selected candidate.
+- mouse-3 pops up the action menu.
+
+*Note*: When mouse control is enabled in Helm, it also lets you
+click around and lose the minibuffer focus: you’ll have to click
+on the Helm buffer or the minibuffer to retrieve control of your
+Helm session.
+
+** Marked candidates
+
+You can mark candidates to execute an action on all of them
+instead of the current selected candidate only. (See bindings
+below.) Most Helm actions operate on marked candidates unless
+candidate-marking is explicitely forbidden for a specific source.
+
+- To mark/unmark a candidate, use
+ {{{kbd(C-@)}}}. (See bindings below.) With a
+ numeric prefix arg mark ARG candidates forward, if ARG is
+ negative mark ARG candidates backward.
+
+- To mark all visible unmarked candidates at once in current
+ source use {{{kbd(M-a)}}}. With a prefix argument, mark all
+ candidates in all sources.
+
+- To unmark all visible marked candidates at once use
+ {{{kbd(M-U)}}}.
+
+- To mark/unmark all candidates at once use
+ {{{kbd(M-m)}}}. With a prefix argument, mark/unmark
+ all candidates in all sources.
+
+*Note*: When multiple candidates are selected across different
+sources, only the candidates of the current source will be used
+when executing most actions (as different sources can have
+different actions). Some actions support multi-source marking
+however.
+
+** Follow candidates
+
+When ~helm-follow-mode~ is on ({{{kbd(C-c C-f)}}}
+to toggle it), moving up and down Helm session or updating the
+list of candidates will automatically execute the
+persistent-action as specified for the current source.
+
+If ~helm-follow-mode-persistent~ is non-nil, the state of the
+mode will be restored for the following Helm sessions.
+
+If you just want to follow candidates occasionally without
+enabling ~helm-follow-mode~, you can use
+{{{kbd(C-<down>)}}} or
+{{{kbd(C-<up>)}}} instead. Conversely, when
+~helm-follow-mode~ is enabled, those commands go to previous/next
+line without executing the persistent action.
+
+** Frequently Used Commands
+
+| Keys | Description |
+|----------+-----------------------------------------------------------------------------------|
+| C-t | Toggle vertical/horizontal split on first hit and swap Helm window on second hit. |
+| C-c % | Exchange minibuffer and header-line. |
+| C-x C-f | Drop into ‘helm-find-files’. |
+| C-c C-k | Kill display value of candidate and quit (with prefix arg, kill the real value). |
+| C-c C-y | Yank current selection into pattern. |
+| C-c TAB | Copy selected candidate at point in current buffer. |
+| C-c C-f | Toggle automatic execution of persistent action. |
+| C-<down> | Run persistent action then select next line. |
+| C-<up> | Run persistent action then select previous line. |
+| C-c C-u | Recalculate and redisplay candidates. |
+| C-! | Toggle candidate updates. |
+
+** Special yes, no or yes for all answers
+
+You may be prompted in the minibuffer to answer by [y,n,!,q] in
+some places for confirmation.
+
+- y mean yes
+- no mean no
+- ! mean yes for all
+- q mean quit or abort current operation.
+
+When using ! you will not be prompted for the same thing in
+current operation any more, e.g. file deletion, file copy etc...
+
+** Moving in ~helm-buffer~
+
+You can move in ~helm-buffer~ with the usual commands used in
+Emacs: ({{{kbd(C-n)}}},
+{{{kbd(C-p)}}}, etc. See above basic
+commands. When ~helm-buffer~ contains more than one source,
+change source with {{{kbd(C-o)}}} and
+{{{kbd(M-o)}}}.
+
+*Note*: When reaching the end of a source,
+{{{kbd(C-n)}}} will *not* go to the next source
+when variable ~helm-move-to-line-cycle-in-source~ is non-nil, so
+you will have to use {{{kbd(C-o)}}} and
+{{{kbd(M-o)}}}.
+
+** Resume previous session from current Helm session
+
+You can use {{{kbd(C-c n)}}} (~helm-run-cycle-resume~) to cycle in
+resumables sources. {{{kbd(C-c n)}}} is a special key set with
+~helm-define-key-with-subkeys~ which, after pressing it, allows
+you to keep cycling with further {{{kbd(n)}}}.
+
+*Tip*: You can bound the same key in ~global-map~ to
+ ~helm-cycle-resume~ with ~helm-define-key-with-subkeys~ to
+ let you transparently cycle sessions, Helm fired up or not.
+ You can also bind the cycling commands to single key
+ presses (e.g., {{{kbd(S-<f1>)}}}) this time with a simple
+ ~define-key~. (Note that {{{kbd(S-<f1>)}}} is not available in
+ terminals.)
+
+*Note*: ~helm-define-key-with-subkeys~ is available only once Helm
+is loaded.
+
+You can also use
+{{{kbd(C-x b)}}} to resume
+the previous session, or
+{{{kbd(C-x C-b)}}} to have
+completion on all resumable buffers.
+
+** Global commands
+
+*** Resume Helm session from outside Helm
+
+{{{kbd(C-x c b)}}} revives the last Helm session.
+Binding a key to this command will greatly improve Helm
+interactivity, e.g. when quitting Helm accidentally.
+
+You can call {{{kbd(C-x c b)}}} with a prefix argument
+to choose (with completion!) which session you’d like to resume.
+You can also cycle in these sources with ~helm-cycle-resume~ (see
+above).
+
+** Debugging Helm
+
+Helm exposes the special variable ~helm-debug~: setting it to
+non-nil will enable Helm logging in a special outline-mode
+buffer. Helm resets the variable to nil at the end of each
+session.
+
+For convenience, {{{kbd(C-h C-d)}}}
+allows you to turn on debugging for this session only. To avoid
+accumulating log entries while you are typing patterns, you can
+use {{{kbd(C-!)}}} to turn off
+updating. When you are ready turn it on again to resume logging.
+
+Once you exit your Helm session you can access the debug buffer
+with ~helm-debug-open-last-log~. It is possible to save logs to
+dated files when ~helm-debug-root-directory~ is set to a valid
+directory.
+
+*Note*: Be aware that Helm log buffers grow really fast, so use
+~helm-debug~ only when needed.
+
+** Writing your own Helm sources
+
+Writing simple sources for your own usage is easy. When calling
+the ~helm~ function, the sources are added the ~:sources~ slot
+which can be a symbol or a list of sources. Sources can be built
+with different EIEIO classes depending on what you want to do. To
+simplify this, several ~helm-build-*~ macros are provided. Below
+there are simple examples to start with.
+
+#+begin_src elisp
+ ;; Candidates are stored in a list.
+ (helm :sources (helm-build-sync-source "test"
+ ;; A function can be used as well
+ ;; to provide candidates.
+ :candidates ’("foo" "bar" "baz"))
+ :buffer "*helm test*")
+
+ ;; Candidates are stored in a buffer.
+ ;; Generally faster but doesn’t allow a dynamic updating
+ ;; of the candidates list i.e the list is fixed on start.
+ (helm :sources (helm-build-in-buffer-source "test"
+ :data ’("foo" "bar" "baz"))
+ :buffer "*helm test*")
+#+end_src
+
+*Additional Readings*:
+
+- For source code and complex examples :: https://github.com/emacs-helm/helm/wiki/Developing
+
+** Helm Map
+
+| *Key* | *Binding* | *Comments* |
+|---------------+------------------------------------------+--------------------------------------|
+| C-@ | helm-toggle-visible-mark | |
+| C-c | Prefix Command | |
+| C-g | helm-keyboard-quit | |
+| C-h | Prefix Command | |
+| TAB | helm-select-action | |
+| C-j | helm-execute-persistent-action | |
+| C-k | helm-delete-minibuffer-contents | |
+| C-l | helm-recenter-top-bottom-other-window | |
+| RET | helm-maybe-exit-minibuffer | |
+| C-n | helm-next-line | |
+| C-o | helm-next-source | |
+| C-p | helm-previous-line | |
+| C-t | helm-toggle-resplit-and-swap-windows | |
+| C-v | helm-next-page | |
+| C-w | ?? | |
+| C-x | Prefix Command | |
+| ESC | Prefix Command | |
+| C-SPC | helm-toggle-visible-mark-forward | |
+| C-! | helm-toggle-suspend-update | |
+| C-{ | helm-enlarge-window | |
+| C-} | helm-narrow-window | |
+| C-M-<down> | helm-scroll-other-window | |
+| C-M-<up> | helm-scroll-other-window-down | |
+| C-<down> | helm-follow-action-forward | |
+| C-<up> | helm-follow-action-backward | |
+| M-<next> | helm-scroll-other-window | |
+| M-<prior> | helm-scroll-other-window-down | |
+| <XF86Back> | previous-history-element | |
+| <XF86Forward> | next-history-element | |
+| <down> | helm-next-line | |
+| <f1> | ?? | |
+| <f2> | ?? | |
+| <f3> | ?? | |
+| <f4> | ?? | |
+| <f5> | ?? | |
+| <f6> | ?? | |
+| <f7> | ?? | |
+| <f8> | ?? | |
+| <f9> | ?? | |
+| <f10> | ?? | |
+| <f11> | ?? | |
+| <f12> | ?? | |
+| <f13> | ?? | |
+| <help> | Prefix Command | |
+| <left> | helm-previous-source | |
+| <next> | helm-next-page | |
+| <prior> | helm-previous-page | |
+| <right> | helm-next-source | |
+| <tab> | helm-execute-persistent-action | |
+| <up> | helm-previous-line | |
+| | | |
+| <help> m | helm-help | |
+| | | |
+| C-h C-d | helm-enable-or-switch-to-debug | |
+| C-h c | helm-customize-group | |
+| C-h m | helm-help | |
+| | | |
+| C-c C-f | helm-follow-mode | |
+| C-c TAB | helm-copy-to-buffer | |
+| C-c C-k | helm-kill-selection-and-quit | |
+| C-c C-u | helm-refresh | |
+| C-c C-y | helm-yank-selection | |
+| C-c % | helm-exchange-minibuffer-and-header-line | |
+| C-c - | helm-swap-windows | |
+| C-c 1 | helm-execute-selection-action-at-nth-+1 | |
+| C-c 2 | helm-execute-selection-action-at-nth-+2 | |
+| C-c 3 | helm-execute-selection-action-at-nth-+3 | |
+| C-c 4 | helm-execute-selection-action-at-nth-+4 | |
+| C-c 5 | helm-execute-selection-action-at-nth-+5 | |
+| C-c 6 | helm-execute-selection-action-at-nth-+6 | |
+| C-c 7 | helm-execute-selection-action-at-nth-+7 | |
+| C-c 8 | helm-execute-selection-action-at-nth-+8 | |
+| C-c 9 | helm-execute-selection-action-at-nth-+9 | |
+| C-c > | helm-toggle-truncate-line | |
+| C-c ? | helm-help | |
+| C-c _ | helm-toggle-full-frame | |
+| C-c l | helm-display-line-numbers-mode | |
+| C-c n | ?? | |
+| | | |
+| C-x C-b | helm-resume-list-buffers-after-quit | |
+| C-x C-f | helm-quit-and-find-file | |
+| C-x 1 | helm-execute-selection-action-at-nth-+1 | |
+| C-x 2 | helm-execute-selection-action-at-nth-+2 | |
+| C-x 3 | helm-execute-selection-action-at-nth-+3 | |
+| C-x 4 | helm-execute-selection-action-at-nth-+4 | |
+| C-x 5 | helm-execute-selection-action-at-nth-+5 | |
+| C-x 6 | helm-execute-selection-action-at-nth-+6 | |
+| C-x 7 | helm-execute-selection-action-at-nth-+7 | |
+| C-x 8 | helm-execute-selection-action-at-nth-+8 | |
+| C-x 9 | helm-execute-selection-action-at-nth-+9 | |
+| C-x b | helm-resume-previous-session-after-quit | |
+| | | |
+| C-M-a | helm-show-all-candidates-in-source | |
+| C-M-e | helm-display-all-sources | |
+| C-M-l | helm-reposition-window-other-window | |
+| C-M-v | helm-scroll-other-window | |
+| C-M-y | helm-scroll-other-window-down | |
+| M-SPC | helm-toggle-visible-mark-backward | |
+| M-( | helm-prev-visible-mark | |
+| M-) | helm-next-visible-mark | |
+| M-< | helm-beginning-of-buffer | |
+| M-> | helm-end-of-buffer | |
+| M-U | helm-unmark-all | |
+| M-a | helm-mark-all | |
+| M-g | Prefix Command | |
+| M-m | helm-toggle-all-marks | |
+| M-n | next-history-element | |
+| M-o | helm-previous-source | |
+| M-p | previous-history-element | |
+| M-v | helm-previous-page | |
+| C-M-S-v | helm-scroll-other-window-down | |
+| | | |
+| M-g ESC | Prefix Command | |
+| | | |
+| M-< | minibuffer-beginning-of-buffer | (this binding is currently shadowed) |
+| M-g | Prefix Command | |
+| M-r | previous-matching-history-element | |
+| M-s | next-matching-history-element | (this binding is currently shadowed) |
+| | | |
+| M-g ESC | Prefix Command | |
+| | | |
+| M-g M-c | helm-comint-input-ring | |
+| | | |
+| M-g M-h | helm-minibuffer-history | |
+
+* Helm Buffer
+
+** Pattern matching in helm-buffers
+
+You can filter the buffer list based on one or more of the following
+components:
+
+1. buffer's ~mode-name~
+2. its content
+3. its directory
+4. its name
+
+A buffer match pattern is a space-separated list of one or more
+directives. Each directive looks like
+
+: <pattern-type><negate-may-be><pattern-value>
+
+=<pattern-type>= determines how the =<pattern-value>= is
+interpreted. =<pattern-type>= can be one of the following:
+
+- =*= :: Partially match =<pattern-value>= against buffer's ~mode-name~
+- =@= :: Partially match =<pattern-value>= against buffer's contents
+- =/= :: Partially match =<pattern-value>= against buffer's directory
+- =^= :: Fuzz-matching. The description of what the pattern does is
+ not clear.
+- {{{samp({{{unicode(200b)}}})}}} :: an empty string. Compare =<pattern-value>=
+ against buffer's name.
+
+=<negate-may-be>= determines the truth value of the match. It can be
+one of the following:
+
+- {{{samp({{{unicode(200b)}}})}}} :: an empty string. =<pattern-value>= must
+ partially match the corresponding attribute
+
+- =!= :: Negate the sense of above match.
+
+*** Examples
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+Down below you see some common patterns, and how they are interpreted:
+
+- Match against buffer's ~mode-name~
+
+ - =*lisp= :: List only buffers whose ~mode-name~ name matches =lisp=.
+
+ - =*!lisp= :: List only buffers whose ~mode-name~ name does /not/ match
+ =lisp=.
+
+ - =*!lisp,!sh,!fun= :: List only buffers whose mode name does /not/
+ match any of =lisp=, =sh= or =fun=.
+
+- Match against buffer's content
+
+ - =@foo= :: List only those buffers that contain =foo=
+
+ - =@!foo= :: List only those buffers that do /not/ contain =foo=.
+
+ - =@foo @bar= :: List only those buffers that contain both =foo= /and/
+ =bar=.
+
+ - =@foo @!bar= :: List only those buffers that contain =foo= but /not/
+ =bar=.
+
+- Match against buffer's directory
+
+ - =/src= :: List only buffers whose directory matches =src=.
+
+- Match against buffer's name in a fuzzy way
+
+- Match against a combination of above criterion.
+
+ - =*lisp ^helm @moc= :: List only buffers that are in =lisp= mode, whose
+ name starts start with =helm= and contains =moc=.
+
+ - =*lisp ^helm moc= :: List only buffers that are in =lisp= mode, whose
+ name starts start with =helm= and whose name contains =moc=
+
+ - =*!lisp !helm= :: List only buffers that are NOT in =lisp= mode and
+ whose name does NOT match =helm=.
+
+ - =/helm/ w3= :: List only buffers whose directory matches =helm= and
+ whose name matches =w3=.
+
+** Tips
+
+*** COMMENT Completion
+
+**** Major-mode
+
+You can enter a partial major-mode name (e.g. lisp, sh) to narrow down buffers.
+To specify the major-mode, prefix it with =*= e.g. =*lisp=.
+
+If you want to match all buffers but the ones with a specific major-mode
+(negation), prefix the major-mode with =!= e.g. =*!lisp=.
+
+If you want to specify more than one major-mode, separate them with =,=,
+e.g. =*!lisp,!sh,!fun= lists all buffers but the ones in lisp-mode, sh-mode
+and fundamental-mode.
+
+Then enter a space followed by a pattern to narrow down to buffers matching this
+pattern.
+
+**** Search inside buffers
+
+If you enter a space and a pattern prefixed by =@=, Helm searches for text
+matching this pattern *inside* the buffer (i.e. not in the name of the buffer).
+
+Negation are supported i.e. =!=.
+
+When you specify more than one of such patterns, it will match
+buffers with contents matching each of these patterns i.e. AND,
+not OR. That means that if you specify =@foo @bar= the contents
+of buffer will have to be matched by foo AND bar. If you specify
+=@foo @!bar= it means the contents of the buffer have to be
+matched by foo but NOT bar.
+
+If you enter a pattern prefixed with an escaped =@=, Helm searches for a
+buffer matching =@pattern= but does not search inside the buffer.
+
+**** Search by directory name
+
+If you prefix the pattern with =/=, Helm matches over the directory names
+of the buffers.
+
+This feature can be used to narrow down the search to one directory while
+subsequent strings entered after a space match over the buffer name only.
+
+Note that negation is not supported for matching on buffer filename.
+
+Starting from Helm v1.6.8, you can specify more than one directory.
+
+**** Fuzzy matching
+
+~helm-buffers-fuzzy-matching~ turns on fuzzy matching on buffer names, but not
+on directory names or major modes. A pattern starting with =^= disables fuzzy
+matching and matches by exact regexp.
+
+**** Examples
+
+With the following pattern
+
+ : *lisp ^helm @moc
+
+Helm narrows down the list by selecting only the buffers that are in lisp mode,
+start with =helm= and which content matches =moc=.
+
+Without the =@=
+
+ : *lisp ^helm moc
+
+Helm looks for lisp mode buffers starting with =helm= and containing =moc=
+in their name.
+
+With this other pattern
+
+ : *!lisp !helm
+
+Helm narrows down to buffers that are not in =lisp= mode and that do not match
+=helm=.
+
+With this last pattern
+
+ : /helm/ w3
+
+Helm narrows down to buffers that are in any =helm= subdirectory and
+matching =w3=.
+
+*** Creating buffers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+When creating a new buffer, use {{{kbd(C-u)}}} to choose a mode from a
+list. This list is customizable, see ~helm-buffers-favorite-modes~.
+
+*** Killing buffers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+You can kill buffers either one by one or all the marked buffers at once.
+
+One kill-buffer command leaves Helm while the other is persistent. Run the
+persistent kill-buffer command either with the regular
+~helm-execute-persistent-action~ called with a prefix argument ({{{kbd(C-u C-j)}}})
+or with its specific command ~helm-buffer-run-kill-persistent~. See the
+bindings below.
+
+*** Switching to buffers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+To switch to a buffer, press RET, to switch to a buffer in another window, select this buffer
+and press {{{kbd(C-c o)}}}, when called with a prefix arg
+the buffer will be displayed vertically in other window.
+If you mark more than one buffer, the marked buffers will be displayed in different windows.
+
+*** Saving buffers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+If buffer is associated to a file and is modified, it is by default colorized in orange,
+see [[Meaning of colors and prefixes for buffers][Meaning of colors and prefixes for buffers]].
+You can save these buffers with {{{kbd(C-x C-s)}}}.
+If you want to save all these buffers, you can mark them with {{{kbd(C-M-SPC)}}}
+and save them with {{{kbd(C-x C-s)}}}. You can also do this in one step with
+{{{kbd(C-x s)}}}. Note that you will not be asked for confirmation.
+
+*** Meaning of colors and prefixes for buffers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+Remote buffers are prefixed with ’@’.
+
+- Red :: Buffer’s file was modified on disk by an external process.
+- Indianred2 :: Buffer exists but its file has been deleted.
+- Orange :: Buffer is modified and not saved to disk.
+- Italic :: A non-file buffer.
+- Yellow :: Tramp archive buffer.
+
+# #+begin_src emacs-lisp
+# ((helm-buffer-saved-out
+# (t :extend t :foreground "red" :background "black"))
+# (helm-buffer-not-saved
+# (t :extend t :foreground "Indianred2"))
+# (helm-buffer-modified
+# (t :extend t :inherit font-lock-comment-face))
+# (helm-no-file-buffer-modified
+# (t :extend t :foreground "orange" :background "black"))
+# (helm-buffer-size
+# (((background dark))
+# :extend t :foreground "RosyBrown")
+# (((background light))
+# :extend t :foreground "SlateGray"))
+# (helm-buffer-process
+# (t :extend t :foreground "Sienna3"))
+# (helm-buffer-directory
+# (t :extend t :foreground "DarkRed" :background "LightGray"))
+# (helm-buffer-file
+# (t :extend t :inherit font-lock-builtin-face))
+# (helm-buffer-archive
+# (t :extend t :foreground "Gold"))
+# (helm-non-file-buffer
+# (t :extend t :inherit italic)))
+# #+end_src
+
+** Commands
+
+| Keys | Description |
+|---------+-------------------------------------------------------------------------------------------------|
+| M-g s | Grep Buffer(s) works as zgrep too (‘C-u’ to grep all buffers but non-file buffers). |
+| C-s | Multi-Occur buffer or marked buffers (‘C-u’ to toggle force-searching current-buffer). |
+| C-c o | Switch to other window. |
+| C-c C-o | Switch to other frame. |
+| C-x C-d | Browse project from buffer. |
+| C-M-% | Query-replace-regexp in marked buffers. |
+| M-% | Query-replace in marked buffers. |
+| C-c = | Ediff current buffer with candidate. With two marked buffers, ediff those buffers. |
+| M-= | Ediff-merge current buffer with candidate. With two marked buffers, ediff-merge those buffers. |
+| C-= | Toggle Diff-buffer with saved file without leaving Helm. |
+| M-G | Revert buffer without leaving Helm. |
+| C-x C-s | Save buffer without leaving Helm. |
+| C-x s | Save all unsaved buffers. |
+| M-D | Delete marked buffers and leave Helm. |
+| C-c d | Delete buffer without leaving Helm. |
+| M-R | Rename buffer. |
+| M-m | Toggle all marks. |
+| M-a | Mark all. |
+| C-] | Toggle details. |
+| C-c a | Show hidden buffers. |
+| C-M-SPC | Mark all buffers of the same type (color) as current buffer. |
+
+* Helm Find Files
+
+** Overview
+
+*** Quick pattern expansion
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+# : Find files or url: /path/to/default/directory/
+
+- Enter =~/= at end of pattern to quickly reach home directory
+
+- Enter =/= at end of pattern to quickly reach the file system root
+
+- Enter =./= at end of pattern to quickly reach ~default-directory~
+
+ The value of ~default-directory~ is the one at the beginning of the
+ session. If you already are in the ~default-directory~ this will
+ move the cursor to the top.
+
+- Enter =../= at end of pattern will reach upper directory, moving cursor to the top
+
+ This is different from using {{{kbd(C-l)}}} in that it moves
+ the cursor to the top instead of remaining on the previous subdir name.
+
+- Enter =..name/= at end of pattern to start a recursive search
+
+ It searches directories matching =name= under the current directory, see the
+ "Recursive completion on subdirectories" section below for more details.
+
+- Any environment variable (e.g. =$HOME=) at end of pattern gets expanded
+
+- Any valid filename yanked after pattern gets expanded
+
+- Special case: URL at point
+
+ The quick expansions do not take effect at the end of a URL, you
+ must kill the pattern first ({{{kbd(C-k)}}}).
+
+Creating a file or directory:
+
+- To create a new file, enter a filename not ending with =/=
+
+ Note that when you enter a new name, this one is prefixed with [?]
+ if you are in a writable directory. If you are in a directory where
+ you have no write permission the new file name is not prefixed and
+ is colored in red. There is not such distinction when using Tramp,
+ new filename just appears on top of buffer.
+
+- To create a new directory, append a =/= to the new name and press
+ {{{kbd(RET)}}}
+
+- You can create a new directory and a new file at the same time
+
+ Simply write the path in the prompt and press {{{kbd(RET)}}}, e.g.
+ =~/new/newnew/newnewnew/my_newfile.txt=.
+
+*** Helm-find-files supports fuzzy matching
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+Helm-find-files supports fuzzy matching. Narrowing by fuzzy matching
+kicks in only when there are atleast 3 characters in the pattern.
+What this means is this: If you have typed a pattern and do /not/ see
+any filtering happening when you expect it to happen, do /not/ jump
+the gun and conclude that fuzzy matching is broken. It is possible
+that your pattern is shorter than 3 characters, and you may have to
+type more characters to see the filter at work.
+
+*** Toggle auto-completion
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+It is useful when trying to create a new file or directory and you don’t want
+Helm to complete what you are writing.
+
+*Note*: On a terminal, the default binding {{{kbd(C-<backspace>)}}} may not work.
+In this case use {{{kbd(C-c <backspace>)}}}.
+
+*** Use the wildcard to select multiple files
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+Use of wildcard is supported to run an action over a set of files.
+
+Example: You can copy all the files with =.el= extension by using =*.el= and
+then run copy action.
+
+Similarly, =**.el= (note the two stars) will recursively select all =.el=
+files under the current directory.
+
+The =**= feature is active by default in the option ~helm-file-globstar~. It
+is different from the Bash =shopt globstar= feature in that to list files with
+a named extension recursively you would write =**.el= whereas in Bash it would
+be =**/*.el=. Directory selection with =**/= like Bash =shopt globstar=
+option is not supported yet.
+
+Helm supports different styles of wildcards:
+
+- ‘sh’ style, the ones supported by ‘file-expand-wildcards’.
+ e.g. =*.el=, =*.[ch]= which match respectively all =.el=
+ files or all =.c= and =.h= files.
+
+- ‘bash’ style (partially) In addition to what allowed in ‘sh’
+ style you can specify file extensions that have more than one
+ character like this: =*.{sh,py}= which match =.sh= and
+ =.py= files.
+
+Of course in both styles you can specify one or two =*=.
+
+*** Navigation summary
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+For a better experience you can enable auto completion by setting
+~helm-ff-auto-update-initial-value~ to non-nil in your init file. It is not
+enabled by default to not confuse new users.
+
+- Navigate with arrow keys
+
+ You can use <right> and <left> arrows to go down or up one level, to disable
+ this customize ~helm-ff-lynx-style-map~.
+ Note that using ~setq~ will NOT work.
+
+- Use {{{kbd(C-j)}}} (persistent action) on a directory to go down one level
+
+ On a symlinked directory a prefix argument expands to its true name.
+
+- Use {{{kbd(C-l)}}} or {{{kbd(DEL)}}} on a directory to go up one level
+
+ {{{kbd(DEL)}}} behavior
+
+ {{{kbd(DEL)}}} by default deletes char backward.
+
+ But when ~helm-ff-DEL-up-one-level-maybe~ is non nil {{{kbd(DEL)}}} behaves
+ differently depending on the contents of helm-pattern. It goes up one
+ level if the pattern is a directory ending with =/= or disables HFF
+ auto update and delete char backward if the pattern is a filename or
+ refers to a non existing path. Going up one level can be disabled
+ if necessary by deleting =/= at the end of the pattern using
+ {{{kbd(C-b)}}} and {{{kbd(C-k)}}}.
+
+ Note that when deleting char backward, Helm takes care of
+ disabling update giving you the opportunity to edit your pattern for
+ e.g. renaming a file or creating a new file or directory.
+ When ~helm-ff-auto-update-initial-value~ is non nil you may want to
+ disable it temporarily, see [[Toggle auto-completion][Toggle auto-completion]] for this.
+
+- Use {{{kbd(C-r)}}} to walk back the resulting tree of all the {{{kbd(C-l)}}} or DEL you did
+
+ The tree is reinitialized each time you browse a new tree with
+ {{{kbd(C-j)}}} or by entering some pattern in the prompt.
+
+- {{{kbd(RET)}}} behavior
+
+ It behaves differently depending on ~helm-selection~ (current candidate in helm-buffer):
+
+ - candidate basename is =.= :: Open it in dired.
+ - candidate is a directory :: Expand it.
+ - candidate is a file :: Open it.
+
+ If you have marked candidates and you press RET on a directory,
+ Helm will navigate to this directory. If you want to exit with
+ RET with default action with these marked candidates, press RET a
+ second time while you are on the root of this directory e.g.
+ =/home/you/dir/.= or press RET on any file which is not a
+ directory. You can also exit with default action at any moment
+ with {{{kbd(f1)}}}.
+
+ Note that when copying, renaming, etc. from ~helm-find-files~ the
+ destination file is selected with ~helm-read-file-name~.
+
+- {{{kbd(TAB)}}} behavior
+
+ Normally {{{kbd(TAB)}}} is bound to ~helm-select-action~ in helm-map which
+ display the action menu.
+
+ You can change this behavior by setting in ~helm-find-files-map~
+ a new command for {{{kbd(TAB)}}}:
+
+ #+begin_src elisp
+ (define-key helm-find-files-map (kbd "C-i") ’helm-ff-TAB)
+ #+end_src
+
+ It will then behave slighly differently depending of
+ ~helm-selection~:
+
+ - candidate basename is =.= :: open the action menu.
+ - candidate is a directory :: expand it (behave as C-j).
+ - candidate is a file :: open action menu.
+
+ Called with a prefix arg open menu unconditionally.
+
+- {{{kbd(C-j)}}} behaviour
+
+ {{{kbd(C-j)}}} on a filename expands to that filename in the Helm
+ buffer. Second hit displays the buffer filename. Third hit kills the
+ buffer filename.
+
+ {{{kbd(C-u C-j)}}} displays the buffer directly.
+
+ If you have mounted your filesystem with mountavfs, you can expand
+ archives in the =~/.avfs= directory with {{{kbd(C-j)}}}. Expand
+ archives as directories in a avfs directory
+
+*** Filter out files or directories
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+You can show files or directories only with respectively
+{{{kbd(S-<f4>)}}} and {{{kbd(S-<f5>)}}}.
+These are toggle commands i.e. filter/show_all.
+Changing directory disable filtering.
+
+*** Sort directory contents
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+When listing a directory without narrowing its contents, i.e. when pattern ends with =/=,
+you can sort alphabetically, by newest or by size by using respectively
+{{{kbd(S-<f1>)}}}, {{{kbd(S-<f2>)}}} or {{{kbd(S-<f3>)}}}.
+
+*Note*:
+When starting back narrowing i.e. entering something in minibuffer after =/= sorting is done
+again with fuzzy sorting and no more with sorting methods previously selected.
+
+** Operate on files
+
+*** Create a file or a directory
+
+*** Open files in separate windows
+
+ When marking multiple files ([[*Marked candidates]]) or using wildcard
+ ([[*Use the wildcard to select multiple files]]), helm allow opening all
+ this files in separate windows using an horizontal layout or a
+ vertical layout if you used a prefix arg, when no more windows can be
+ displayed in frame, next files are opened in background without being
+ displayed. When using {{{kbd(C-c o)}}} the current
+ buffer is kept and files are displayed next to it with same behavior as above.
+ When using two prefix args, files are opened in background without beeing displayed.
+
+*** Open files
+
+**** Open files externally
+
+ - Open file with external program ({{{kbd(C-c C-x)}}},{{{kbd(C-u)}}} to choose).
+
+ Helm is looking what is used by default to open file
+ externally (mailcap files) but have its own variable
+ ~helm-external-programs-associations~ to store external
+ applications. If you call the action or its binding without
+ prefix arg Helm will see if there is an application suitable in
+ ~helm-external-programs-associations~, otherwise it will look in
+ mailcap files. If you want to specify which external application
+ to use (and its options) use a prefix arg.
+
+ Note: What you configure for Helm in ~helm-external-programs-associations~
+ will take precedence on mailcap files.
+
+ - Preview file with external program ({{{kbd(C-c C-v)}}}).
+
+ Same as above but doesn’t quit Helm session, it is apersistent action.
+
+ - Open file externally with default tool ({{{kbd(C-c X)}}}).
+
+ This uses xdg-open which sucks most of the time, but perhaps it
+ works fine on Windows. This is why it is kept in Helm.
+
+*** Browse images directories with ~helm-follow-mode~ and navigate up/down
+
+ Before Emacs-27 Helm was using image-dired that works with
+ external ImageMagick tools. From Emacs-27 Helm use native
+ display of images with image-mode by default for Emacs-27 (see ~helm-ff-display-image-native~),
+ this allows automatic resize when changing window size, zooming with {{{kbd(M-+)}}} and {{{kbd(M--)}}}
+ and rotate images as before.
+
+ You can also use ~helm-follow-action-forward~ and ~helm-follow-action-backward~ with
+ {{{kbd(C-<down>)}}} and {{{kbd(C-<up>)}}} respectively.
+ Note that these commands have different behavior when ~helm-follow-mode~
+ is enabled (go to next/previous line only).
+
+ Use {{{kbd(C-u C-j)}}} to display an image or kill its buffer.
+
+ *Tip*: Use {{{kbd(C-t)}}} and {{{kbd(C-{)}}} to display Helm window vertically
+ and to enlarge it while viewing images.
+ Note this may not work with exotic Helm windows settings such as the ones in Spacemacs.
+
+*** Copy or Rename files
+
+Note that when recursively copying files, you may have files with same name
+dispatched across different subdirectories, so when copying them in the same
+directory they will get overwritten. To avoid this Helm has a special action
+called =backup files= that has the same behavior as the command line "cp -f
+--backup=numbered": it allows you to copy many files with the same name from
+different subdirectories into one directory. Files with same name are renamed
+as follows: =foo.txt.~1~=. Like with the --force option of cp, it is possible
+to backup files in current directory.
+
+This command is available only when ~dired-async-mode~ is active.
+
+See [[*Use the wildcard to select multiple files][Use the wildcard to select multiple files]]
+
+**** Query replace regexp on filenames
+
+ Replace different parts of a file basename with something else.
+
+ When calling this action you will be prompted twice as with
+ ~query-replace~, first for the matching expression of the text to
+ replace and second for the replacement text. Several facilities,
+ however, are provided to make the two prompts more powerfull.
+
+***** Syntax of the first prompt
+
+ In addition to simple regexps, these shortcuts are available:
+
+ - Basename without extension :: =%.=
+ - Only extension :: =.%=
+ - Substring :: =%:<from>:<to>=
+ - Whole basename :: =%=
+
+***** Syntax of the second prompt
+
+ In addition to a simple string to use as replacement, here is what you can use:
+
+ - A placeholder refering to what you have selected in the first prompt: =\@=.
+
+ After this placeholder you can use a search-and-replace syntax à-la sed:
+
+ : "\@/<regexp>/<replacement>/
+
+ You can select a substring from the string represented by the placeholder:
+
+ : =\@:<from>:<to>=
+
+ - A special character representing a number which is incremented: =\#=.
+
+ - Shortcuts for ~upcase~, ~downcase~ and ~capitalize~
+ are available as=%u=, =%d= and =%c= respectively.
+
+***** Examples
+
+****** Recursively rename all files with =.JPG= extension to =.jpg=
+
+ Use the ~helm-file-globstar~ feature described in [[Use the wildcard to select multiple files][recursive globbing]]
+ by entering =**.JPG= at the end of the Helm-find-files pattern, then hit
+ {{{kbd(M-@)}}} and enter =JPG= on first prompt, then =jpg= on second prompt and hit {{{kbd(RET)}}}.
+
+ Alternatively you can enter =.%= at the first prompt, then =jpg= and hit
+ {{{kbd(RET)}}}. Note that when using this instead of using =JPG= at the first prompt,
+ all extensions will be renamed to =jpg= even if the extension of one of the
+ files is, say, =png=. If you want to keep the original extension you can use
+ =%d= at the second prompt (downcase).
+
+****** Batch-rename files from number 001 to 00x
+
+ Use =\#= inside the second prompt.
+
+ Example 1: To rename the files
+
+ #+begin_example
+ foo.jpg
+ bar.jpg
+ baz.jpg
+ #+end_example
+
+ to
+
+ #+begin_example
+ foo-001.jpg
+ foo-002.jpg
+ foo-003.jpg
+ #+end_example
+
+ use =%.= as matching regexp and =foo-\#= as replacement string.
+
+ Example 2: To rename the files
+
+ #+begin_example
+ foo.jpg
+ bar.jpg
+ baz.jpg
+ #+end_example
+
+ to
+
+ #+begin_example
+ foo-001.jpg
+ bar-002.jpg
+ baz-003.jpg
+ #+end_example
+
+ use as matching regexp =%.= and as replacement string =\@-\#=.
+
+****** Replace a substring
+
+ Use =%:<from>:<to>=.
+
+ Example: To rename files
+
+ #+begin_example
+ foo.jpg
+ bar.jpg
+ baz.jpg
+ #+end_example
+
+ to
+
+ #+begin_example
+ fOo.jpg
+ bAr.jpg
+ bAz.jpg
+ #+end_example
+
+ use as matching regexp =%:1:2= and as replacement string =%u= (upcase).
+
+ Note that you *cannot* use =%.= and =.%= along with substring replacement.
+
+****** Modify the string from the placeholder (\@)
+
+ - By substring, i.e. only using the substring of the placeholder: =\@:<from>:<to>=.
+ The length of placeholder is used for <to> when unspecified.
+
+ Example 1: =\@:0:2= replaces from the beginning to the second char of the placeholder.
+
+ Example 2: \@:2: replaces from the second char of the placeholder to the end.
+
+ - By search-and-replace: =\@/<regexp>/<replacement>/=.
+
+ Incremental replacement is also handled in <replacement>.
+
+ Example 3: =\@/foo/bar/= replaces =foo= by =bar= in the placeholder.
+
+ Example 4: =\@/foo/-\#/= replaces =foo= in the placeholder by 001, 002, etc.
+
+****** Clash in replacements (avoid overwriting files)
+
+ When performing any of these replacement operations you may end up with same
+ names as replacement. In such cases Helm numbers the file that would otherwise
+ overwritten. For instance, should you remove the =-m<n>= part from the files
+ =emacs-m1.txt=, =emacs-m2.txt= and =emacs-m3.txt= you would end up with
+ three files named =emacs.txt=, the second renaming overwriting first file, and
+ the third renaming overwriting second file and so on. Instead Helm will
+ automatically rename the second and third files as =emacs(1).txt= and
+ =emacs(2).txt= respectively.
+
+****** Query-replace on filenames vs. serial-rename action
+
+ Unlike the [[Serial renaming][serial rename]] actions, the files renamed with
+ the query-replace action stay in their initial directory and are not moved to
+ the current directory. As such, using =\#= to serial-rename files only makes
+ sense for files inside the same directory. It even keeps renaming files
+ with an incremental number in the next directories.
+
+**** Serial renaming
+
+ You can use the serial-rename actions to rename, copy or symlink marked files to
+ a specific directory or in the current directory with all the files numbered
+ incrementally.
+
+ - Serial-rename by renaming ::
+ Rename all marked files with incremental numbering to a specific directory.
+
+ - Serial-rename by copying ::
+ Copy all marked files with incremental numbering to a specific directory.
+
+ - Serial-rename by symlinking ::
+ Symlink all marked files with incremental numbering to a specific directory.
+
+**** Defining default target directory for copying, renaming, etc
+
+ You can customize ~helm-dwim-target~ to behave differently depending on the
+ windows open in the current frame. Default is to provide completion on all
+ directories associated to each window.
+
+**** Copying/Renaming from or to remote directories
+
+ Never use ssh tramp method to copy/rename large files, use
+ instead its scp method if you want to avoid out of memory
+ problems and crash Emacs or the whole system. Moreover when using
+ scp method, you will hit a bug when copying more than 3 files at
+ the time.[fn:5]
+ The best way actually is using Rsync to copy files from or to
+ remote, see [[Use Rsync to copy files][Use Rsync to copy files]].
+ Also if you often work on remote you may consider using SSHFS
+ instead of relying on tramp.
+
+**** Copying and renaming asynchronously
+
+ If you have the async library installed (if you got Helm from MELPA you do), you
+ can use it for copying/renaming files by enabling ~dired-async-mode~.
+
+ Note that even when async is enabled, running a copy/rename action with a prefix
+ argument will execute action synchronously. Moreover it will follow the first
+ file of the marked files in its destination directory.
+
+ When ~dired-async-mode~ is enabled, an additional action named "Backup files"
+ will be available. (Such command is not natively available in Emacs).
+ See [[Use the wildcard to select multiple files]] for details.
+
+**** Use Rsync to copy files
+
+ If Rsync is available, you can use it to copy/sync files or directories
+ with some restrictions though:
+
+ - Copying from/to tramp sudo method may not work (permissions).
+
+ - Copying from remote to remote is not supported (rsync restriction)
+ however you can mount a remote with sshfs and copy to it (best), otherwise you have to modify
+ the command line with a prefix arg.[fn:6]
+
+ This command is mostly useful when copying large files as it is
+ fast, asynchronous and provide a progress bar in mode-line. Each
+ rsync process have its own progress bar, so you can run several
+ rsync jobs, they are independents. If rsync fails you can
+ consult the =*helm-rsync<n>*= buffer to see rsync errors. An
+ help-echo (move mouse over progress bar) is provided to see which
+ file is in transfer. Note that when copying directories, no
+ trailing slashes are added to directory names, which mean that
+ directory is created on destination if it doesn’t already exists,
+ see rsync documentation for more infos on rsync behavior. To
+ synchronize a directory, mark all in the directory and rsync all
+ marked to the destination directory or rsync the directory itself
+ to its parent, e.g. =remote:/home/you/music= => =/home/you=.
+
+ The options are configurable through ~helm-rsync-switches~, but
+ you can modify them on the fly when needed by using a prefix arg,
+ in this case you will be prompted for modifications.
+
+ *Note*: When selecting a remote file, if you use the tramp syntax
+ for specifying a port, i.e. host#2222, helm will add
+ automatically =-e ’ssh -p 2222’= to the rsync command line
+ unless you have specified yourself the =-e= option by editing
+ rsync command line with a prefix arg (see above).
+
+*** Touch files
+
+ In the completion buffer, you can choose the default which is the current-time, it is
+ the first candidate or the timestamp of one of the selected files.
+ If you need to use something else, use {{{kbd(M-n)}}} and edit
+ the date in minibuffer.
+ It is also a way to quickly create a new file without opening a buffer, saving it
+ and killing it.
+ To touch more than one new file, separate you filenames with a comma (=,=).
+ If one wants to create (touch) a new file with comma inside the name use a prefix arg,
+ this will prevent splitting the name and create multiple files.
+
+*** Delete files
+
+ You can delete files without quitting helm with
+ {{{kbd(C-c d)}}} or delete files and quit helm with {{{kbd(M-D)}}}.
+
+ In the second method you can choose to
+ make this command asynchronous by customizing
+ ~helm-ff-delete-files-function~.
+
+ *Warning*: When deleting files asynchronously you will NOT be
+ WARNED if directories are not empty, that’s mean non empty directories will
+ be deleted in background without asking.
+
+ A good compromise is to trash your files
+ when using asynchronous method (see [[Trashing files][Trashing files]]).
+
+ When choosing synchronous delete, you can allow recursive
+ deletion of directories with ~helm-ff-allow-recursive-deletes~.
+ Note that when trashing (synchronous) you are not asked for recursive deletion.
+
+ Note that ~helm-ff-allow-recursive-deletes~ have no effect when
+ deleting asynchronously.
+
+ First method (persistent delete) is always synchronous.
+
+ Note that when a prefix arg is given, trashing behavior is inversed.
+ See [[Trashing files][Trashing files]].
+
+**** Trashing files
+
+ If you want to trash your files instead of deleting them you can
+ set ~delete-by-moving-to-trash~ to non nil, like this your files
+ will be moved to trash instead of beeing deleted.
+
+ You can reverse at any time the behavior of ~delete-by-moving-to-trash~ by using
+ a prefix arg with any of the delete files command.
+
+ On GNULinux distributions, when navigating to a Trash directory you
+ can restore any file in ..Trash/files directory with the ’Restore
+ from trash’ action you will find in action menu (needs the
+ trash-cli package installed for remote files, see [[Trashing remote files with tramp][Here]]).
+ You can as well delete files from Trash directories with the ’delete files from trash’
+ action.
+ If you want to know where a file will be restored, hit {{{kbd(M-i)}}}, you will find a trash info.
+
+ *Tip*: Navigate to your Trash/files directories with ~helm-find-files~ and set a bookmark
+ there with {{{kbd(C-x r m)}}} for fast access to Trash.
+
+ *Note*: Restoring files from trash is working only on system using
+ the freedesktop trash specifications.[fn:7]
+
+ *Warning*:
+
+ If you have an =ENV= var =XDG_DATA_HOME= in your .profile or .bash_profile
+ and this var is set to something like =$HOME/.local/share= (like preconized)
+ ~move-file-to-trash~ may try to create =$HOME/.local/share/Trash= (literally)
+ and its subdirs in the directory where you are actually trying to trash files.
+ because ~move-file-to-trash~ is interpreting =XDG_DATA_HOME= literally instead
+ of evaling its value (with ~substitute-in-file-name~).
+
+***** Trashing remote files with tramp
+
+ Trashing remote files (or local files with sudo method) is disabled by default
+ because tramp is requiring the ’trash’ command to be installed, if you want to
+ trash your remote files, customize ~helm-trash-remote-files~.
+ The package on most GNU/Linux based distributions is =trash-cli=[fn:8].
+
+ *Note*:
+ When deleting your files with sudo method, your trashed files will not be listed
+ with trash-list until you log in as root.
+
+*** Checksum file
+
+ Checksum is calculated with the md5sum, sha1sum, sha224sum,
+ sha256sum, sha384sum and sha512sum when available, otherwise the
+ Emacs function ~secure-hash~ is used but it is slow and may crash
+ Emacs and even the whole system as it eats all memory. So if
+ your system doesn’t have the md5 and sha command line tools be
+ careful when checking sum of larges files e.g. isos.
+
+*** Grep files
+
+When using an action that involves an external backend (e.g. grep), using =**=
+is not recommended (even thought it works fine) because it will be slower to
+select all the files. You are better off leaving the backend to do it, it will
+be faster. However, if you know you have not many files it is reasonable to use
+this, also using not recursive wildcard (e.g. =*.el=) is perfectly fine for
+this.
+
+See [[Use the wildcard to select multiple files]] for details.
+
+**** Grep files from ~helm-find-files~
+
+ You can grep individual files from ~helm-find-files~ by using
+ {{{kbd(C-s)}}}. This same command can also
+ recursively grep files from the current directory when called with a prefix
+ argument. In this case you will be prompted for the file extensions to use
+ (grep backend) or the types of files to use (ack-grep backend). See the
+ ~helm-grep-default-command~ documentation to set this up. For compressed files
+ or archives, use zgrep with {{{kbd(M-g z)}}}.
+
+ Otherwise you can use recursive commands like {{{kbd(M-g a)}}} or {{{kbd(M-g g)}}}
+ that are much faster than using {{{kbd(C-s)}}} with a prefix argument.
+ See ~helm-grep-ag-command~ and ~helm-grep-git-grep-command~ to set this up.
+
+ You can also use =id-utils=’ GID with {{{kbd(M-g i)}}}
+ by creating an ID index file with the =mkid= shell command.
+
+ All those grep commands use the symbol at point as the default pattern.
+ Note that default is different from input (nothing is added to the prompt until
+ you hit {{{kbd(M-n)}}}).
+
+***** Grepping on remote files
+
+ On remote files grep is not well supported by TRAMP unless you suspend updates before
+ entering the pattern and re-enable it once your pattern is ready.
+ To toggle suspend-update, use {{{kbd(C-!)}}}.
+
+**** Recursive search from Helm-find-files
+
+***** You can use helm-browse-project (see binding below)
+
+ - {{{kbd(M-x helm-browse-project)}}} ::
+ If the current directory is under version control with either git or hg and
+ helm-ls-git[fn:9] and/or helm-ls-hg[fn:10] are installed, it lists all the files under
+ version control. Otherwise it falls back to Helm-find-files.
+
+ - {{{kbd(C-u M-x helm-browse-project)}}} ::
+ List all the files under this directory and other subdirectories
+ (recursion) and this list of files will be cached.
+
+ - {{{kbd(C-u C-u M-x helm-browse-project)}}} ::
+ Same but the cache is refreshed.
+
+***** You can start a recursive search with =locate=, =find= or =Fd=[fn:11]
+
+ See "Note" in the [[Recursive completion on subdirectories][section on subdirectories]].
+
+ Using =locate=, you can enable the local database with a prefix argument. If the
+ local database doesn’t already exists, you will be prompted for its creation.
+ If it exists and you want to refresh it, give it two prefix args.
+
+ When using locate the Helm buffer remains empty until you type something.
+ Regardless Helm uses the basename of the pattern entered in the helm-find-files
+ session by default. Hitting {{{kbd(M-n)}}} should just kick in the
+ locate search with this pattern. If you want Helm to automatically do this, add
+ ~helm-source-locate~ to ~helm-sources-using-default-as-input~.
+
+ *Note*: On Windows use Everything with its command line ~es~ as a replacement of locate.[fn:12]
+
+***** Recursive completion on subdirectories
+
+ Starting from the directory you are currently browsing, it is possible to have
+ completion of all directories underneath. Say you are at =/home/you/foo/= and
+ you want to go to =/home/you/foo/bar/baz/somewhere/else=, simply type
+ =/home/you/foo/..else= and hit {{{kbd(C-j)}}} or enter
+ the final =/=. Helm will then list all possible directories under =foo=
+ matching =else=.
+
+ *Note*: Completion on subdirectories uses =locate= as backend, you can configure
+ the command with ~helm-locate-recursive-dirs-command~. Because this completion
+ uses an index, the directory tree displayed may be out-of-date and not reflect
+ the latest change until you update the index (using =updatedb= for =locate=).
+
+ If for some reason you cannot use an index, the =find= command from
+ =findutils= can be used instead. It will be slower though. You need to pass
+ the basedir as first argument of =find= and the subdir as the value for
+ ’-(i)regex’ or ’-(i)name’ with the two format specs that are mandatory in
+ ~helm-locate-recursive-dirs-command~.
+
+ Examples:
+
+ : find %s -type d -name ’*%s*’
+ : find %s -type d -regex .*%s.*$
+
+ =Fd=[fn:11] command is now also
+ supported which is regexp based and very fast. Here is the command
+ line to use:
+
+ : fd --hidden --type d .*%s.*$ %s
+
+ You can use also a glob based search, in this case use the --glob option:
+
+ : fd --hidden --type d --glob ’*%s*’ %s
+
+*** Execute Eshell commands on files
+
+Setting up aliases in Eshell allows you to set up powerful customized commands.
+
+Your aliases for using eshell command on file should allow
+specifying one or more files, use e.g. =alias foo $1= or
+=alias foo $*=, if you want your command to be asynchronous add
+at end =&=, e.g. =alias foo $* &=.
+
+Adding Eshell aliases to your ~eshell-aliases-file~ or using the
+=alias= command from Eshell allows you to create personalized
+commands not available in ~helm-find-files~ actions and use them
+from {{{kbd(M-!)}}}.
+
+Example: You want a command to uncompress some =*.tar.gz= files from ~helm-find-files~:
+
+1) Create an Eshell alias named, say, =untargz= with the command
+=alias untargz tar zxvf $*=.
+
+2) Now from ~helm-find-files~ select the =*.tar.gz= file (you can also
+mark files if needed) and hit {{{kbd(M-!)}}}.
+
+*Note*: When using marked files with this, the meaning of the prefix argument is
+quite subtle. Say you have =foo=, =bar= and =baz= marked; when you run
+the alias command ‘example’ on these files with no prefix argument it will run
+‘example’ sequentially on each file:
+
+: $ example foo
+: $ example bar
+: $ example baz
+
+With a prefix argument however it will apply ‘example’ on all files at once:
+
+: $ example foo bar baz
+
+Of course the alias command should support this.
+
+If you add %s to the command line %s will be replaced with the candidate, this mean you can
+add extra argument to your command e.g. command -extra-arg %s or command %s -extra-arg.
+If you want to pass many files inside %s, don’t forget to use a prefix arg.
+
+You can also use special placeholders in extra-args,
+see the specific info page once you hit {{{kbd(M-!)}}}.
+
+*** Attach files to a mail buffer (message-mode)
+
+If you are in a ~message-mode~ or ~mail-mode~ buffer, that action will appear
+in action menu, otherwise it is available at any time with {{{kbd(C-c C-a)}}}.
+It behaves as follows:
+
+- If you are in a (mail or message) buffer, files are attached there.
+
+- If you are not in a mail buffer but one or more mail buffers exist, you are
+ prompted to attach files to one of these mail buffers.
+
+- If you are not in a mail buffer and no mail buffer exists,
+ a new mail buffer is created with the attached files in it.
+
+** Working on Remote files with TRAMP
+
+*** Tramp archive support (emacs-27+ only)
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+If your emacs have library tramp-archive.el, you can browse the
+content of archives with emacs and BTW helm-find-files. However this beeing
+experimental and not very fast, helm doesn’t provide an automatic
+expansion and detection of archives, you will have to add the final =/=
+manually and may have to force update ({{{kbd(C-c C-u)}}})
+or remove and add again the final =/= until tramp finish decompressing archive.
+
+*** Using TRAMP with ~helm-find-files~ to read remote directories
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+~helm-find-files~ works fine with TRAMP despite some limitations.
+
+- Grepping files is not very well supported when used incrementally.
+ See [[Grepping on remote files]].
+
+- Locate does not work on remote directories.
+
+**** A TRAMP syntax crash course
+
+Please refer to TRAMP’s documentation for more details.
+
+- Connect to host 192.168.0.4 as user =foo=:
+
+ : /scp:192.168.0.4@foo:
+
+- Connect to host 192.168.0.4 as user =foo= on port 2222:
+
+ : /scp:192.168.0.4@foo#2222:
+
+- Connect to host 192.168.0.4 as root using multihops syntax:
+
+ : /ssh:192.168.0.4@foo|sudo:192.168.0.4:
+
+*Note*: You can also use ~tramp-default-proxies-alist~ when connecting often to
+the same hosts.
+
+As a rule of thumb, prefer the scp method unless using multihops (which only
+works with the ssh method), especially when copying large files.
+
+You need to hit {{{kbd(C-j)}}} once on top of a directory on the first connection
+to complete the pattern in the minibuffer.
+
+**** Display color for directories, symlinks etc... with tramp
+
+Starting at helm version 2.9.7 it is somewhat possible to
+colorize fnames by listing files without loosing performances with
+external commands (ls and awk) if your system is compatible.
+For this you can use ~helm-list-dir-external~ as value
+for ~helm-list-directory-function~.
+
+See ~helm-list-directory-function~ documentation for more infos.
+
+**** Completing host
+
+As soon as you enter the first =:= after method e.g =/scp:= you will
+have some completion about previously used hosts or from your =~/.ssh/config=
+file, hitting {{{kbd(C-j)}}} or {{{kbd(right)}}} on a candidate will insert this host in minibuffer
+without addind the ending =:=, second hit insert the last =:=.
+As soon the last =:= is entered TRAMP will kick in and you should see the list
+of candidates soon after.
+
+When connection fails, be sure to delete your TRAMP connection with
+ {{{kbd(M-x helm-delete-tramp-connection
+)}}} before retrying.
+
+**** Editing local files as root
+
+Use the sudo method:
+
+: /sudo:host:
+
+or
+
+: simply /sudo::.
+
+** Misc. Remarks
+
+*** Find file at point
+
+Helm uses ~ffap~ partially or completely to find file at point depending on the
+value of ~helm-ff-guess-ffap-filenames~: if non-nil, support is complete
+(annoying), if nil, support is partial.
+
+Note that when the variable
+~helm-ff-allow-non-existing-file-at-point~ is non nil Helm will
+insert the filename at point even if file with this name doesn’t
+exists. If non existing file at point ends with numbers prefixed
+with =:= the =:= and numbers are stripped.
+
+**** Find file at line number
+
+When text at point is in the form of
+
+ : ~/elisp/helm/helm.el:1234
+
+Helm finds this file at the indicated line number, here 1234.
+
+**** Find URL at point
+
+When a URL is found at point, Helm expands to that URL only.
+Pressing {{{kbd(RET)}}} opens that URL using ~browse-url-browser-function~.
+
+**** Find e-mail address at point
+
+When an e-mail address is found at point, Helm expands to this e-mail address
+prefixed with =mailto:=. Pressing {{{kbd(RET)}}} opens a message buffer with that
+e-mail address.
+
+*** Insert filename at point or complete filename at point
+
+On insertion (not on completion, i.e. there is nothing at point):
+
+- {{{kbd(C-c i)}}} :: insert absolute file name.
+- {{{kbd(C-u C-c i)}}} :: insert abbreviated file name.
+- {{{kbd(C-u C-u C-c i)}}} :: insert relative file name.
+- {{{kbd(C-u C-u C-u C-c i)}}} :: insert basename.
+
+On completion:
+
+- Target starts with =~/= :: insert abbreviate file name.
+- target starts with =/= or =[a-z]:/= :: insert full path.
+- Otherwise :: insert relative file name.
+
+*** Edit marked files in a dired buffer
+
+You can open a dired buffer containing only marked files with {{{kbd(C-x C-q)}}}.
+With a prefix argument you can open this same dired buffer in wdired mode for
+editing. Note that wildcards are supported as well, so you can use e.g.
+=*.txt= to select all =.txt= files in the current directory or =**.txt= to
+select all files recursively from the current directory.
+See [[Use the wildcard to select multiple files]] section above.
+
+*** Bookmark the ~helm-find-files~ session
+
+You can bookmark the ~helm-find-files~ session with {{{kbd(C-x r m)}}}.
+You can later retrieve these bookmarks by calling ~helm-filtered-bookmarks~
+or, from the current ~helm-find-files~ session, by hitting {{{kbd(C-x r b)}}}.
+
+*** Ignored or boring files
+
+Helm-find-files can ignore files matching
+~helm-boring-file-regexp-list~ or files that are git ignored, you
+can set this with ~helm-ff-skip-boring-files~ or
+~helm-ff-skip-git-ignored-files~.
+
+*Note*: This will slow down helm, be warned.
+
+*** Helm-find-files is using a cache
+
+Helm is caching each directory files list in a hash table for
+faster search, when a directory is modified it is removed from cache
+so that further visit in this directory refresh cache.
+You may have in some rare cases to refresh directory manually with {{{kbd(C-c C-u)}}}
+for example when helm-find-files session is running and a file is modified/deleted
+in current visited directory by an external command from outside Emacs.
+
+** Commands
+
+| Keys | Description |
+|---------+---------------------------------------------------------------------------------------------|
+| C-x C-f | Run ‘locate’ (‘C-u’ to specify locate database, ‘M-n’ to insert basename of candidate). |
+| C-x C-d | Browse project (‘C-u’ to recurse, ‘C-u C-u’ to recurse and refresh database). |
+| C-c / | Run ‘find’ shell command from this directory. |
+| C-s | Run Grep (‘C-u’ to recurse). |
+| M-g p | Run Pdfgrep on marked files. |
+| M-g z | Run zgrep (‘C-u’ to recurse). |
+| M-g a | Run AG grep on current directory. |
+| M-g g | Run git-grep on current directory. |
+| M-g i | Run gid (id-utils). |
+| M-. | Run Etags (‘C-u’ to use thing-at-point, ‘C-u C-u’ to reload cache). |
+| M-R | Rename Files (‘C-u’ to follow). |
+| M-@ | Query replace on marked files. |
+| M-C | Copy Files (‘C-u’ to follow). |
+| M-V | Rsync Files (‘C-u’ to edit command). |
+| M-B | Byte Compile Files (‘C-u’ to load). |
+| M-L | Load Files. |
+| M-S | Symlink Files. |
+| M-H | Hardlink files. |
+| M-Y | Relative symlink Files. |
+| M-D | Delete Files. |
+| M-T | Touch files. |
+| M-K | Kill buffer candidate without leaving Helm. |
+| C-c d | Delete file without leaving Helm. |
+| M-e | Switch to prefered shell. |
+| M-! | Eshell command on file (‘C-u’ to apply on marked files, otherwise treat them sequentially). |
+| C-c = | Ediff file. |
+| M-= | Ediff merge file. |
+| C-c i | Complete file name at point. |
+| C-c o | Switch to other window. |
+| C-c C-o | Switch to other frame. |
+| C-c C-x | Open file with external program (‘C-u’ to choose). |
+| C-c C-v | Preview file with external program. |
+| C-c X | Open file externally with default tool. |
+| M-l | Rotate image left. |
+| M-r | Rotate image right. |
+| M-+ | Zoom in image. |
+| M-- | Zoom out image. |
+| C-l | Go to parent directory. |
+| M-p | Switch to the visited-directory history. |
+| C-c h | Switch to file name history. |
+| M-i | Show file properties in a tooltip. |
+| M-a | Mark all visible candidates. |
+| C-c DEL | Toggle auto-expansion of directories. |
+| M-U | Unmark all candidates, visible and invisible ones. |
+| C-c C-a | Attach files to message buffer. |
+| C-c p | Print file, (‘C-u’ to refresh printer list). |
+| C-{ | Enlarge Helm window. |
+| C-} | Narrow Helm window. |
+| C-] | Toggle basename/fullpath. |
+| C-c r | Find file as root. |
+| C-x C-v | Find alternate file. |
+| C-c @ | Insert org link. |
+| C-x r m | Set bookmark to current directory. |
+| C-x r b | Jump to bookmark list. |
+| S-<f1> | Sort alphabetically |
+| S-<f2> | Sort by newest |
+| S-<f3> | Sort by size |
+| S-<f4> | Show only directories |
+| S-<f5> | Show only files |
+
+* Helm ‘generic’ read file name completion
+
+This is ‘generic’ read file name completion that have been =helmized=
+because you have enabled [[Helm mode][helm-mode]].
+Don’t confuse this with ~helm-find-files~ which is a native helm command,
+see [[Helm functions vs helmized Emacs functions]].
+
+** Tips
+
+*** Navigation
+
+**** Enter =~/= at end of pattern to quickly reach home directory
+
+**** Enter =/= at end of pattern to quickly reach the file system root
+
+**** Enter =./= at end of pattern to quickly reach ~default-directory~
+
+(As per its value at the beginning of the session.)
+
+If you already are in the ~default-directory~ this will move the cursor to the top.
+
+**** Enter =../= at end of pattern will reach upper directory, moving cursor on top
+
+This is different from using {{{kbd(M-x helm-find-files-up-one-level)}}} in that it moves
+the cursor to the top instead of remaining on the previous subdir name.
+
+**** You can complete with partial basename
+
+It starts from the third character of the pattern.
+
+For instance =fob= or =fbr= will complete =foobar= but =fb= needs a
+third character in order to complete it.
+
+*** Persistent actions
+
+By default ~helm-read-file-name~ uses the persistent actions of ~helm-find-files~.
+
+**** Use {{{kbd(C-u C-j)}}} to display an image
+
+**** {{{kbd(C-j)}}} on a filename will expand to this filename in Helm-buffer
+
+Second hit displays the buffer filename.
+Third hit kills the buffer filename.
+
+*Note*: {{{kbd(C-u C-j)}}} displays the buffer directly.
+
+**** Browse images directories with ~helm-follow-mode~ and navigate up/down
+
+*** Delete characters backward
+
+When you want to delete characters backward, e.g. to create a new file or directory,
+auto-update may come in the way when it keeps updating to an existent directory.
+In that case, type {{{kbd(C-<backspace>)}}} and then ‘<backspace>’.
+This should not be needed when copying/renaming files because autoupdate is disabled
+by default in that case.
+
+*Note*: On a terminal, the default binding {{{kbd(C-<backspace>)}}} may not work.
+In this case use {{{kbd(C-c <backspace>)}}}.
+
+*** Create new directories and files
+
+**** You can create a new directory and a new file at the same time
+
+Simply write the path in prompt and press {{{kbd(RET)}}}, e.g.
+=~/new/newnew/newnewnew/my_newfile.txt=.
+
+**** To create a new directory, append a =/= at to the new name and press {{{kbd(RET)}}}
+
+**** To create a new file, enter a filename not ending with =/=
+
+File and directory creation works only with some commands (e.g. ~find-file~)
+and it will not work with others where it is not intended to return a file or
+a directory (e.g ~list-directory~).
+
+*** Exiting minibuffer with empty string
+
+You can exit minibuffer with empty string with
+Uses keymap ~helm-read-file--map~, which is not currently defined.
+{{{kbd(M-x helm-cr-empty-string)}}}.
+It is useful when some commands are prompting continuously until you enter an empty prompt.
+
+** Commands
+
+| Keys | Description |
+|---------+-----------------------------------------------------|
+| C-l | Go to parent directory. |
+| C-c DEL | Toggle auto-expansion of directories. |
+| C-] | Toggle basename. |
+| C-c h | File name history. |
+| C/M-RET | Return empty string unless ‘must-match’ is non-nil. |
+| C-o | Go to next source. |
+| M-o | Go to previous source. |
+
+* Helm Generic files
+
+** Tips
+
+*** Locate
+
+You can append to the search pattern any of the locate command line options,
+e.g. =-b=, =-e=, =-n <number>=, etc. See the locate(1) man page for more details.
+
+Some other sources (at the moment =recentf= and =file in current directory=)
+support the =-b= flag for compatibility with locate when they are used with it.
+
+When you enable fuzzy matching on locate with ~helm-locate-fuzzy-match~, the
+search will be performed on basename only for efficiency (so don’t add =-b= at
+prompt). As soon as you separate the patterns with spaces, fuzzy matching will
+be disabled and search will be done on the full filename. Note that in
+multi-match, fuzzy is completely disabled, which means that each pattern is a
+match regexp (i.e. =helm= will match =helm= but =hlm= will *not* match
+=helm=).
+
+*Note*: On Windows use Everything with its command line ~es~ as a replacement of locate.[fn:13]
+
+*** Browse project
+
+When the current directory is not under version control, don’t forget to refresh
+the cache when files have been added/removed in the directory.
+
+*** Find command
+
+Recursively search files using the =find= shell command.
+
+Candidates are all filenames that match all given globbing patterns. This
+respects the options ~helm-case-fold-search~ and
+~helm-findutils-search-full-path~.
+
+You can pass arbitrary =find= options directly after a =*= separator.
+For example, this would find all files matching =book= that are larger
+than 1 megabyte:
+
+ : book * -size +1M
+
+** Commands
+
+| Keys | Description |
+|---------+----------------------------------------------------|
+| C-] | Toggle basename. |
+| C-s | Run grep (‘C-u’ to recurse). |
+| M-g z | Run zgrep. |
+| M-g p | Run PDFgrep on marked files. |
+| M-C | Copy file(s) |
+| M-R | Rename file(s). |
+| M-S | Symlink file(s). |
+| M-H | Hardlink file(s). |
+| M-D | Delete file(s). |
+| M-B | Byte compile Elisp file(s) (‘C-u’ to load). |
+| M-L | Load Elisp file(s). |
+| C-= | Ediff file. |
+| C-c = | Ediff-merge file. |
+| C-c o | Switch to other window. |
+| M-i | Show file properties. |
+| C-c C-x | Open file with external program (‘C-u’ to choose). |
+| C-c X | Open file externally with default tool. |
+| C-c @ | Insert org link. |
+
+* Helm fd
+
+** Tips
+
+The Fd[fn:11] command line tool is very fast to search files
+recursively. You may have to wait several seconds at first usage when
+your hard drive cache is =cold=, then once the cache is initialized
+searchs are very fast. You can pass any Fd options[fn:14] before
+pattern, e.g. =-e py foo=.
+
+The Fd command line can be customized with ~helm-fd-switches~ user
+variable. Always use =--color always= as option otherwise you will
+have no colors. To customize colors see Fd colorized[fn:15].
+
+*Note*:
+Starting from fd version 8.2.1, you have to provide the env var
+LS_COLORS to Emacs to have a colorized output, the easiest way is
+to add to your =~/.profile= file =eval $(dircolors)=.
+Another way is using =setenv= in your init file.
+This is not needed when running Emacs from a terminal either with =emacs -nw=
+or =emacs= because emacs inherit the env vars of this terminal.[fn:16]
+
+Search is (pcre) regexp based[fn:17], and multi patterns are _not_ supported.
+
+** COMMENT Man page
+
+NAME
+ fd - find entries in the filesystem
+
+SYNOPSIS
+ fd [-HIEsiaLp0hV] [-d depth] [-t filetype] [-e ext] [-E exclude] [-c
+ when] [-j num] [-x cmd] [pattern] [path...]
+
+DESCRIPTION
+ fd is a simple, fast and user-friendly alternative to find(1).
+
+OPTIONS
+ -H, --hidden
+ Include hidden files and directories in the search results
+ (default: hidden files and directories are skipped).
+
+ -I, --no-ignore
+ Show search results from files and directories that would other‐
+ wise be ignored by .gitignore, .ignore, .fdignore, or the global
+ ignore file.
+
+ -u, --unrestricted
+ Alias for ’--no-ignore’. Can be repeated; ’-uu’ is an alias for
+ ’--no-ignore --hidden’.
+
+ --no-ignore-vcs
+ Show search results from files and directories that would other‐
+ wise be ignored by .gitignore files.
+
+ -s, --case-sensitive
+ Perform a case-sensitive search. By default, fd uses case-insen‐
+ sitive searches, unless the pattern contains an uppercase char‐
+ acter (smart case).
+
+ -i, --ignore-case
+ Perform a case-insensitive search. By default, fd uses case-
+ insensitive searches, unless the pattern contains an uppercase
+ character (smart case).
+
+ -g, --glob
+ Perform a glob-based search instead of a regular expression
+ search.
+
+ --regex
+ Perform a regular-expression based seach (default). This can be
+ used to override --glob.
+
+ -F, --fixed-strings
+ Treat the pattern as a literal string instead of a regular
+ expression.
+
+ -a, --absolute-path
+ Shows the full path starting from the root as opposed to rela‐
+ tive paths.
+
+ -l, --list-details
+ Use a detailed listing format like ’ls -l’. This is basically an
+ alias for ’--exec-batch ls -l’ with some additional ’ls’
+ options. This can be used to see more metadata, to show symlink
+ targets and to achieve a deterministic sort order.
+
+ -L, --follow
+ By default, fd does not descend into symlinked directories.
+ Using this flag, symbolic links are also traversed.
+
+ -p, --full-path
+ By default, the search pattern is only matched against the file‐
+ name (or directory name). Using this flag, the pattern is
+ matched against the full path.
+
+ -0, --print0
+ Separate search results by the null character (instead of new‐
+ lines). Useful for piping results to xargs.
+
+ --max-results count
+ Limit the number of search results to ’count’ and quit immedi‐
+ ately.
+
+ -1 Limit the search to a single result and quit immediately. This
+ is an alias for ’--max-results=1’.
+
+ --show-errors
+ Enable the display of filesystem errors for situations such as
+ insufficient permissions or dead symlinks.
+
+ --one-file-system, --mount, --xdev
+ By default, fd will traverse the file system tree as far as
+ other options dictate. With this flag, fd ensures that it does
+ not descend into a different file system than the one it started
+ in. Comparable to the -mount or -xdev filters of find(1).
+
+ -h, --help
+ Print help information.
+
+ -V, --version
+ Print version information.
+
+ -d, --max-depth d
+ Limit directory traversal to at most d levels of depth. By
+ default, there is no limit on the search depth.
+
+ --min-depth d
+ Only show search results starting at the given depth. See also:
+ ’--max-depth’ and ’--exact-depth’.
+
+ --exact-depth d
+ Only show search results at the exact given depth. This is an
+ alias for ’--min-depth <depth> --max-depth <depth>’.
+
+ -t, --type filetype
+ Filter search by type:
+
+ f, file
+ regular files
+
+ d, directory
+ directories
+
+ l, symlink
+ symbolic links
+
+ x, executable
+ executable (files)
+
+ e, empty
+ empty files or directories
+
+ s, socket
+ sockets
+
+ p, pipe
+ named pipes (FIFOs)
+
+ This option can be used repeatedly to allow for multiple file
+ types.
+
+ -e, --extension ext
+ Filter search results by file extension ext. This option can be
+ used repeatedly to allow for multiple possible file extensions.
+
+ -E, --exclude pattern
+ Exclude files/directories that match the given glob pattern.
+ This overrides any other ignore logic. Multiple exclude pat‐
+ terns can be specified.
+
+ --ignore-file path
+ Add a custom ignore-file in ’.gitignore’ format. These files
+ have a low precedence.
+
+ -c, --color when
+ Declare when to colorize search results:
+
+ auto Colorize output when standard output is connected to terminal (default).
+
+ never Do not colorize output.
+
+ always Always colorize output.
+
+ -j, --threads num
+ Set number of threads to use for searching & executing (default:
+ number of available CPU cores).
+
+ -S, --size size
+ Limit results based on the size of files using the format
+ <+-><NUM><UNIT>
+
+ ’+’ file size must be greater than or equal to this
+
+ ’-’ file size must be less than or equal to this
+
+ ’NUM’ The numeric size (e.g. 500)
+
+ ’UNIT’ The units for NUM. They are not case-sensitive. Allowed
+ unit values:
+
+ ’b’ bytes
+
+ ’k’ kilobytes (base ten, 10^3 = 1000 bytes)
+
+ ’m’ megabytes
+
+ ’g’ gigabytes
+
+ ’t’ terabytes
+
+ ’ki’ kibibytes (base two, 2^10 = 1024 bytes)
+
+ ’mi’ mebibytes
+
+ ’gi’ gibibytes
+
+ ’ti’ tebibytes
+
+ --changed-within date|duration
+ Filter results based on the file modification time. The argument
+ can be provided as a specific point in time (YYYY-MM-DD
+ HH:MM:SS) or as a duration (10h, 1d, 35min). --change-newer-
+ than can be used as an alias.
+
+ Examples:
+ --changed-within 2weeks
+ --change-newer-than "2018-10-27 10:00:00"
+
+ --changed-before date|duration
+ Filter results based on the file modification time. The argument
+ can be provided as a specific point in time (YYYY-MM-DD
+ HH:MM:SS) or as a duration (10h, 1d, 35min). --change-older-
+ than can be used as an alias.
+
+ Examples:
+ --changed-before "2018-10-27 10:00:00"
+ --change-older-than 2weeks
+
+ -o, --owner [user][:group]
+ Filter files by their user and/or group. Format:
+ [(user|uid)][:(group|gid)]. Either side is optional. Precede
+ either side with a ’!’ to exclude files instead.
+
+ Examples:
+ --owner john
+ --owner :students
+ --owner "!john:students"
+
+ -x, --exec command
+ Execute command for each search result. The following placehold‐
+ ers are substituted by a path derived from the current search
+ result:
+
+ {} path
+
+ {/} basename
+
+ {//} parent directory
+
+ {.} path without file extension
+
+ {/.} basename without file extension
+
+ -X, --exec-batch command
+ Execute command with all search results at once. A single
+ occurence of the following placeholders is authorized and
+ sub stituted by the paths derived from the search results before the
+ command is executed:
+
+ {} path
+
+ {/} basename
+
+ {//} parent directory
+
+ {.} path without file extension
+
+ {/.} basename without file extension
+
+** Commands
+
+Uses keymap ~helm-fd-map~, which is not currently defined.
+
+| Keys | Description |
+|---------------------------------------------+----------------------------------------------------|
+| M-x helm-ff-run-grep | Run grep (‘C-u’ to recurse). |
+| M-x helm-ff-run-zgrep | Run zgrep. |
+| M-x helm-ff-run-pdfgrep | Run PDFgrep on marked files. |
+| M-x helm-ff-run-copy-file | Copy file(s) |
+| M-x helm-ff-run-rename-file | Rename file(s). |
+| M-x helm-ff-run-symlink-file | Symlink file(s). |
+| M-x helm-ff-run-hardlink-file | Hardlink file(s). |
+| M-x helm-ff-run-delete-file | Delete file(s). |
+| M-x helm-ff-run-byte-compile-file | Byte compile Elisp file(s) (‘C-u’ to load). |
+| M-x helm-ff-run-load-file | Load Elisp file(s). |
+| M-x helm-ff-run-ediff-file | Ediff file. |
+| M-x helm-ff-run-ediff-merge-file | Ediff-merge file. |
+| M-x helm-ff-run-switch-other-window | Switch to other window. |
+| M-x helm-ff-properties-persistent | Show file properties. |
+| M-x helm-ff-run-open-file-externally | Open file with external program (‘C-u’ to choose). |
+| M-x helm-ff-run-open-file-with-default-tool | Open file externally with default tool. |
+| M-x helm-ff-run-insert-org-link | Insert org link. |
+| M-x helm-fd-previous-directory | Move to previous directory. |
+| M-x helm-fd-next-directory | Move to next directory. |
+
+* Helm Grep
+
+** Tips
+
+With Helm supporting Git-grep and AG/RG, you are better off using
+one of them for recursive searches, keeping grep or ack-grep to
+grep individual or marked files. See [[Helm AG][Helm AG]].
+
+*** Meaning of the prefix argument
+
+**** With grep or ack-grep
+
+Grep recursively, in this case you are
+prompted for types (ack-grep) or for wild cards (grep).
+
+**** With AG or RG
+
+the prefix arg allows you to specify a type of file to search in.
+
+*** You can use wild cards when selecting files (e.g. =*.el=)
+
+Note that a way to grep specific files recursively is to use
+e.g. =**.el= to select files, the variable ~helm-file-globstar~
+controls this (it is non nil by default), however it is much
+slower than using grep recusively (see helm-find-files
+documentation about this feature).
+
+*** Grep hidden files
+
+You may want to customize your command line for grepping hidden
+files, for AG/RG use =--hidden=, see man page
+of your backend for more infos.
+
+*** You can grep in different directories by marking files or using wild cards
+
+*** You can save the result in a ~helm-grep-mode~ buffer
+
+See [[Commands][commands]] below.
+
+Once in that buffer you can use =emacs-wgrep=[fn:18] to edit your
+changes, for Helm the package name is =wgrep-helm=, it is hightly
+recommended.
+
+*** Helm-grep supports multi-matching
+
+(Starting from version 1.9.4.)
+
+Simply add a space between each pattern as for most Helm commands.
+
+*Note*: Depending the regexp you use it may match as well the
+filename, this because we pipe the first grep command which send
+the filename in output.
+
+*** See full path of selected candidate
+
+Add (helm-popup-tip-mode 1) in your init file or enable it
+interactively with {{{kbd(M-x helm-popup-tip-mode,)}}} however it is
+generally enough to just put your mouse cursor over candidate.
+
+*** Open file in other window
+
+The command {{{kbd(C-c o)}}} allow you to open file
+in other window horizontally or vertically if a prefix arg is supplied.
+
+*** Performance over TRAMP
+
+Grepping works but it is badly supported as TRAMP doesn’t support multiple
+processes running in a short delay (less than 5s) among other things.
+
+Helm uses a special hook to suspend the process automatically while you are
+typing. Even if Helm handles this automatically by delaying each process by 5s,
+you are adviced to this manually by hitting {{{kbd(C-!)}}} (suspend process) before
+typing, and hit again {{{kbd(C-!)}}} when the regexp is ready to send to the remote
+process. For simple regexps, there should be no need for this.
+
+Another solution is to not use TRAMP at all and mount your remote file system via
+SSHFS.
+
+* Helm GID
+
+Still supported, but mostly deprecated, using AG/RG or Git-grep
+is much more efficient, also =id-utils= seems no more maintained.
+
+** Tips
+
+Helm-GID reads the database created with the =mkid= command from id-utils.
+The name of the database file can be customized with ~helm-gid-db-file-name~, it
+is usually =ID=.
+
+Helm-GID use the symbol at point as default-input. This command is also
+accessible from ~helm-find-files~ which allow you to navigate to another
+directory to consult its database.
+
+*Note*: Helm-GID supports multi-matches but only the last pattern entered will be
+highlighted since there is no ~--color~-like option in GID itself.
+
+* Helm AG
+
+** Tips
+
+Helm-AG is different from grep or ack-grep in that it works on a
+directory recursively and not on a list of files. It is called
+helm-AG but it support several backend, namely AG, RG and PT.
+Nowaday the best backend is Ripgrep aka RG, it is the fastest and
+is actively maintained, see ~helm-grep-ag-command~ and
+~helm-grep-ag-pipe-cmd-switches~ to configure it.
+
+You can ignore files and directories with a =.agignore= file, local to a
+directory or global when placed in the home directory. (See the AG man page for
+more details.) That file follows the same syntax as ~helm-grep-ignored-files~
+and ~helm-grep-ignored-directories~.
+
+As always you can access Helm AG from ~helm-find-files~.
+
+Starting with version 0.30, AG accepts one or more TYPE arguments on its command
+line. Helm provides completion on these TYPE arguments when available with your
+AG version. Use a prefix argument when starting a Helm-AG session to enable this
+completion. See RG and AG man pages on how to add new types.
+
+*Note*: You can mark several types to match in the AG query. The first AG
+versions providing this feature allowed only one type, so in this case only the
+last mark will be used.
+
+* Helm git-grep
+
+Helm-git-grep searches the current directory, i.e. the default directory or the
+directory in Helm-find-files. If this current directory is a subdirectory of a
+project and you want to also match parent directories (i.e the whole project),
+use a prefix argument.
+
+** Commands
+
+| Keys | Description |
+|-----------------------------+--------------------------------------------|
+| M-<down> | Next File. |
+| M-<up> | Previous File. |
+| M-x helm-yank-text-at-point | Yank text at point in minibuffer. |
+| C-c o | Jump to other window. |
+| C-c C-o | Jump to other frame. |
+| <left> | Run default action (same as ‘RET’). |
+| C-x C-s | Save to a ‘helm-grep-mode’ enabled buffer. |
+
+* Helm PDFgrep Map
+
+** Commands
+
+| Keys | Description |
+|-----------------------------+-----------------------------------|
+| M-<down> | Next file. |
+| M-<up> | Previous file. |
+| M-x helm-yank-text-at-point | Yank text at point in minibuffer. |
+
+* Helm Etags Map
+
+** Commands
+
+| Keys | Description |
+|-----------------------------+-----------------------------------|
+| M-<down> | Next file. |
+| M-<up> | Previous file. |
+| M-x helm-yank-text-at-point | Yank text at point in minibuffer. |
+
+* Helm UCS
+
+** Tips
+
+Use commands below to insert unicode characters in current buffer without
+leaving Helm.
+
+** Commands
+
+Uses keymap ~helm-ucs-map~, which is not currently defined.
+
+| Keys | Description |
+|--------------------------------------+----------------------------|
+| M-x helm-ucs-persistent-insert | Insert character. |
+| M-x helm-ucs-persistent-forward | Forward character. |
+| M-x helm-ucs-persistent-backward | Backward character. |
+| M-x helm-ucs-persistent-delete | Delete character backward. |
+| M-x helm-ucs-persistent-insert-space | Insert space. |
+
+* Helm bookmark name
+
+** Commands
+
+Uses keymap ~helm-bookmark-map~, which is not currently defined.
+
+| Keys | Description |
+|-----------------------------------------+--------------------------------------|
+| M-x helm-bookmark-run-jump-other-window | Jump other window. |
+| M-x helm-bookmark-run-delete | Delete bookmark. |
+| M-x helm-bookmark-run-edit | Edit bookmark. |
+| M-x helm-bookmark-toggle-filename | Toggle bookmark location visibility. |
+
+* Helm Eshell on file
+
+** Tips
+
+*** Pass extra arguments after filename
+
+Normally the command or alias will be called with file as argument. For instance
+
+ : <command> candidate_file
+
+But you can also pass an argument or more after =candidate_file= like this:
+
+ : <command> %s [extra_args]
+
+=candidate_file= will be added at =%s= and the command will look at this:
+
+ : <command> candidate_file [extra_args]
+
+**** Use placeholders in extra arguments
+
+placeholder for file without extension: \@
+placeholder for incremental number: \#
+
+=candidate_file= will be added at =%s= and \@ but without extension.
+
+ : <command %s \@>
+
+=candidate_file= will be added at =%s= and \# will be replaced by an incremental number.
+
+ : <command> %s \#
+
+Here examples:
+
+Say you want to use the =convert= command to convert all your .png files in a directory to .jpg.
+
+This will convert all your files to jpg keeping the same basename.
+
+ : convert %s \@.jpg
+
+This will convert all your files to foo-001.jpg, foo-002.jpg etc...
+
+ : convert %s foo-\#.jpg
+
+You can of course combine both placeholders if needed.
+
+ : convert %s \@-\#.jpg
+
+*** Specify marked files as arguments
+
+Example:
+
+ : <command> file1 file2...
+
+Call ~helm-find-files-eshell-command-on-file~ with one prefix argument. Otherwise
+you can pass one prefix argument from the command selection buffer.
+
+*Note*: This does not work on remote files.
+
+With two prefix-args the output is printed to the ~current-buffer~.
+
+With no prefix argument or a prefix argument value of ’(16) ({{{kbd(C-u C-u)}}})
+the command is called once for each file like this:
+
+ : <command> file1
+ : <command> file2
+ : ...
+
+*** Run eshell commands asynchronously
+
+You can run your commands asynchronously by adding =&= at end
+of any commands, e.g. =foo %s &=. You can also directly setup
+your alias in the eshell alias file with e.g. =alias foo $1 &=.
+
+*Note*: If you use =&= in a command with marked files and your
+command accept many files as argument don’t forget to pass the
+prefix arg to ensure you run only one command on all marked async.
+
+** Commands
+
+Uses keymap ~helm-esh-on-file-map~, which is not currently defined.
+
+* Helm Ido virtual buffers
+
+** Commands
+
+Uses keymap ~helm-buffers-ido-virtual-map~, which is not currently defined.
+
+| Keys | Description |
+|--------------------------------------+-------------------------|
+| M-x helm-ff-run-switch-other-window | Switch to other window. |
+| M-x helm-ff-run-switch-other-frame | Switch to other frame. |
+| M-x helm-ff-run-grep | Grep file. |
+| M-x helm-ff-run-zgrep | Zgrep file. |
+| M-x helm-ff-run-delete-file | Delete file. |
+| M-x helm-ff-run-open-file-externally | Open file externally. |
+
+* Helm Moccur
+
+** Tips
+
+*** Searching in many buffers
+
+Start from ~helm-buffers-list~ or ~helm-mini~, mark some buffers and hit
+Uses keymap ‘helm-buffer-map\[helm-buffers-run-occur].
+A prefix arg will change the behavior of `helm-occur-always-search-in-current'
+i.e. add current buffer or not to the list of buffers to search in.
+
+*** Matching
+
+Multiple regexp matching is allowed, simply enter a space to separate the regexps.
+
+Matching empty lines is supported with the regexp =^$=, you then get the
+results displayed as the buffer-name and the line number only. You can
+save and edit these results, i.e. add text to the empty line.
+
+*** Automatically match symbol at point
+
+Helm can automatically match the symbol at point while keeping
+the minibuffer empty, ready to be written to when
+`helm-source-occur' and `helm-source-moccur' are member of
+`helm-sources-using-default-as-input'.
+
+*** Yank word at point in minibuffer
+
+Use {{{kbd(C-w)}}} as many times as needed, undo with {{{kbd(C-_)}}}. Note that
+{{{kbd(C-w)}}} and {{{kbd(C-_)}}} are not standard keybindings, but bindings
+provided with special helm feature
+`helm-define-key-with-subkeys'.
+
+*** Preselection
+
+When helm-occur search symbol at point the current line is
+preselected in the source related to current-buffer. When
+`helm-occur-keep-closest-position' is non nil helm-occur will
+select the line which is the closest from the current line in
+current-buffer after updating.
+
+*** Jump to the corresponding line in the searched buffer
+
+You can do this with `\<helm-map’, which is not currently defined.
+{{{kbd(M-x helm-execute-persistent-action’)}}} (persistent-action), to do it repeatedly
+you can use {{{kbd(C-<down>)}}} and {{{kbd(C-<up>)}}} or enable ~helm-follow-mode~ with {{{kbd(C-c C-f)}}}.
+Follow mode is enabled by default in helm-occur.
+
+*** Switch to buffer in other window
+
+The command
+Uses keymap ~helm-moccur-map~, which is not currently defined.
+{{{kbd(M-x helm-moccur-run-goto-line-ow)}}} allow you to switch to buffer
+in other window horizontally or vertically if a prefix arg is supplied.
+
+*** Save the results
+
+Similarly to Helm-grep, you can save the results with {{{kbd(C-x C-s)}}}.
+Once in the saved buffer, you can edit it, see [[Edit a saved buffer][below]].
+
+Of course if you don’t save the results, you can resume the Helm session with
+~helm-resume~.
+
+*** Refresh the resumed session
+
+When the buffer(s) where you ran helm-(m)occur get(s) modified, the Helm buffer
+will flash red as a warning. You can refresh the buffer by running {{{kbd(C-c C-u)}}}.
+This can be done automatically by customizing ~helm-moccur-auto-update-on-resume~.
+
+*** Refresh a saved buffer
+
+Type {{{kbd(g)}}} to update the buffer.
+
+*** Edit a saved buffer
+
+First, install =wgrep=[fn:19] and then:
+
+1. {{{kbd(C-c C-p)}}} (~wgrep-change-to-wgrep-mode~) to edit the buffer(s).
+2. {{{kbd(C-x C-s)}}} to save your changes.
+
+*Tip*: Use the excellent =iedit=[fn:20] to modify all
+occurences at once in the buffer.
+
+*** Search in region
+
+When searching in current-buffer with ~helm-occur~, if a region
+is found helm will search in this region only. If you marked
+this region with ~mark-defun~ the symbol that was at point before
+marking defun will be used when ~helm-source-occur~ is member of
+~helm-sources-using-default-as-input~.
+
+*** Switch to next or previous source
+
+See [[Moving in ‘helm-buffer’][Moving in ‘helm-buffer’]].
+
+** Commands
+
+| Keys | Description |
+|---------+-----------------------------|
+| C-c o | Go to line in other window. |
+| C-c C-o | Go to line in new frame. |
+| C-x C-s | Save results in new buffer. |
+
+* Helm Top
+
+** Commands
+
+Uses keymap ~helm-top-map~, which is not currently defined.
+
+| Keys | Description |
+|-------------------------------+------------------------------|
+| M-x helm-top-run-sort-by-com | Sort by commands. |
+| M-x helm-top-run-sort-by-cpu | Sort by CPU usage. |
+| M-x helm-top-run-sort-by-user | Sort alphabetically by user. |
+| M-x helm-top-run-sort-by-mem | Sort by memory. |
+
+* Helm Elisp package
+
+** Tips
+
+*** Compile all your packages asynchronously
+
+If you use async (if you have installed Helm from MELPA you do), only =helm=,
+=helm-core=, and =magit= are compiled asynchronously. If you want all your
+packages compiled asynchronously, add this to your init file:
+
+ (setq async-bytecomp-allowed-packages ’(all))
+
+*** Upgrade Elisp packages
+
+On initialization (when Emacs is fetching packages on remote), if Helm finds
+packages to upgrade, it will start in the upgradable packages view showing the packages
+available for upgrade.
+
+On subsequent runs, you will have to refresh the list with {{{kbd(C-c C-u)}}}. If Helm
+finds upgrades you can switch to upgrade view (see below) to see what packages
+are available for upgrade or simply hit {{{kbd(C-c U)}}} to upgrade them all.
+
+To see upgradable packages hit {{{kbd(M-U)}}}.
+
+Then you can install all upgradable packages with the =upgrade all= action
+({{{kbd(C-c C-u)}}}), or upgrade only specific packages by marking them and running the
+=upgrade= action (visible only when there are upgradable packages). Of course
+you can upgrade a single package by just running the =upgrade= action without
+marking it ({{{kbd(C-c u)}}} or {{{kbd(RET)}}}) .
+
+*Warning:* You are strongly advised to *restart* Emacs after *upgrading* packages.
+
+*** Meaning of flags prefixing packages
+
+(Emacs ≥25)
+
+- The flag =S= that prefixes package names means that the packages belong to ~package-selected-packages~.
+
+- The flag =U= that prefix package names mean that this package is no more needed.
+
+** Commands
+
+Uses keymap ~helm-el-package-map~, which is not currently defined.
+
+| Keys | Description |
+|--------------------------------------+-----------------------------------|
+| M-x helm-el-package-show-all | Show all packages. |
+| M-x helm-el-package-show-installed | Show installed packages only. |
+| M-x helm-el-package-show-uninstalled | Show non-installed packages only. |
+| M-x helm-el-package-show-upgrade | Show upgradable packages only. |
+| M-x helm-el-package-show-built-in | Show built-in packages only. |
+| M-x helm-el-run-package-install | Install package(s). |
+| M-x helm-el-run-package-reinstall | Reinstall package(s). |
+| M-x helm-el-run-package-uninstall | Uninstall package(s). |
+| M-x helm-el-run-package-upgrade | Upgrade package(s). |
+| M-x helm-el-run-package-upgrade-all | Upgrade all packages. |
+| M-x helm-el-run-visit-homepage | Visit package homepage. |
+
+* Helm M-x
+
+** Tips
+
+*** You can get help on any command with persistent action (C-j)
+
+*** Prefix arguments
+
+You can pass prefix arguments *after* starting ~helm-M-x~. A mode-line
+counter will display the number of given prefix arguments.
+
+If you pass prefix arguments before running ~helm-M-x~, it will be displayed in the prompt.
+The first {{{kbd(C-u)}}} after ~helm-M-x~ clears those prefix arguments.
+
+*Note*: When you specify prefix arguments once ~helm-M-x~ is
+started, the prefix argument apply on the next command, so if you
+hit RET, it will apply on the selected command, but if you type a
+new character at prompt to narrow down further candidates, the
+prefix arg will apply to ~self-insert-command~ (e.g. if you type
+{{{kbd(C-u e)}}} =eeee= will be inserted in prompt) so select the
+command you want to execute before specifying prefix arg.
+
+*** Completion styles in {{{kbd(helm-M-x)}}}
+
+By default {{{kbd(helm-M-x)}}} use ’helm completion style, if you want to enable fuzzy matching aka flex,
+see [[Completion-styles][Completion-styles]].
+
+*** Duplicate entries in helm-M-x history
+
+helm-M-x history obey to history variables, if you have
+duplicates in your helm-M-x history set ~history-delete-duplicates~ to non nil.
+
+* Helm Imenu
+
+** Commands
+
+Uses keymap ~helm-imenu-map~, which is not currently defined.
+
+| Keys | Description |
+|---------------------------------+-------------------------|
+| M-x helm-imenu-next-section | Go to next section. |
+| M-x helm-imenu-previous-section | Go to previous section. |
+
+* Helm colors
+
+** Commands
+
+Uses keymap ~helm-color-map~, which is not currently defined.
+
+| Keys | Description |
+|--------------------------------+-----------------------------|
+| M-x helm-color-run-insert-name | Insert the entry name. |
+| M-x helm-color-run-kill-name | Kill the entry name. |
+| M-x helm-color-run-insert-rgb | Insert entry in RGB format. |
+| M-x helm-color-run-kill-rgb | Kill entry in RGB format. |
+
+* Helm Semantic
+
+** Commands
+
+Uses keymap ~helm-semantic-map~, which is not currently defined.
+
+* Helm kmacro
+
+** Tips
+
+- Start recording a kmacro with {{{kbd(f3)}}}.
+- End the kmacro recording with {{{kbd(f4)}}}.
+- Run ~helm-execute-kmacro~ to list all your kmacros.
+
+Use persistent action to run your kmacro as many times as needed.
+You can browse the kmacros with ~helm-next-line~ and ~helm-previous-line~.
+
+*Note*: You can’t record keys running Helm commands except ~helm-M-x~, under the
+condition that you don’t choose a command using Helm completion.
+
+** Commands
+
+Uses keymap ~helm-kmacro-map~, which is not currently defined.
+
+* Helm kill ring
+
+** Tips
+
+Every Helm session lets you save a candidate to the kill-ring / clipboard /
+primary-selection with {{{kbd(C-c C-k)}}}.
+
+To save space, Helm-kill-ring truncates the candidates longer than
+~helm-kill-ring-max-offset~.
+‘
+Uses keymap ~helm-kill-ring-map~, which is not currently defined.
+{{{kbd(M-x helm-kill-ring-kill-selection)}}}’ then saves the whole
+text and not the truncated value. The view of truncated candidates can be
+toggled; see the command list below.
+
+As opposed to ~yank~, numeric prefix arguments are ignored with
+~helm-show-kill-ring~: there is no need for them since selection happens within
+Helm. Moreover Helm has [[Shortcuts for executing the default action on the n-th candidate][Shortcuts for executing the default action on the n-th candidate]].
+
+It is recommended to globally bind {{{kbd(M-y)}}} to ~helm-show-kill-ring~. Once in the
+Helm-kill-ring session you can navigate to next/previous line with {{{kbd(M-y)}}} and
+{{{kbd(M-u)}}} for convenience. Of course {{{kbd(M-x helm-next-line)}}} and {{{kbd(M-x helm-previous-line)}}} are still available.
+
+It is possible to delete candidates from the kill ring with ‘
+Uses keymap ~helm-kill-ring-map~, which is not currently defined.
+{{{kbd(M-x helm-kill-ring-delete)}}}’
+but also persistently with ‘
+Uses keymap ~helm-kill-ring-map~, which is not currently defined.
+{{{kbd(M-x helm-kill-ring-run-persistent-delete)}}}’.
+
+You can concatenate marked candidates and yank them in the current
+buffer, thus creating a new entry in the kill ring. Candidates are
+concatenated with ~helm-kill-ring-separator~ as default but you can
+change interactively the separator while yanking by using two prefix
+args. When you have something else than =\n= as default value for
+~helm-kill-ring-separator~ and you want to use =\n= from prompt, use
+{{{kbd(C-q C-j)}}} to enter a newline in prompt.
+
+To not push a new entry in the kill ring, use {{{kbd(C-c TAB)}}} instead of RET
+(note that you can’t change separator with this).
+
+When inserting candidates with the default action ({{{kbd(RET)}}}), ~point~ is placed at
+the end of the candidate and ~mark~ at the beginning. You can revert this behavior
+by using a prefix argument, i.e. {{{kbd(C-u RET)}}}, like the regular ~yank~ command does.
+
+** Commands
+
+Uses keymap ~helm-kill-ring-map~, which is not currently defined.
+
+| Keys | Description |
+|-------------------------------------+-------------------------------------|
+| M-x helm-next-line | Next line. |
+| M-x helm-previous-line | Previous line. |
+| M-x helm-kill-ring-delete | Delete entry. |
+| M-x helm-kill-ring-toggle-truncated | Toggle truncated view of candidate. |
+| M-x helm-kill-ring-kill-selection | Kill non-truncated of selection. |
+
+* Export Setup :noexport:
+
+#+setupfile: doc-setup.org
+
+# #+options: H:4
+
+#+export_file_name: helm-manual.texi
+
+#+texinfo_dir_category: Emacs Add-ons
+#+texinfo_dir_title: M-x helm-documentation: (helm-manual)
+#+texinfo_dir_desc: M-x helm-documentation
+
+* Footnotes
+
+[fn:1] Behavior may change depending context in some source e.g. ~helm-find-files~.
+
+[fn:2] Delete from point to end or all depending on the value of
+~helm-delete-minibuffer-contents-from-point~.
+
+[fn:3] https://github.com/coldnew/linum-relative
+
+[fn:4] Note that the key bindings are always available even if line
+numbers are not displayed. They are just useless in this case.
+
+[fn:5] [[https://github.com/emacs-helm/helm/issues/1945][bug#1945]].
+
+[fn:6] [[https://unix.stackexchange.com/questions/183504/how-to-rsync-files-between-two-remotes][how-to-rsync-files-between-two-remotes]]
+ for the command line to use.
+
+[fn:7] http://freedesktop.org/wiki/Specifications/trash-spec
+
+[fn:8] https://github.com/andreafrancia/trash-cli
+
+[fn:9] https://github.com/emacs-helm/helm-ls-git
+
+[fn:10] https://github.com/emacs-helm/helm-ls-hg
+
+[fn:11] https://github.com/sharkdp/fd
+
+[fn:12] [[https://github.com/emacs-helm/helm/wiki/Locate#windows][Locate on Windows]]
+
+[fn:13] [[https://github.com/emacs-helm/helm/wiki/Locate#windows][Locate on Windows]]
+
+[fn:14] https://github.com/sharkdp/fd#command-line-options
+
+[fn:15] https://github.com/sharkdp/fd#colorized-output
+
+[fn:16] https://github.com/sharkdp/fd/issues/725
+
+[fn:17] https://docs.rs/regex/1.0.0/regex/#syntax
+
+[fn:18] https://github.com/mhayashi1120/Emacs-wgrep
+
+[fn:19] https://github.com/mhayashi1120/Emacs-wgrep
+
+[fn:20] https://github.com/victorhge/iedit
+
+#+EXCLUDE_TAGS: TOC_4
diff --git a/doc/helm-moccur-class.plantuml b/doc/helm-moccur-class.plantuml
new file mode 100644
index 00000000..017a3741
--- /dev/null
+++ b/doc/helm-moccur-class.plantuml
@@ -0,0 +1,17 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-moccur-class'**\n\n
+"helm-source-in-buffer" <|-- "helm-moccur-class"
+class "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-moccur-class" {
+ __ some interesting slots __
+ buffer-name
+ moccur-buffers
+}
+note right of "helm-moccur-class"
+ **helm-moccur-class**
+end note
+@enduml
diff --git a/doc/helm-recentf-source.plantuml b/doc/helm-recentf-source.plantuml
new file mode 100644
index 00000000..d35199b9
--- /dev/null
+++ b/doc/helm-recentf-source.plantuml
@@ -0,0 +1,27 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-recentf-source'**\n\n
+"helm-source-sync" <|-- "helm-recentf-source"
+"helm-type-file" <|-- "helm-recentf-source"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-type-file"
+"helm-source" <|-- "helm-type-file"
+class "helm-source"
+class "helm-recentf-source" {
+ __ some interesting slots __
+ init
+ candidates
+ match-dynamic
+ match-part
+ match-strict
+ migemo
+ pattern-transformer
+ persistent-action
+}
+note right of "helm-recentf-source"
+ **helm-recentf-source**
+end note
+@enduml
diff --git a/doc/helm-semantic-source.plantuml b/doc/helm-semantic-source.plantuml
new file mode 100644
index 00000000..49ccd50b
--- /dev/null
+++ b/doc/helm-semantic-source.plantuml
@@ -0,0 +1,22 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-semantic-source'**\n\n
+"helm-source-in-buffer" <|-- "helm-semantic-source"
+class "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-semantic-source" {
+ __ some interesting slots __
+ init
+ action
+ get-line
+ help-message
+ keymap
+ persistent-action
+ persistent-help
+}
+note right of "helm-semantic-source"
+ **helm-semantic-source**
+end note
+@enduml
diff --git a/doc/helm-source-async.plantuml b/doc/helm-source-async.plantuml
new file mode 100644
index 00000000..f3b85115
--- /dev/null
+++ b/doc/helm-source-async.plantuml
@@ -0,0 +1,28 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-async'**\n\n
+"helm-source" <|-- "helm-source-async"
+class "helm-source"
+class "helm-source-async" {
+ Use this class to define a
+ helm source calling an
+ external process.
+ ==
+ __ some interesting slots __
+ candidates-process
+ multimatch
+}
+note right of "helm-source-async"
+ **helm-source-async**:
+ Use this class to define a
+ helm source calling an
+ external process.
+end note
+"helm-source-async" <|-- "helm-mac-spotlight-source"
+"helm-source-async" <|-- "helm-gid-source"
+"helm-source-async" <|-- "helm-fd-class"
+"helm-source-async" <|-- "helm-locate-source"
+"helm-source-async" <|-- "helm-grep-ag-class"
+"helm-source-async" <|-- "helm-grep-class"
+@enduml
diff --git a/doc/helm-source-basic-bookmarks.plantuml b/doc/helm-source-basic-bookmarks.plantuml
new file mode 100644
index 00000000..3b6ad6c1
--- /dev/null
+++ b/doc/helm-source-basic-bookmarks.plantuml
@@ -0,0 +1,29 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-basic-bookmarks'**\n\n
+"helm-source-in-buffer" <|-- "helm-source-basic-bookmarks"
+"helm-type-bookmark" <|-- "helm-source-basic-bookmarks"
+class "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-type-bookmark"
+"helm-source" <|-- "helm-type-bookmark"
+class "helm-source"
+class "helm-source-basic-bookmarks" {
+ __ some interesting slots __
+ init
+ candidates
+ data
+ filtered-candidate-transformer
+ get-line
+ match
+ migemo
+ search
+ search-strict
+ volatile
+}
+note right of "helm-source-basic-bookmarks"
+ **helm-source-basic-bookmarks**
+end note
+@enduml
diff --git a/doc/helm-source-buffers.plantuml b/doc/helm-source-buffers.plantuml
new file mode 100644
index 00000000..4d27206a
--- /dev/null
+++ b/doc/helm-source-buffers.plantuml
@@ -0,0 +1,33 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-buffers'**\n\n
+"helm-source-sync" <|-- "helm-source-buffers"
+"helm-type-buffer" <|-- "helm-source-buffers"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-type-buffer"
+"helm-source" <|-- "helm-type-buffer"
+class "helm-source"
+class "helm-source-buffers" {
+ __ some interesting slots __
+ init
+ buffer-list
+ candidates
+ help-message
+ keymap
+ match
+ match-dynamic
+ match-strict
+ migemo
+ multimatch
+ nohighlight
+ persistent-action
+ resume
+ volatile
+}
+note right of "helm-source-buffers"
+ **helm-source-buffers**
+end note
+@enduml
diff --git a/doc/helm-source-dummy.plantuml b/doc/helm-source-dummy.plantuml
new file mode 100644
index 00000000..34297759
--- /dev/null
+++ b/doc/helm-source-dummy.plantuml
@@ -0,0 +1,19 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-dummy'**\n\n
+"helm-source" <|-- "helm-source-dummy"
+class "helm-source"
+class "helm-source-dummy" {
+ __ some interesting slots __
+ accept-empty
+ candidates
+ filtered-candidate-transformer
+ match
+ multimatch
+ volatile
+}
+note right of "helm-source-dummy"
+ **helm-source-dummy**
+end note
+@enduml
diff --git a/doc/helm-source-ffiles.plantuml b/doc/helm-source-ffiles.plantuml
new file mode 100644
index 00000000..86124a68
--- /dev/null
+++ b/doc/helm-source-ffiles.plantuml
@@ -0,0 +1,36 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-ffiles'**\n\n
+"helm-source-sync" <|-- "helm-source-ffiles"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-source-ffiles" {
+ __ some interesting slots __
+ init
+ action
+ action-transformer
+ after-init-hook
+ before-init-hook
+ candidate-number-limit
+ candidates
+ cleanup
+ filtered-candidate-transformer
+ group
+ header-name
+ help-message
+ keymap
+ match-on-real
+ migemo
+ mode-line
+ nohighlight
+ persistent-action-if
+ persistent-help
+ update
+ volatile
+}
+note right of "helm-source-ffiles"
+ **helm-source-ffiles**
+end note
+@enduml
diff --git a/doc/helm-source-filtered-bookmarks.plantuml b/doc/helm-source-filtered-bookmarks.plantuml
new file mode 100644
index 00000000..df289fc7
--- /dev/null
+++ b/doc/helm-source-filtered-bookmarks.plantuml
@@ -0,0 +1,30 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-filtered-bookmarks'**\n\n
+"helm-source-in-buffer" <|-- "helm-source-filtered-bookmarks"
+"helm-type-bookmark" <|-- "helm-source-filtered-bookmarks"
+class "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-type-bookmark"
+"helm-source" <|-- "helm-type-bookmark"
+class "helm-source"
+class "helm-source-filtered-bookmarks" {
+ __ some interesting slots __
+ init
+ candidates
+ data
+ filtered-candidate-transformer
+ get-line
+ match
+ migemo
+ search
+ search-strict
+ volatile
+}
+note right of "helm-source-filtered-bookmarks"
+ **helm-source-filtered-bookmarks**
+end note
+"helm-source-filtered-bookmarks" <|-- "helm-bookmark-find-files-class"
+@enduml
diff --git a/doc/helm-source-in-buffer.plantuml b/doc/helm-source-in-buffer.plantuml
new file mode 100644
index 00000000..d6dd042f
--- /dev/null
+++ b/doc/helm-source-in-buffer.plantuml
@@ -0,0 +1,39 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-in-buffer'**\n\n
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-source-in-buffer" {
+ Use this source to make helm
+ sources storing candidates
+ inside a buffer.
+ ==
+ __ some interesting slots __
+ init
+ candidates
+ data
+ get-line
+ match
+ migemo
+ search
+ search-strict
+ volatile
+}
+note right of "helm-source-in-buffer"
+ **helm-source-in-buffer**:
+ Use this source to make helm
+ sources storing candidates
+ inside a buffer.
+end note
+"helm-source-in-buffer" <|-- "helm-semantic-source"
+"helm-source-in-buffer" <|-- "helm-file-cache"
+"helm-source-in-buffer" <|-- "helm-list-el-package-source"
+"helm-source-in-buffer" <|-- "helm-source-filtered-bookmarks"
+"helm-source-in-buffer" <|-- "helm-source-basic-bookmarks"
+"helm-source-in-buffer" <|-- "helm-info-source"
+"helm-source-in-buffer" <|-- "helm-browse-project-source"
+"helm-source-in-buffer" <|-- "helm-moccur-class"
+"helm-source-in-buffer" <|-- "helm-locate-subdirs-source"
+"helm-source-in-buffer" <|-- "helm-source-in-file"
+@enduml
diff --git a/doc/helm-source-in-file.plantuml b/doc/helm-source-in-file.plantuml
new file mode 100644
index 00000000..72a5c539
--- /dev/null
+++ b/doc/helm-source-in-file.plantuml
@@ -0,0 +1,25 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-in-file'**\n\n
+"helm-source-in-buffer" <|-- "helm-source-in-file"
+class "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-in-buffer"
+class "helm-source"
+class "helm-source-in-file" {
+ The contents of the FILE will
+ be used as candidates in
+ buffer.
+ ==
+ __ some interesting slots __
+ init
+ candidates-file
+ get-line
+}
+note right of "helm-source-in-file"
+ **helm-source-in-file**:
+ The contents of the FILE will
+ be used as candidates in
+ buffer.
+end note
+@enduml
diff --git a/doc/helm-source-session-class.plantuml b/doc/helm-source-session-class.plantuml
new file mode 100644
index 00000000..12a665b0
--- /dev/null
+++ b/doc/helm-source-session-class.plantuml
@@ -0,0 +1,19 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-session-class'**\n\n
+"helm-source-sync" <|-- "helm-source-session-class"
+class "helm-source-sync"
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-source-session-class" {
+ __ some interesting slots __
+ action
+ candidates
+ help-message
+ keymap
+}
+note right of "helm-source-session-class"
+ **helm-source-session-class**
+end note
+@enduml
diff --git a/doc/helm-source-sync.plantuml b/doc/helm-source-sync.plantuml
new file mode 100644
index 00000000..ed12e3e6
--- /dev/null
+++ b/doc/helm-source-sync.plantuml
@@ -0,0 +1,37 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source-sync'**\n\n
+"helm-source" <|-- "helm-source-sync"
+class "helm-source"
+class "helm-source-sync" {
+ Use this class to make helm
+ sources using a list of
+ candidates.
+ ==
+ __ some interesting slots __
+ candidates
+ match-dynamic
+ match-strict
+ migemo
+}
+note right of "helm-source-sync"
+ **helm-source-sync**:
+ Use this class to make helm
+ sources using a list of
+ candidates.
+end note
+"helm-source-sync" <|-- "helm-source-session-class"
+"helm-source-sync" <|-- "helm-files-dired-source"
+"helm-source-sync" <|-- "helm-imenu-source"
+"helm-source-sync" <|-- "helm-files-in-current-dir-source"
+"helm-source-sync" <|-- "helm-recentf-source"
+"helm-source-sync" <|-- "helm-eshell-history-source"
+"helm-source-sync" <|-- "helm-esh-source"
+"helm-source-sync" <|-- "helm-epa"
+"helm-source-sync" <|-- "helm-M-x-class"
+"helm-source-sync" <|-- "helm-idle-time-timers-class"
+"helm-source-sync" <|-- "helm-absolute-time-timers-class"
+"helm-source-sync" <|-- "helm-source-ffiles"
+"helm-source-sync" <|-- "helm-source-buffers"
+@enduml
diff --git a/doc/helm-source.plantuml b/doc/helm-source.plantuml
new file mode 100644
index 00000000..6f927c67
--- /dev/null
+++ b/doc/helm-source.plantuml
@@ -0,0 +1,72 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-source'**\n\n
+class "helm-source" {
+ Main interface to define helm
+ sources.
+ ==
+ __ some interesting slots __
+ init
+ name
+ action
+ action-transformer
+ after-init-hook
+ allow-dups
+ before-init-hook
+ candidate-number-limit
+ candidate-transformer
+ candidates
+ cleanup
+ coerce
+ delayed
+ display-to-real
+ filter-one-by-one
+ filtered-candidate-transformer
+ follow
+ follow-delay
+ fuzzy-match
+ group
+ header-line
+ header-name
+ help-message
+ history
+ keymap
+ marked-with-props
+ match
+ match-on-real
+ match-part
+ mode-line
+ multiline
+ multimatch
+ must-match
+ nohighlight
+ nomark
+ pattern-transformer
+ persistent-action
+ persistent-action-if
+ persistent-help
+ real-to-display
+ redisplay
+ requires-pattern
+ resume
+ update
+ volatile
+}
+note right of "helm-source"
+ **helm-source**:
+ Main interface to define helm
+ sources.
+end note
+"helm-source" <|-- "helm-bookmark-override-inheritor"
+"helm-source" <|-- "helm-type-timers"
+"helm-source" <|-- "helm-type-command"
+"helm-source" <|-- "helm-type-function"
+"helm-source" <|-- "helm-type-buffer"
+"helm-source" <|-- "helm-type-bookmark"
+"helm-source" <|-- "helm-type-file"
+"helm-source" <|-- "helm-source-dummy"
+"helm-source" <|-- "helm-source-in-buffer"
+"helm-source" <|-- "helm-source-async"
+"helm-source" <|-- "helm-source-sync"
+@enduml
diff --git a/doc/helm-type-bookmark.plantuml b/doc/helm-type-bookmark.plantuml
new file mode 100644
index 00000000..b5063075
--- /dev/null
+++ b/doc/helm-type-bookmark.plantuml
@@ -0,0 +1,20 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-bookmark'**\n\n
+"helm-source" <|-- "helm-type-bookmark"
+class "helm-source"
+class "helm-type-bookmark" {
+ A class to define type
+ bookmarks.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-bookmark"
+ **helm-type-bookmark**:
+ A class to define type
+ bookmarks.
+end note
+"helm-type-bookmark" <|-- "helm-source-filtered-bookmarks"
+"helm-type-bookmark" <|-- "helm-source-basic-bookmarks"
+@enduml
diff --git a/doc/helm-type-buffer.plantuml b/doc/helm-type-buffer.plantuml
new file mode 100644
index 00000000..fa284a38
--- /dev/null
+++ b/doc/helm-type-buffer.plantuml
@@ -0,0 +1,17 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-buffer'**\n\n
+"helm-source" <|-- "helm-type-buffer"
+class "helm-source"
+class "helm-type-buffer" {
+ A class to define type buffer.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-buffer"
+ **helm-type-buffer**:
+ A class to define type buffer.
+end note
+"helm-type-buffer" <|-- "helm-source-buffers"
+@enduml
diff --git a/doc/helm-type-command.plantuml b/doc/helm-type-command.plantuml
new file mode 100644
index 00000000..81b97704
--- /dev/null
+++ b/doc/helm-type-command.plantuml
@@ -0,0 +1,19 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-command'**\n\n
+"helm-source" <|-- "helm-type-command"
+class "helm-source"
+class "helm-type-command" {
+ A class to define helm type
+ command.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-command"
+ **helm-type-command**:
+ A class to define helm type
+ command.
+end note
+"helm-type-command" <|-- "helm-M-x-class"
+@enduml
diff --git a/doc/helm-type-file.plantuml b/doc/helm-type-file.plantuml
new file mode 100644
index 00000000..d0118afa
--- /dev/null
+++ b/doc/helm-type-file.plantuml
@@ -0,0 +1,25 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-file'**\n\n
+"helm-source" <|-- "helm-type-file"
+class "helm-source"
+class "helm-type-file" {
+ A class to define helm type
+ file.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-file"
+ **helm-type-file**:
+ A class to define helm type
+ file.
+end note
+"helm-type-file" <|-- "helm-mac-spotlight-source"
+"helm-type-file" <|-- "helm-files-dired-source"
+"helm-type-file" <|-- "helm-files-in-current-dir-source"
+"helm-type-file" <|-- "helm-recentf-source"
+"helm-type-file" <|-- "helm-file-cache"
+"helm-type-file" <|-- "helm-browse-project-override-inheritor"
+"helm-type-file" <|-- "helm-locate-override-inheritor"
+@enduml
diff --git a/doc/helm-type-function.plantuml b/doc/helm-type-function.plantuml
new file mode 100644
index 00000000..a95ea08b
--- /dev/null
+++ b/doc/helm-type-function.plantuml
@@ -0,0 +1,18 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-function'**\n\n
+"helm-source" <|-- "helm-type-function"
+class "helm-source"
+class "helm-type-function" {
+ A class to define helm type
+ function.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-function"
+ **helm-type-function**:
+ A class to define helm type
+ function.
+end note
+@enduml
diff --git a/doc/helm-type-timers.plantuml b/doc/helm-type-timers.plantuml
new file mode 100644
index 00000000..159824d2
--- /dev/null
+++ b/doc/helm-type-timers.plantuml
@@ -0,0 +1,20 @@
+@startuml
+skinparam classFontStyle bold
+skinparam captionFontStyle bold
+title **Parents and Children of**\n**'helm-type-timers'**\n\n
+"helm-source" <|-- "helm-type-timers"
+class "helm-source"
+class "helm-type-timers" {
+ A class to define helm type
+ timers.
+ ==
+ __ some interesting slots __
+}
+note right of "helm-type-timers"
+ **helm-type-timers**:
+ A class to define helm type
+ timers.
+end note
+"helm-type-timers" <|-- "helm-idle-time-timers-class"
+"helm-type-timers" <|-- "helm-absolute-time-timers-class"
+@enduml
diff --git a/doc/helm.org b/doc/helm.org
new file mode 100644
index 00000000..7ae9f22e
--- /dev/null
+++ b/doc/helm.org
@@ -0,0 +1,14243 @@
+#+title: The Helm Manual
+# #+subtitle: Release {{{version}}}
+#+subtitle: Release 3.6.2
+#+author: The Helm Developers
+# #+date: {{{modification-time}}}
+#+language: en
+
+# #+texinfo: @insertcopying
+
+* Table Of Contents :TOC_3:
+- [[#package-helm][Package: helm]]
+ - [[#library-helm][Library: helm]]
+ - [[#modes-in-library-helm][Modes in library ~helm~]]
+ - [[#commands-in-keymap-helm-map][Commands in keymap ~helm-map~]]
+ - [[#commands-in-library-helm-excludes-keymaps][Commands in library ~helm~ (excludes keymaps)]]
+ - [[#options-in-library-helm][Options in library =helm=]]
+ - [[#hooks-in-library-helm][Hooks in library =helm=]]
+ - [[#library-helm-adaptive][Library: helm-adaptive]]
+ - [[#modes-in-library-helm-adaptive][Modes in library ~helm-adaptive~]]
+ - [[#commands-in-library-helm-adaptive-excludes-keymaps][Commands in library ~helm-adaptive~ (excludes keymaps)]]
+ - [[#options-in-library-helm-adaptive][Options in library =helm-adaptive=]]
+ - [[#hooks-in-library-helm-adaptive][Hooks in library =helm-adaptive=]]
+ - [[#library-helm-bookmark][Library: helm-bookmark]]
+ - [[#commands-in-keymap-helm-bookmark-find-files-map][Commands in keymap ~helm-bookmark-find-files-map~]]
+ - [[#commands-in-keymap-helm-bookmark-map][Commands in keymap ~helm-bookmark-map~]]
+ - [[#commands-in-library-helm-bookmark-excludes-keymaps][Commands in library ~helm-bookmark~ (excludes keymaps)]]
+ - [[#options-in-library-helm-bookmark][Options in library =helm-bookmark=]]
+ - [[#library-helm-buffers][Library: helm-buffers]]
+ - [[#commands-in-keymap-helm-buffer-map][Commands in keymap ~helm-buffer-map~]]
+ - [[#commands-in-keymap-helm-buffer-not-found-map][Commands in keymap ~helm-buffer-not-found-map~]]
+ - [[#commands-in-library-helm-buffers-excludes-keymaps][Commands in library ~helm-buffers~ (excludes keymaps)]]
+ - [[#options-in-library-helm-buffers][Options in library =helm-buffers=]]
+ - [[#library-helm-color][Library: helm-color]]
+ - [[#commands-in-keymap-helm-color-map][Commands in keymap ~helm-color-map~]]
+ - [[#commands-in-library-helm-color-excludes-keymaps][Commands in library ~helm-color~ (excludes keymaps)]]
+ - [[#library-helm-comint][Library: helm-comint]]
+ - [[#commands-in-keymap-helm-comint-prompts-keymap][Commands in keymap ~helm-comint-prompts-keymap~]]
+ - [[#commands-in-library-helm-comint-excludes-keymaps][Commands in library ~helm-comint~ (excludes keymaps)]]
+ - [[#options-in-library-helm-comint][Options in library =helm-comint=]]
+ - [[#library-helm-command][Library: helm-command]]
+ - [[#commands-in-keymap-helm-m-x-map][Commands in keymap ~helm-M-x-map~]]
+ - [[#commands-in-library-helm-command-excludes-keymaps][Commands in library ~helm-command~ (excludes keymaps)]]
+ - [[#options-in-library-helm-command][Options in library =helm-command=]]
+ - [[#hooks-in-library-helm-command][Hooks in library =helm-command=]]
+ - [[#library-helm-config][Library: helm-config]]
+ - [[#library-helm-dabbrev][Library: helm-dabbrev]]
+ - [[#commands-in-library-helm-dabbrev-excludes-keymaps][Commands in library ~helm-dabbrev~ (excludes keymaps)]]
+ - [[#options-in-library-helm-dabbrev][Options in library =helm-dabbrev=]]
+ - [[#library-helm-easymenu][Library: helm-easymenu]]
+ - [[#library-helm-elisp][Library: helm-elisp]]
+ - [[#commands-in-library-helm-elisp-excludes-keymaps][Commands in library ~helm-elisp~ (excludes keymaps)]]
+ - [[#options-in-library-helm-elisp][Options in library =helm-elisp=]]
+ - [[#library-helm-elisp-package][Library: helm-elisp-package]]
+ - [[#commands-in-keymap-helm-el-package-map][Commands in keymap ~helm-el-package-map~]]
+ - [[#commands-in-library-helm-elisp-package-excludes-keymaps][Commands in library ~helm-elisp-package~ (excludes keymaps)]]
+ - [[#options-in-library-helm-elisp-package][Options in library =helm-elisp-package=]]
+ - [[#library-helm-epa][Library: helm-epa]]
+ - [[#modes-in-library-helm-epa][Modes in library ~helm-epa~]]
+ - [[#commands-in-library-helm-epa-excludes-keymaps][Commands in library ~helm-epa~ (excludes keymaps)]]
+ - [[#options-in-library-helm-epa][Options in library =helm-epa=]]
+ - [[#hooks-in-library-helm-epa][Hooks in library =helm-epa=]]
+ - [[#library-helm-eshell][Library: helm-eshell]]
+ - [[#commands-in-keymap-helm-eshell-prompts-keymap][Commands in keymap ~helm-eshell-prompts-keymap~]]
+ - [[#commands-in-library-helm-eshell-excludes-keymaps][Commands in library ~helm-eshell~ (excludes keymaps)]]
+ - [[#options-in-library-helm-eshell][Options in library =helm-eshell=]]
+ - [[#hooks-in-library-helm-eshell][Hooks in library =helm-eshell=]]
+ - [[#library-helm-eval][Library: helm-eval]]
+ - [[#commands-in-keymap-helm-eval-expression-map][Commands in keymap ~helm-eval-expression-map~]]
+ - [[#commands-in-library-helm-eval-excludes-keymaps][Commands in library ~helm-eval~ (excludes keymaps)]]
+ - [[#options-in-library-helm-eval][Options in library =helm-eval=]]
+ - [[#library-helm-external][Library: helm-external]]
+ - [[#commands-in-library-helm-external-excludes-keymaps][Commands in library ~helm-external~ (excludes keymaps)]]
+ - [[#options-in-library-helm-external][Options in library =helm-external=]]
+ - [[#library-helm-fd][Library: helm-fd]]
+ - [[#commands-in-keymap-helm-fd-map][Commands in keymap ~helm-fd-map~]]
+ - [[#options-in-library-helm-fd][Options in library =helm-fd=]]
+ - [[#library-helm-files][Library: helm-files]]
+ - [[#modes-in-library-helm-files][Modes in library ~helm-files~]]
+ - [[#commands-in-keymap-helm-browse-project-map][Commands in keymap ~helm-browse-project-map~]]
+ - [[#commands-in-keymap-helm-file-name-history-map][Commands in keymap ~helm-file-name-history-map~]]
+ - [[#commands-in-keymap-helm-find-files-map][Commands in keymap ~helm-find-files-map~]]
+ - [[#commands-in-keymap-helm-read-file-map][Commands in keymap ~helm-read-file-map~]]
+ - [[#commands-in-library-helm-files-excludes-keymaps][Commands in library ~helm-files~ (excludes keymaps)]]
+ - [[#options-in-library-helm-files][Options in library =helm-files=]]
+ - [[#hooks-in-library-helm-files][Hooks in library =helm-files=]]
+ - [[#library-helm-find][Library: helm-find]]
+ - [[#commands-in-keymap-helm-find-map][Commands in keymap ~helm-find-map~]]
+ - [[#commands-in-library-helm-find-excludes-keymaps][Commands in library ~helm-find~ (excludes keymaps)]]
+ - [[#options-in-library-helm-find][Options in library =helm-find=]]
+ - [[#library-helm-font][Library: helm-font]]
+ - [[#commands-in-keymap-helm-ucs-map][Commands in keymap ~helm-ucs-map~]]
+ - [[#commands-in-library-helm-font-excludes-keymaps][Commands in library ~helm-font~ (excludes keymaps)]]
+ - [[#options-in-library-helm-font][Options in library =helm-font=]]
+ - [[#library-helm-for-files][Library: helm-for-files]]
+ - [[#commands-in-library-helm-for-files-excludes-keymaps][Commands in library ~helm-for-files~ (excludes keymaps)]]
+ - [[#options-in-library-helm-for-files][Options in library =helm-for-files=]]
+ - [[#library-helm-global-bindings][Library: helm-global-bindings]]
+ - [[#commands-in-keymap-helm-command-map][Commands in keymap ~helm-command-map~]]
+ - [[#options-in-library-helm-global-bindings][Options in library =helm-global-bindings=]]
+ - [[#library-helm-grep][Library: helm-grep]]
+ - [[#modes-in-library-helm-grep][Modes in library ~helm-grep~]]
+ - [[#commands-in-keymap-helm-grep-map][Commands in keymap ~helm-grep-map~]]
+ - [[#commands-in-keymap-helm-grep-mode-map][Commands in keymap ~helm-grep-mode-map~]]
+ - [[#commands-in-keymap-helm-pdfgrep-map][Commands in keymap ~helm-pdfgrep-map~]]
+ - [[#commands-in-library-helm-grep-excludes-keymaps][Commands in library ~helm-grep~ (excludes keymaps)]]
+ - [[#options-in-library-helm-grep][Options in library =helm-grep=]]
+ - [[#hooks-in-library-helm-grep][Hooks in library =helm-grep=]]
+ - [[#library-helm-help][Library: helm-help]]
+ - [[#commands-in-library-helm-help-excludes-keymaps][Commands in library ~helm-help~ (excludes keymaps)]]
+ - [[#library-helm-id-utils][Library: helm-id-utils]]
+ - [[#commands-in-library-helm-id-utils-excludes-keymaps][Commands in library ~helm-id-utils~ (excludes keymaps)]]
+ - [[#options-in-library-helm-id-utils][Options in library =helm-id-utils=]]
+ - [[#library-helm-imenu][Library: helm-imenu]]
+ - [[#commands-in-keymap-helm-imenu-map][Commands in keymap ~helm-imenu-map~]]
+ - [[#commands-in-library-helm-imenu-excludes-keymaps][Commands in library ~helm-imenu~ (excludes keymaps)]]
+ - [[#options-in-library-helm-imenu][Options in library =helm-imenu=]]
+ - [[#library-helm-info][Library: helm-info]]
+ - [[#modes-in-library-helm-info][Modes in library ~helm-info~]]
+ - [[#commands-in-library-helm-info-excludes-keymaps][Commands in library ~helm-info~ (excludes keymaps)]]
+ - [[#options-in-library-helm-info][Options in library =helm-info=]]
+ - [[#library-helm-lib][Library: helm-lib]]
+ - [[#commands-in-library-helm-lib-excludes-keymaps][Commands in library ~helm-lib~ (excludes keymaps)]]
+ - [[#options-in-library-helm-lib][Options in library =helm-lib=]]
+ - [[#hooks-in-library-helm-lib][Hooks in library =helm-lib=]]
+ - [[#library-helm-locate][Library: helm-locate]]
+ - [[#commands-in-keymap-helm-locate-map][Commands in keymap ~helm-locate-map~]]
+ - [[#commands-in-library-helm-locate-excludes-keymaps][Commands in library ~helm-locate~ (excludes keymaps)]]
+ - [[#options-in-library-helm-locate][Options in library =helm-locate=]]
+ - [[#library-helm-man][Library: helm-man]]
+ - [[#commands-in-library-helm-man-excludes-keymaps][Commands in library ~helm-man~ (excludes keymaps)]]
+ - [[#options-in-library-helm-man][Options in library =helm-man=]]
+ - [[#library-helm-misc][Library: helm-misc]]
+ - [[#commands-in-library-helm-misc-excludes-keymaps][Commands in library ~helm-misc~ (excludes keymaps)]]
+ - [[#options-in-library-helm-misc][Options in library =helm-misc=]]
+ - [[#library-helm-mode][Library: helm-mode]]
+ - [[#modes-in-library-helm-mode][Modes in library ~helm-mode~]]
+ - [[#commands-in-keymap-helm-comp-read-map][Commands in keymap ~helm-comp-read-map~]]
+ - [[#commands-in-library-helm-mode-excludes-keymaps][Commands in library ~helm-mode~ (excludes keymaps)]]
+ - [[#options-in-library-helm-mode][Options in library =helm-mode=]]
+ - [[#hooks-in-library-helm-mode][Hooks in library =helm-mode=]]
+ - [[#library-helm-multi-match][Library: helm-multi-match]]
+ - [[#modes-in-library-helm-multi-match][Modes in library ~helm-multi-match~]]
+ - [[#commands-in-library-helm-multi-match-excludes-keymaps][Commands in library ~helm-multi-match~ (excludes keymaps)]]
+ - [[#options-in-library-helm-multi-match][Options in library =helm-multi-match=]]
+ - [[#hooks-in-library-helm-multi-match][Hooks in library =helm-multi-match=]]
+ - [[#library-helm-net][Library: helm-net]]
+ - [[#commands-in-library-helm-net-excludes-keymaps][Commands in library ~helm-net~ (excludes keymaps)]]
+ - [[#options-in-library-helm-net][Options in library =helm-net=]]
+ - [[#library-helm-occur][Library: helm-occur]]
+ - [[#modes-in-library-helm-occur][Modes in library ~helm-occur~]]
+ - [[#commands-in-keymap-helm-occur-map][Commands in keymap ~helm-occur-map~]]
+ - [[#commands-in-keymap-helm-occur-mode-map][Commands in keymap ~helm-occur-mode-map~]]
+ - [[#commands-in-library-helm-occur-excludes-keymaps][Commands in library ~helm-occur~ (excludes keymaps)]]
+ - [[#options-in-library-helm-occur][Options in library =helm-occur=]]
+ - [[#hooks-in-library-helm-occur][Hooks in library =helm-occur=]]
+ - [[#library-helm-regexp][Library: helm-regexp]]
+ - [[#commands-in-library-helm-regexp-excludes-keymaps][Commands in library ~helm-regexp~ (excludes keymaps)]]
+ - [[#library-helm-ring][Library: helm-ring]]
+ - [[#commands-in-keymap-helm-kill-ring-map][Commands in keymap ~helm-kill-ring-map~]]
+ - [[#commands-in-library-helm-ring-excludes-keymaps][Commands in library ~helm-ring~ (excludes keymaps)]]
+ - [[#options-in-library-helm-ring][Options in library =helm-ring=]]
+ - [[#library-helm-semantic][Library: helm-semantic]]
+ - [[#commands-in-library-helm-semantic-excludes-keymaps][Commands in library ~helm-semantic~ (excludes keymaps)]]
+ - [[#options-in-library-helm-semantic][Options in library =helm-semantic=]]
+ - [[#library-helm-shell][Library: helm-shell]]
+ - [[#commands-in-library-helm-shell-excludes-keymaps][Commands in library ~helm-shell~ (excludes keymaps)]]
+ - [[#library-helm-source][Library: helm-source]]
+ - [[#library-helm-sys][Library: helm-sys]]
+ - [[#modes-in-library-helm-sys][Modes in library ~helm-sys~]]
+ - [[#commands-in-keymap-helm-top-map][Commands in keymap ~helm-top-map~]]
+ - [[#commands-in-library-helm-sys-excludes-keymaps][Commands in library ~helm-sys~ (excludes keymaps)]]
+ - [[#options-in-library-helm-sys][Options in library =helm-sys=]]
+ - [[#hooks-in-library-helm-sys][Hooks in library =helm-sys=]]
+ - [[#library-helm-tags][Library: helm-tags]]
+ - [[#commands-in-keymap-helm-etags-map][Commands in keymap ~helm-etags-map~]]
+ - [[#commands-in-library-helm-tags-excludes-keymaps][Commands in library ~helm-tags~ (excludes keymaps)]]
+ - [[#options-in-library-helm-tags][Options in library =helm-tags=]]
+ - [[#library-helm-types][Library: helm-types]]
+ - [[#commands-in-keymap-helm-generic-files-map][Commands in keymap ~helm-generic-files-map~]]
+ - [[#options-in-library-helm-types][Options in library =helm-types=]]
+ - [[#library-helm-utils][Library: helm-utils]]
+ - [[#modes-in-library-helm-utils][Modes in library ~helm-utils~]]
+ - [[#commands-in-library-helm-utils-excludes-keymaps][Commands in library ~helm-utils~ (excludes keymaps)]]
+ - [[#options-in-library-helm-utils][Options in library =helm-utils=]]
+ - [[#hooks-in-library-helm-utils][Hooks in library =helm-utils=]]
+ - [[#library-helm-x-files][Library: helm-x-files]]
+ - [[#options-in-library-helm-x-files][Options in library =helm-x-files=]]
+- [[#main-index][Main Index]]
+- [[#key-index][Key Index]]
+- [[#command-and-function-index][Command and Function Index]]
+- [[#variable-index][Variable Index]]
+- [[#footnotes][Footnotes]]
+
+* Introduction
+
+ People often think helm is just something like ido([[info:Ido]]) but
+ displaying completion in a vertical layout instead of an horizontal
+ one, it is not, helm is much more powerful than that.
+
+ - Helm is able to complete multiple lists dispatched in different
+ sources against a pattern.
+
+ - Helm allows executing an unlimited number of actions on candidates.
+
+ - Helm allows marking candidates to execute chosen action against this
+ set of candidates.
+
+ - Helm can display its completion buffer in different window layouts
+ and in separate frame.
+
+ # Helm is divided in two distinct categories of commands,
+
+ # #+cindex: helm native commands
+ # #+cindex: helmized commands
+
+ # - *helm natives commands* :: these commands are a fresh implementation
+ # of an existing Emacs command and enhance them in useful ways.
+
+ # - *helmized commands* :: these Emacs native commands modified by
+ # helm-mode to provide helm completion and only that.
+
+ # When both are provided e.g ~switch-to-buffer~ vs ~helm-buffers-list~
+ # you will prefer the native helm commands generally more featured (more
+ # than one action, allows marking candidates, better display etc...).
+
+* Quick Start Guide
+
+** Requirements
+
+ Helm 3.6.2 and later require
+
+ - =Emacs= version >= 25.1
+ - =emacs-async=[fn:xxx1]
+ - =popup-el=[fn:xxx2]
+
+ # Helm require an =Emacs= version >= 25.1 starting from version 3.6.2.
+ # Helm uses few dependencies, actually only (mandatory) and
+ # popup (facultative) but if you install from
+ # Melpa[fn:xxx3] you should not care of this.
+
+** Download
+
+ - Home Page :: https://github.com/emacs-helm/helm
+
+ - Git Url ::
+
+ https://github.com/emacs-helm/helm.git
+
+ git@github.com:emacs-helm/helm.git
+
+ - Tagged Releases :: https://github.com/emacs-helm/helm/tags
+
+** Installation
+
+*** Minimal setup using =straight.el=
+
+ =straight.el=[fn:xxx3]
+
+ Add this to your init file,
+
+ #+begin_src emacs-lisp
+ (straight-use-package 'helm)
+ #+end_src
+
+ or
+
+ # # #+begin_src emacs-lisp
+ # # (use-package helm
+ # # :straight t
+ # # :config
+ # # [...])
+ # # #+end_src
+
+ #+begin_src emacs-lisp
+ (use-package helm :straight t)
+ #+end_src
+
+ For further information, see =straight.el='s user manual.
+
+ To upgrade =helm=, do {{{kbd(M-x straight-pull-package)}}} and restart
+ Emacs. =straight.el= will rebuild helm for you.
+
+*** Minimal setup using source
+
+ 1. Install the pre-requisites
+
+ Install =emacs-async=[fn:xxx1] and =popup-el=[fn:xxx2]. Ensure that they
+ are available in ~load-path~.
+
+ 2. Download, compile and install the sources
+
+ If you are using =git=,
+
+ #+begin_src sh
+ git clone https://github.com/emacs-helm/helm
+ cd helm
+ make
+ sudo make install
+ #+end_src
+
+ If you have a tarball[fn:xxx4], say for version =v3.7.1.tar.gz=,
+ then you can do
+
+ #+begin_src sh
+ wget https://github.com/emacs-helm/helm/archive/refs/tags/v3.7.1.tar.gz
+ tar zxvf v3.7.1.tar.gz
+ cd helm-3.7.1/
+ make
+ sudo make install
+ #+end_src
+
+ Above steps[fn:xxxx45]
+
+ - installs =helm= in =/usr/local/share/emacs/site-lisp/helm/=
+
+ - creates an executable called =/usr/local/bin/helm=. This file is in
+ fact a symbolic link to to the script =emacs-helm.sh=.
+
+ #+cindex: emacs-helm.sh
+
+ 3. Load =helm-config= during Emacs startup
+
+ Now, add one of the following to your init file, and restart Emacs.
+ These lines load =helm-autoloads.el=, and ensure that =helm= commands
+ are available for use after the restart.
+
+ #+begin_src emacs-lisp
+ (add-to-list 'load-path "/path/to/helm/directory")
+ (require 'helm-config)
+ #+end_src
+
+ or
+
+ #+begin_src emacs-lisp
+ (add-to-list 'load-path "/path/to/helm/directory")
+ (use-package helm :config (require 'helm-config))
+ #+end_src
+
+*** Minimal setup using the Package Manager
+
+ Helm is available on MELPA.[fn:xxx6]
+
+ Release version of Helm is available in the stable repository while
+ development version is available in it's sister repo.
+
+ Assuming that you have setup ~package-archives~ to include the MELPA,
+ you can install =Helm= with {{{kbd(M-x package-install RET helm
+ RET)}}}.
+
+ To upgrade =Helm=, use ~helm-list-elisp-packages~. This command is
+ the Helm equivalent of Emacs' =list-packages=. Using
+ ~helm-list-elisp-packages~, ensures that =helm= is compiled in a clean
+ environment.[fn:xxx7]
+
+ # Helm upgrades from MELPA encountered errors because of the way the
+ # Emacs package manager fetches and compiles updates for existing
+ # packages.
+
+ # To get around these errors, Helm has =emacs-async=[fn:xxx1] as a
+ # dependency. =emacs-async= forces compilation in a clean environment,
+ # which resolves the compilation errors.
+
+ # When some changes are made in Helm-core and those changes are used in
+ # Helm, package.el may install Helm before Helm-core which may create
+ # errors depending on changes on Helm-core e.g. New macro, renaming
+ # function or macro etc... In this case you will have a better time
+ # uninstalling all (Helm+Helm-core), restarting Emacs and reinstalling
+ # Helm. Installing from source doesn't suffer from this problem.
+
+ # *Note*: always restart Emacs after reinstalling Helm (or other
+ # packages) for updates to take effect.
+
+ # ** Upgrading
+
+ # The only thing you have to do is to upgrade from package manager.
+
+ # Helm comes with convenient interface to package.el, see
+ # ~helm-list-elisp-packages-no-fetch~ and ~helm-list-elisp-packages~.
+
+ # Use ~helm-list-elisp-packages~ to upgrade Helm. If you use
+ # ~list-packages~ to upgrade, you may run in to issues either at install
+ # time or run time.[fn:xxx8]
+
+ # * Upgrade or recompile
+
+ # ** Melpa
+
+ # *** Upgrade
+
+ # *** COMMENT Recompile
+
+ # To recompile Helm (or whatever packages), always recompile from a
+ # clean environment, that is from outside you current Emacs, for this
+ # use ~helm-list-elisp-packages-no-fetch~, go to installed packages with
+ # ~M-I~ and use the recompile package action, from Lisp you can use
+ # directly ~async-byte-recompile-directory~, if you installed from
+ # source use make. And then RESTART Emacs.
+
+ # ** Straight
+
+** Configuration
+
+Helm comes with a shell script called =emacs-helm.sh=. This script is
+a thin wrapper around =emacs -Q= with barest of Helm configuration.
+Use this script to reproduce and report Helm bugs.
+
+It is desirable that you put this script in your PATH for easy access.
+
+If you have installed =Helm= from Git or release tarball, no
+additional step is required. =emacs-helm.sh= is made available under
+=/usr/local/share/emacs/site-lisp/helm/=, and can be conveniently
+launched with the command =helm=.
+
+If you have used a package manager for installing =helm=, it is
+available in =~/.emacs.d/elpa/helm-<VERSION>/emacs-helm.sh=. Run the
+below shell command, to launch a minimal Helm.
+
+ #+begin_src sh
+ ln -s ~/src/helm/emacs-helm.sh ~/bin/helm
+ #+end_src
+
+ # =emacs-helm.sh= should also be used when
+ # [[https://github.com/emacs-helm/helm/wiki/Bugs][reporting bugs]].
+
+**** COMMENT Set up =emacs-helm.sh=
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+ # *Note*: For people using a non standard Elpa directory emacs-helm.sh may
+ # fail because it doesn't find its dependency (emacs-async), here's how
+ # you can do:
+
+ # #+begin_src sh
+ # cd /your/path/to/helm
+ # make # If not already done.
+ # EMACSLOADPATH="../emacs-async:" ./emacs-helm.sh
+ # #+end_src
+
+ # But normally =emacs-helm.sh= should work out of the box with
+ # installations of emacs-async= done with package.el, straight.el or from
+ # source with the Makefile.
+
+** Quick Try with =emacs-helm.sh=
+
+ #+begin_src emacs-lisp
+ ;; This Emacs is Powered by ‘HELM’ using
+ ;; emacs program "emacs".
+ ;; This is a minimal ‘helm’ configuration to discover ‘helm’ or debug it.
+ ;; You can retrieve this minimal configuration in "/tmp/helm-cfg.el".
+
+ ;; Some original Emacs commands are replaced by their ‘helm’ counterparts:
+
+ ;; - ‘find-file’(C-x C-f) =>‘helm-find-files’
+ ;; - ‘occur’(M-s o) =>‘helm-occur’
+ ;; - ‘list-buffers’(C-x C-b) =>‘helm-buffers-list’
+ ;; - ‘completion-at-point’(M-tab) =>‘helm-lisp-completion-at-point’[1]
+ ;; - ‘apropos-command’(C-h a) =>‘helm-apropos’
+ ;; - ‘dabbrev-expand’(M-/) =>‘helm-dabbrev’
+ ;; - ‘execute-extended-command’(M-x) =>‘helm-M-x’
+
+ ;; Some other Emacs commands are "helmized" by ‘helm-mode’.
+ ;; [1] Coming with emacs-24.4, ‘completion-at-point’ is "helmized" by ‘helm-mode’
+
+ ;; which provides Helm completion in many places like ‘shell-mode’.
+ ;; Find context help for most Helm commands with ‘C-h m’.
+
+ (require 'helm-config)
+ (helm-mode 1)
+ (define-key global-map [remap find-file] 'helm-find-files)
+ (define-key global-map [remap occur] 'helm-occur)
+ (define-key global-map [remap list-buffers] 'helm-buffers-list)
+ (define-key global-map [remap dabbrev-expand] 'helm-dabbrev)
+ (define-key global-map [remap execute-extended-command] 'helm-M-x)
+ (define-key global-map [remap apropos-command] 'helm-apropos)
+ (unless (boundp 'completion-in-region-function)
+ (define-key lisp-interaction-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point)
+ (define-key emacs-lisp-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point))
+ #+end_src
+
+ #+cindex: emacs-helm.sh
+
+ #+begin_src sh
+ ~/.emacs.d/elpa/helm-<VERSION>/emacs-helm.sh
+ #+end_src
+
+ #+CAPTION: A typical ~helm-M-x~ with =emacs-helm.sh=
+ #+ATTR_HTML: :width 800
+ #+ATTR_ORG: :width 800
+ [[./helm-figures/helm-M-x.png]]
+
+Invoke {{{kbd(M-x helm-M-x RET)}}} and type =helm= to discover Helm
+commands. The =Menu Bar -> Helm= menu item is another way to discover
+helm commands.
+
+** How to report Helm Bugs
+
+You can report Helm bug at https://github.com/emacs-helm/helm/issues.
+
+Before you report an issue, ensure that you can reproduce it issue
+with [[*Configuration][=emacs-helm.sh=]] script. Also, remember to
+report the version of Helm and your Emacs.
+
+If you cannot run the =emacs-helm.sh= script, be sure to reproduce the
+ problem with =emacs -Q=, then installing Helm as described in the
+ Install section.
+
+ # You can use the -h argument for help:
+
+ # : $ helm -h
+ # : Usage: helm [-P} Emacs path [-h} help [--] EMACS ARGS
+
+ # If your emacs binary is not in a standard place i.e. "emacs", you can
+ # specify the path with "-P".
+
+** Getting Help
+
+ - [[https://github.com/emacs-helm/helm][Helm on GitHub]]
+
+ - [[http://tuhdo.github.io/helm-intro.html][Tuhdo's Helm tutorial]]
+
+ - [[https://groups.google.com/g/emacs-helm][Helm mailing list]]
+
+ # gmane.emacs.helm.user
+ # news://news.gwene.org:119/gmane.emacs.helm.user
+
+ # - [[http://dir.gmane.org/gmane.emacs.helm.user][Helm Gmane]] (=gmane.emacs.helm.user=)
+
+** COMMENT Contributing to the Wiki
+
+ 1. Prefer using [[http://orgmode.org/][Org mode]] for Wiki pages.
+
+ 2. Install the [[https://github.com/snosov1/toc-org][toc-org]] package
+ to automatically generate tables of contents.
+
+ 3. Edit the Wiki.
+
+ 4. Before saving, run ~toc-org-insert-toc~.
+
+ - Consider adding something like the following to
+ ~before-save-hook~ to do this automatically:
+
+ #+begin_src emacs-lisp
+ (defun *-org-insert-toc ()
+ "Create table of contents (TOC) if current buffer is in
+ `org-mode'."
+ (when (= major-mode 'org-mode)
+ toc-org-insert-toc))
+ #+end_src
+
+** A word of advice for experienced Emacs Users
+
+*** Helm Completion v.s. Emacs Completion
+ :PROPERTIES:
+ :UNNUMBERED: notoc
+ :END:
+
+ Differences between the two often trip up new users.
+
+ Emacs completion is based on the *minibuffer*. Helm completion is
+ based on the *completion window*.[fn:xxx9] [fn:xxx10] [fn:xxx11]
+
+ In standard Emacs, interactivity happens in the /minibuffer/.
+
+ - Typing new characters filters candidates in the minibuffer.
+ {{{kbd(<tab>)}}} may try to complete the typed characters with a
+ valid candidate.
+
+ - Hitting {{{kbd(RET)}}} selects the current candidate from the minibuffer.
+
+ In Helm, interactivity happens in the /completion window/, not the
+ minibuffer
+
+ - Typing new characters filters candidates in the completion window.
+ Keep typing until the desired candidate is highlighted, or navigate
+ to it using {{{kbd(C-n)}}}.
+
+ - Hitting {{{kbd(RET)}}} selects the currently highlighted item in the
+ completion window.
+
+*** Helm interaction model
+ :PROPERTIES:
+ :UNNUMBERED: notoc
+ :END:
+
+ Helm's interactivity makes the {{{kbd(<tab>)}}} key redundant for
+ completion because the selection candidates are already made visible
+ in the Helm completion window. So, *tab completion is not
+ supported*. In Helm, {{{kbd(<tab>)}}} is used to view available
+ *actions* to be taken on a candidate.
+
+ Because the {{{kbd(<tab>)}}} key is so ingrained in the muscle memory of
+ long-time Emacs users, transition to Helm's interactive model
+ requires:
+
+ - A conscious visual adjustment to look at the completion window, and
+
+ - A conscious mental adjustment to avoid using the {{{kbd(<tab>)}}}
+ key for completion and go straight to {{{kbd(RET)}}} key to select a
+ candidate. Helm's approach to completion provides better visual
+ cues, takes fewer keystrokes, and is much faster.
+
+** COMMENT Not Now
+
+*** Configure
+
+ # For further configuration like changing bindings in the ~helm-map~ you
+ # will likely want to use a delayed method like ~with-eval-after-load~
+ # or =use-package= to avoid loading all of Helm at startup.
+
+ As example you can have a look at the maintainer helm config[fn:xxx8].
+
+ To setup specific variables from the helm session you are in, use
+ {{{kbd(C-h c)}}}.
+
+ To enable helm completion everywhere in Emacs add this to your init
+ file.
+
+ #+begin_src emacs-lisp
+ (helm-mode 1)
+ #+end_src
+
+*** General Helm Commands
+
+ Helm's functionality needs only a few general key bindings as shown
+ below. These are also documented in the mode line.
+
+ # Marking
+
+ # helm-mark-all
+ # helm-next-visible-mark
+ # helm-prev-visible-mark
+ # helm-toggle-all-marks
+ # helm-toggle-visible-mark
+ # helm-toggle-visible-mark-backward
+ #
+ # helm-unmark-all
+
+ # Action
+
+ # helm-execute-persistent-action
+ # helm-follow-action-backward
+ # helm-follow-action-forward
+ # helm-select-action
+
+ # - {{{kbd(C-c C-e)}}} (~org-export~) ::
+
+ - {{{kbd(<tab>)}}} or {{{kbd(C-i)}}} (~helm-select-action~) :: lists available actions
+
+ - {{{kbd(C-j)}}} or {{{kbd(C-z)}}} (~helm-execute-persistent-action~) :: invokes the persistent action
+
+ - {{{kbd(M-SPC)}}} (~helm-toggle-visible-mark-backward~) or {{{kbd(C-SPC)}}} (~helm-toggle-visible-mark-forward~) or {{{kbd(C-@)}}} (~helm-toggle-visible-mark~) :: marks a candidate
+
+ - {{{kbd(C-h m)}}} (~helm-help~) :: displays the embeded help in an org buffer without quitting
+ helm session.
+
+ - {{{kbd(RET)}}} :: runs the first action of action list
+
+*** Yanking text
+
+ Yank symbol at point from ~helm-current-buffer~ (i.e. buffer where a
+ helm command was invoked):
+
+ # {{{kbd(M-n)}}} copies symbol at point to minibuffer
+
+ # {{{kbd(C-w)}}} appends word next to point to the minibuffer and advance to next
+ # word, hitting {{{kbd(C-_)}}} undo last insertion and rewind yank point in
+ # ~helm-current-buffer~
+
+ - {{{kbd(C-w)}}} (~helm-yank-text-at-point~) :: Append word next to
+ point to the minibuffer and advance to next word
+
+ (helm-yank-text-at-point ARG)
+
+ Yank text at point in `helm-current-buffer' into minibuffer.
+
+ - {{{kbd(C-_)}}} (~helm-undo-yank-text-at-point~) :: Undo last
+ insertion and rewind yank point in ~helm-current-buffer~
+
+ Undo last entry added by `helm-yank-text-at-point'.
+
+*** Preconfigured Helm Commands
+
+ Invoke {{{kbd(M-x helm-M-x RET)}}} and type =helm= to discover Helm
+ commands. The =Menu Bar -> Helm= menu item is another way to discover
+ helm commands.
+
+ - ~helm-command-prefix-key~ ::
+
+ #+vindex: helm-command-prefix-key
+
+ *Standard Value*: "C-x c"
+
+ The key ‘helm-command-prefix’ is bound to in the global map.
+
+ - ~helm-minibuffer-history-key~ ::
+
+ #+vindex: helm-minibuffer-history-key
+
+ *Standard Value*: "C-r"
+
+ The key ‘helm-minibuffer-history’ is bound to in minibuffer local maps.
+
+ # #+vindex: helm-command-prefix-key
+ ~helm-command-prefix-key~ (default value {{{kbd(C-x c)}}}) is the
+ prefix for the preconfigured helm menu.
+
+ ~helm-command-prefix-key~ followed by any regular Emacs key invokes
+ the Helm version of the same command.
+
+ For example,
+
+ - {{{kbd(C-x c M-x)}}} runs the command ~helm-M-x~, which is the helm
+ version of {{{kbd(M-x)}}} (~execute-extended-command~).
+
+ - {{{kbd(C-x c C-x C-f)}}} runs the command ~helm-find-files~, which
+ is the helm version of {{{kbd(C-x C-f)}}} (~find-file~).
+
+ To run the helm version of a command with a key binding, but without
+ also typing {{{kbd(C-x c)}}}) (~helm-command-prefix-key~), add the
+ following to your init file.
+
+ #+begin_src emacs-lisp
+ (global-set-key (kbd "M-x") 'helm-M-x)
+ #+end_src
+
+*** Show Helm Commands
+
+ - {{{kbd(C-h m)}}} (~helm-help~) shows Helm commands and currently
+ active key bindings.
+
+ # * Browse Other Tools
+
+ # - Invoke {{{kbd(M-x)}}}, then type "helm" to browse other Helm tools.
+
+*** Helm Mode
+
+ # Toggle generic helm completion.
+
+ # If called interactively, toggle ‘Helm mode’. If the prefix
+ # argument is positive, enable the mode, and if it is zero or
+ # negative, disable the mode.
+
+ # If called from Lisp, toggle the mode if ARG is ‘toggle’. Enable
+ # the mode if ARG is nil, omitted, or is a positive number.
+ # Disable the mode if ARG is a negative number.
+
+ # The mode’s hook is called both when the mode is enabled and when
+ # it is disabled.
+
+ # All functions in Emacs that use ‘completing-read’,
+ # ‘read-file-name’, ‘completion-in-region’ and friends will use helm
+ # interface when this mode is turned on.
+
+ # However you can modify this behavior for functions of your choice
+ # with ‘helm-completing-read-handlers-alist’.
+
+ # Called with a positive arg, turn on unconditionally, with a
+ # negative arg turn off.
+ # You can toggle it with M-x ‘helm-mode’.
+
+ # About ‘ido-mode’:
+ # DO NOT enable ‘ido-everywhere’ when using ‘helm-mode’. Instead of
+ # using ‘ido-mode’, add the commands where you want to use ido to
+ # ‘helm-completing-read-handlers-alist’ with ‘ido’ as value.
+
+ ~helm-mode~ enables Helm completion globally for any Emacs command
+ using ~completing-read~ or ~read-file-name~.
+
+ ~helm-mode~ completes with ~completion-at-point~ and implements
+ ~completion-in-region-function~ for ~completing-read-multiple~ for
+ Emacs 24.4 and later.
+
+ Helm provides generic functions for completions to replace
+ tab-completion in Emacs with no loss of functionality. To use Helm's
+ generic functions, first set them in your init file, e.g.:
+
+ #+begin_src emacs-lisp
+ (global-set-key (kbd "M-x") #'helm-M-x)
+ (global-set-key (kbd "C-x r b") #'helm-filtered-bookmarks)
+ (global-set-key (kbd "C-x C-f") #'helm-find-files)
+ #+end_src
+
+ Then enable ~helm-mode~ with:
+
+ #+begin_src emacs-lisp
+ (helm-mode 1)
+ #+end_src
+
+ Or, enable ~helm-mode~ interactively with {{{kbd(M-x helm-mode)}}}.
+
+ - ~helm-mode~ ::
+
+ #+vindex: helm-mode
+
+ (helm-mode &optional ARG)
+
+ Toggle generic helm completion.
+
+ If called interactively, toggle `Helm mode'. If the prefix
+ argument is positive, enable the mode, and if it is zero or
+ negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is `toggle'. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+ All functions in Emacs that use `completing-read',
+ `read-file-name', `completion-in-region' and friends will use helm
+ interface when this mode is turned on.
+
+ However you can modify this behavior for functions of your choice
+ with `helm-completing-read-handlers-alist'.
+
+ Called with a positive arg, turn on unconditionally, with a
+ negative arg turn off.
+ You can toggle it with M-x `helm-mode'.
+
+ About `ido-mode':
+ DO NOT enable `ido-everywhere' when using `helm-mode'. Instead of
+ using `ido-mode', add the commands where you want to use ido to
+ `helm-completing-read-handlers-alist' with `ido' as value.
+
+ Note: This mode is incompatible with Emacs23.
+
+*** Customize helm-mode
+
+ - ~helm-completing-read-handlers-alist~ ::
+
+ #+vindex: helm-completing-read-handlers-alist
+
+ Completing read functions for specific Emacs commands.
+
+ By default ‘helm-mode’ use ‘helm-completing-read-default-handler’ to
+ provide helm completion in each ‘completing-read’ or ‘read-file-name’
+ found, but other functions can be specified here for specific
+ commands. This also allows disabling helm completion for some commands
+ when needed.
+
+ Each entry is a cons cell like (EMACS_COMMAND . COMPLETING-READ_HANDLER)
+ where key and value are symbols.
+
+ Each key is an Emacs command that use originaly ‘completing-read’.
+
+ Each value maybe a helm function that takes same arguments as
+ ‘completing-read’ plus NAME and BUFFER, where NAME is the name of the new
+ helm source and BUFFER the name of the buffer we will use, but it can
+ be also a function not using helm, in this case the function should
+ take the same args as ‘completing-read’ and not be prefixed by "helm-".
+
+ ‘helm’ will use the name of the command calling ‘completing-read’ as
+ NAME and BUFFER will be computed as well with NAME but prefixed with
+ "*helm-mode-".
+
+ This function prefix name must start by "helm-" when it uses helm,
+ otherwise ‘helm’ assumes the function is not a helm function and
+ expects the same args as ‘completing-read’, this allows you to define a
+ handler not using helm completion.
+
+ Example:
+
+ (defun foo/test ()
+ (interactive)
+ (message "%S" (completing-read "test: " ’(a b c d e))))
+
+ (defun helm-foo/test-completing-read-handler (prompt collection
+ predicate require-match
+ initial-input hist def
+ inherit-input-method
+ name buffer)
+ (helm-comp-read prompt collection :marked-candidates t
+ :name name
+ :buffer buffer))
+
+ (add-to-list ’helm-completing-read-handlers-alist
+ ’(foo/test . helm-foo/test-completing-read-handler))
+
+ We want here to make the regular ‘completing-read’ in ‘foo/test’
+ return a list of candidate(s) instead of a single candidate.
+
+ Note that this function will be reused for ALL the ‘completing-read’
+ of this command, so it should handle all cases. E.g.,
+ if first ‘completing-read’ completes against symbols and
+ second ‘completing-read’ should handle only buffer,
+ your specialized function should handle both.
+
+ If the value of an entry is nil completion will fall back to
+ Emacs vanilla behaviour.
+ Example:
+
+ If you want to disable helm completion for ‘describe-function’, use:
+
+ (describe-function . nil)
+
+ Ido is also supported, you can use ‘ido-completing-read’ and
+ ‘ido-read-file-name’ as value of an entry or just ’ido.
+ Example:
+ Enable ido completion for ‘find-file’:
+
+ (find-file . ido)
+
+ same as
+
+ (find-file . ido-read-file-name)
+
+ Note that you don’t need to enable ‘ido-mode’ for this to work, see
+ ‘helm-mode’ documentation.
+
+ # #+vindex: helm-completing-read-handlers-alist
+ To customize the completion interface or disable completion for
+ specific commands in ~helm-mode~, edit
+ ~helm-completing-read-handlers-alist~. See {{{kbd(C-h v)}}}
+ ~helm-completing-read-handlers-alist~ for details.
+
+**** Use helm-mode and ido-mode
+
+ To use
+ [[https://www.gnu.org/software/emacs/manual/html_mono/ido.html][Ido]]
+ for some commands and Helm for others, do not enable
+ ~ido-mode~. Instead, customize ~helm-completing-read-handlers-alist~
+ to specify which command uses Ido.
+
+ For example, suppose we want ~find-file-read-only~ to use Ido and
+ ~find-file~ to use Helm. Then:
+
+ 1. In your init file, turn on ~helm-mode~.
+
+ 2. In the ~helm-mode~ customize group, add a key to
+ ~helm-completing-read-handlers-alist~ for ~find-file-read-only~
+ with value =ido=, i.e.
+
+ #+begin_src emacs-lisp
+ (find-file-read-only . ido)
+ #+end_src
+
+ With ~helm-mode~ active, to use Emacs default completion instead of
+ either Helm or Ido, use ~nil~ for the key value:
+
+ #+begin_src emacs-lisp
+ (find-alternate-file . nil)
+ #+end_src
+
+*** Other Useful Extensions
+
+ MELPA and other repositories have many useful extensions, some of
+ which are redundant as Helm already provides them. Review if they
+ already exist as part of the default Helm package before downloading
+ new extensions.
+
+*** Helm With Other Emacs Extensions
+
+*** linum-relative
+
+ ~(helm-linum-relative-mode 1)~ enables ~linum-relative~ in Helm. Helm
+ buffers then display line numbered candidates before and after the
+ current candidate (highlighted line). {{{kbd(C-x <n>)}}} jumps to =n= lines
+ before, before, and {{{kbd(C-c <n>)}}} jumps to =n= lines after, the current
+ candidate.
+
+*** Helm Workflow for Files, Directories and Buffers
+
+ # The new Helm workflow uses fewer buffers. Whereas the old workflow
+ # opened many Dired buffers stacked in the workspace, the new approach
+ # uses virtual Dired buffers without cluttering the buffer list with
+ # many Dired buffers. The decluttering of buffers also helps with
+ # running ~helm-locate~ without conflicts; there's also less need to
+ # resort to other workarounds, such as running ~helm-multi-files~.
+
+ # The new approach uses ~helm-find-files~ as the starting point, never
+ # opens Dired buffers yet provides easy access to common Helm commands,
+ # such as =grep=, =locate=, =find=, etc. These Helm commands, moreover,
+ # are not limited to the current directory because Helm now allows
+ # marking files in other directories before running the commands.
+
+ Other quick jumping off features of ~helm-find-files~:
+
+ - {{{kbd(C-x C-d)}}} (~helm-browse-project~) shows buffers and files in the
+ project.
+
+ - {{{kbd(C-c C-d)}}} with prefix argument shows files in this directory and its
+ subdirectories recursively.
+
+ When using =helm-ls-git=[fn:xxx12] and =helm-ls-hg=[fn:xxx13] , files under
+ version control have a corresponding backend indicator.
+
+ - {{{kbd(C-x C-b)}}} to switch back to the resumed Helm sources.
+
+ - {{{kbd(M-p)}}} to access history of ~helm-find-files~
+
+ - {{{kbd(C-c h)}}} to access the full history of files (~file-name-history~)
+
+ - {{{kbd(C-x C-f)}}} switches back to ~helm-find-files~
+
+* Helm Generic Help
+
+** Basics
+
+# To navigate in this Help buffer see [[Helm help][here]].
+
+Helm narrows down the list of candidates as you type a filter
+pattern. See [[Matching in Helm][Matching in Helm]].
+
+Helm accepts multiple space-separated patterns, each pattern can
+be negated with =!=.
+
+Helm also supports fuzzy matching in some places when specified, you
+will find several variables to enable fuzzy matching in diverse [[Helm
+sources][sources]].
+
+Helm generally uses familiar Emacs keys to navigate the list.
+Here follow some of the less obvious bindings:
+
+- {{{kbd(RET)}}} selects the
+ candidate from the list, executes the default action upon exiting
+ the Helm session.
+
+- {{{kbd(C-j)}}} executes the
+ default action but without exiting the Helm session. Not all
+ sources support this.
+
+- {{{kbd(TAB)}}} displays a list of actions
+ available on current candidate or all marked candidates. The
+ default binding <tab> is ordinarily used for completion, but that
+ would be redundant since Helm completes upon every character
+ entered in the prompt.
+
+*Note*: In addition to the default actions list, additional actions
+appear depending on the type of the selected candidate(s). They
+are called filtered actions.
+
+*Additional Readings*:
+
+- Fuzzy Matching :: https://github.com/emacs-helm/helm/wiki/Fuzzy-matching
+- Helm Completion vs Emacs Completion :: https://github.com/emacs-helm/helm/wiki#helm-completion-vs-emacs-completion
+
+** Helm sources
+
+Helm uses what’s called sources to provide different kinds of
+completions. Each Helm session can handle one or more source. A
+source is an alist object which is build from various classes, see
+[[Writing your own Helm sources][here]].
+
+*Additional Readings*:
+
+- Creating a Helm source :: https://github.com/emacs-helm/helm/wiki/Developing#creating-a-source
+
+*** Configure sources
+
+You will find in Helm sources already built and bound to a
+variable called generally ~helm-source-<something>~. In this case
+it is an alist and you can change the attributes (keys) values
+using ~helm-set-attr~ function in your configuration. Of course
+you have to ensure before calling ~helm-set-attr~ that the file
+containing source is loaded, e.g. with ~with-eval-after-load~. Of
+course you can also completely redefine the source but this is
+generally not elegant as it duplicate for its most part code
+already defined in Helm.
+
+You will find also sources that are not built and even not bound
+to any variables because they are rebuilded at each start of a
+Helm session. In this case you can add a defmethod called
+~helm-setup-user-source~ to your config:
+
+#+begin_src elisp
+ (cl-defmethod helm-setup-user-source ((source helm-moccur-class))
+ (setf (slot-value source ’follow) -1))
+#+end_src
+
+*Additional Readings*:
+
+- Helm FAQ: Why is a customizable helm source nil :: https://github.com/emacs-helm/helm/wiki/FAQ#why-is-a-customizable-helm-source-nil
+- Complex Examples Of Configuration :: https://github.com/thierryvolpiatto/emacs-tv-config/blob/master/init-helm.el#L340
+
+** Modify keybindings in Helm
+
+Helm main keymap is ~helm-map~, all keys bound in this map apply
+to all Helm sources. However, most sources have their own keymap,
+with each binding overriding its counterpart in ~helm-map~, you
+can see all bindings in effect in the [[Commands][Commands]]
+section (available only if the source has its own keymap and
+documentation of course).
+
+** Matching in Helm
+
+All that you write in minibuffer is interpreted as a regexp or
+multiple regexps if separated by a space. This is true for most
+sources unless the developer of the source has disabled it or
+have choosen to use fuzzy matching. Even if a source has fuzzy
+matching enabled, Helm will switch to multi match as soon as it
+detects a space in the pattern. It may also switch to multi match
+as well if pattern starts with a =^= beginning of line sign. In
+those cases each pattern separated with space should be a regexp
+and not a fuzzy pattern. When using multi match patterns, each
+pattern starting with =!= is interpreted as a negation i.e.
+match everything but this.
+
+*** Completion-styles
+
+Helm generally fetches its candidates with the ~:candidates~
+function up to ~helm-candidate-number-limit~ and then applies
+match functions to these candidates according to ~helm-pattern~.
+But Helm allows matching candidates directly from the ~:candidates~
+function using its own ~completion-styles~.
+Helm provides ’helm completion style but also ’helm-flex
+completion style for Emacs<27 that don’t have ’flex completion
+style, otherwise (emacs-27) ’flex completion style is used to
+provide fuzzy aka flex completion.
+By default, like in Emacs vanilla, all completion commands (e.g.,
+~completion-at-point~) using ~completion-in-region~ or
+~completing-read~ use ~completion-styles~.
+Some Helm native commands like ~helm-M-x~ do use
+~completion-styles~. Any Helm sources can use ~completion-styles~
+by using ~:match-dynamic~ slot and building their ~:candidates~
+function with ~helm-dynamic-completion~.
+
+Example:
+
+#+begin_src elisp
+ (helm :sources (helm-build-sync-source "test"
+ :candidates (helm-dynamic-completion
+ ’(foo bar baz foab)
+ ’symbolp)
+ :match-dynamic t)
+ :buffer "*helm test*")
+
+#+end_src
+
+By default Helm sets up ~completion-styles~ and always adds ’helm
+to it. However the flex completion styles are not added. This is
+up to the user if she wants to have such completion to enable
+this.
+As specified above use ’flex for emacs-27 and ’helm-flex for
+emacs-26. Anyway, ’helm-flex is not provided in
+~completion-styles-alist~ if ’flex is present.
+
+Finally Helm provides two user variables to control
+~completion-styles~ usage: ~helm-completion-style~ and
+~helm-completion-syles-alist~. Both variables are customizable.
+The former allows retrieving previous Helm behavior if needed, by
+setting it to ~helm~ or ~helm-fuzzy~, default being ~emacs~ which
+allows dynamic completion and usage of ~completion-styles~. The
+second allows setting ~helm-completion-style~ per mode and also
+specifying ~completion-styles~ per mode (see its docstring). Note
+that these two variables take effect only in helm-mode i.e. in
+all that uses ~completion-read~ or ~completion-in-region~, IOW all
+helmized commands. File completion in ~read-file-name~ family
+doesn’t obey completion-styles and has its own file completion
+implementation. Native Helm commands using ~completion-styles~
+doesn’t obey ~helm-completion-style~ and
+~helm-completion-syles-alist~ (e.g., ~helm-M-x~).
+
+Also for a better control of styles in native Helm sources (not
+helmized by helm-mode) using ~:match-dynamic~,
+~helm-dynamic-completion~ provides a STYLES argument that allows
+specifying explicitely styles for this source.
+
+*Note*: Some old completion styles are not working fine with Helm
+and are disabled by default in
+~helm-blacklist-completion-styles~. They are anyway not useful in
+Helm because ’helm style supersedes these styles.
+
+** Helm mode
+
+~helm-mode~ toggles Helm completion in native Emacs functions, so
+when you turn ~helm-mode~ on, commands like ~switch-to-buffer~
+will use Helm completion instead of the usual Emacs completion
+buffer.
+
+*** What gets or does not get =helmized= when ~helm-mode~ is enabled?
+
+Helm provides generic completion on all Emacs functions using
+~completing-read~, ~completion-in-region~ and their derivatives,
+e.g. ~read-file-name~. Helm exposes a user variable to control
+which function to use for a specific Emacs command:
+~helm-completing-read-handlers-alist~. If the function for a
+specific command is nil, it turns off Helm completion. See the
+variable documentation for more infos.
+
+*** Helm functions vs helmized Emacs functions
+
+While there are Helm functions that perform the same completion
+as other helmized Emacs functions, e.g. ~switch-to-buffer~ and
+~helm-buffers-list~, the native Helm functions like
+~helm-buffers-list~ can receive new features that allow marking
+candidates, have several actions, etc. Whereas the helmized Emacs
+functions only have Helm completion, Emacs can provide no more
+than one action for this function. This is the intended behavior.
+
+Generally you are better off using the native Helm command than
+the helmized Emacs equivalent.
+
+*** Completion behavior with Helm and completion-at-point
+
+Helm is NOT completing dynamically. That means that when you are
+completing some text at point, completion is done against this
+text and subsequent characters you add AFTER this text. This
+allows you to use matching methods provided by Helm, that is multi
+matching or fuzzy matching (see [[Matching in Helm][Matching in
+Helm]]).
+
+Completion is not done dynamically (against ~helm-pattern~)
+because backend functions (i.e. ~competion-at-point-functions~)
+are not aware of Helm matching methods.
+
+By behaving like this, the benefit is that you can fully use Helm
+matching methods but you can’t start a full completion against a
+prefix different than the initial text you have at point. Helm
+warns you against this by colorizing the initial input and sends
+a user-error message when trying to delete backward text beyond
+this limit at first hit on DEL. A second hit on DEL within a
+short delay (1s) quits Helm and delete-backward char in
+current-buffer.
+
+** Helm help
+
+{{{kbd(C-x c h h)}}}: Show all Helm documentations concatenated
+in one org file.
+
+From a Helm session, just hit {{{kbd(C-h m)}}} to have
+the documentation for the current source followed by the global
+Helm documentation.
+
+While in the help buffer, most of the Emacs regular key bindings
+are available; the most important ones are shown in minibuffer.
+However, due to implementation restrictions, no regular Emacs
+keymap is used (it runs in a loop when reading the help buffer).
+Only simple bindings are available and they are defined in
+~helm-help-hkmap~, which is a simple alist of (key . function).
+You can define or redefine bindings in help with
+~helm-help-define-key~ or by adding/removing entries directly in
+~helm-help-hkmap~.
+See ~helm-help-hkmap~ for restrictions on bindings and functions.
+
+The documentation of default bindings are:
+
+| Key | Alternative keys | Command |
+|-----------+------------------+---------------------|
+| C-v | Space next | Scroll up |
+| M-v | b prior | Scroll down |
+| C-s | | Isearch forward |
+| C-r | | Isearch backward |
+| C-a | | Beginning of line |
+| C-e | | End of line |
+| C-f | right | Forward char |
+| C-b | left | Backward char |
+| C-n | down | Next line |
+| C-p | up | Previous line |
+| M-a | | Backward sentence |
+| M-e | | Forward sentence |
+| M-f | | Forward word |
+| M-b | | Backward word |
+| M-> | | End of buffer |
+| M-< | | Beginning of buffer |
+| C-<SPACE> | | Toggle mark |
+| C-M-SPACE | | Mark sexp |
+| RET | | Follow org link |
+| C-% | | Push org mark |
+| C-& | | Goto org mark-ring |
+| TAB | | Org cycle |
+| M-<TAB> | | Toggle visibility |
+| M-w | | Copy region |
+| q | | Quit |
+
+** Customize Helm
+
+Helm provides a lot of user variables for extensive customization.
+From any Helm session, type {{{kbd(C-h c)}}}
+to jump to the current source ~custom~ group. Helm also has a
+special group for faces you can access via {{{kbd(M-x customize-group RET helm-faces)}}}.
+
+*Note*: Some sources may not have their group set and default to
+the ~helm~ group.
+
+** Display Helm in windows and frames
+
+You can display the Helm completion buffer in many different
+window configurations, see the custom interface to discover the
+different windows configurations available (See [[Customize Helm][Customize Helm]] to jump to custom interface).
+When using Emacs in a graphic display (i.e. not in a terminal) you can as
+well display your Helm buffers in separated frames globally for
+all Helm commands or separately for specific Helm commands.
+See ~helm-display-function~ and ~helm-commands-using-frame~.
+
+There is a variable to allow reusing frame instead of deleting
+and creating a new one at each session, see ~helm-display-buffer-reuse-frame~.
+Normally you don’t have to use this, it have been made to workaround
+slow frame popup in Emacs-26, to workaround this slowness in Emacs-26 use instead
+
+#+begin_src elisp
+ (when (= emacs-major-version 26)
+ (setq x-wait-for-event-timeout nil))
+#+end_src
+
+*Additional Readings*:
+
+- https://github.com/emacs-helm/helm/wiki/frame
+
+*Warning*:
+There is a package called posframe and also one called helm-posframe,
+you DO NOT need these packages to display helm buffers in frames.
+
+** Helm’s basic operations and default key bindings
+
+| Key | Alternative Keys | Command |
+|-------------+------------------+----------------------------------------------------------------------|
+| C-p | Up | Previous line |
+| C-n | Down | Next line |
+| M-v | prior | Previous page |
+| C-v | next | Next page |
+| Enter[fn:1] | | Execute first (default) action / Select [1] |
+| M-< | | First line |
+| M-> | | Last line |
+| C-M-S-v | M-prior, C-M-y | Previous page (other-window) |
+| C-M-v | M-next | Next page (other-window) |
+| Tab | C-i | Show action list |
+| M-o | left | Previous source |
+| C-o | right | Next source |
+| C-k[fn:2] | | Delete pattern (with prefix arg delete from point to end or all [2]) |
+| C-j | | Persistent action (Execute and keep Helm session) |
+
+*Note*: Any of these bindings are from ~helm-map~ and may be
+overriten by the map specific to the current source in use (each
+source can have its own keymap).
+
+** The actions menu
+
+You can display the action menu in the same window
+as helm candidates (default) or in a side window according to
+~helm-show-action-window-other-window~ value.
+
+When the action menu popup, the helm prompt is used to narrow
+down this menu, no more candidates.
+
+When ~helm-allow-mouse~ is non nil, you can use as well
+mouse-3 (right click) in the candidate zone to select actions
+with the mouse once your candidate is selected.
+
+** Action transformers
+
+You may be surprized to see your actions list changing depending
+on the context. This happen when a source has an action
+transformer function which checks the current selected candidate
+and adds specific actions for this candidate.
+
+** Shortcuts for n-th first actions
+
+{{{kbd(<f1>)}}}...{{{kbd(<f12>)}}}: Execute n-th action where n is 1 to 12.
+
+** Shortcuts for executing the default action on the n-th candidate
+
+Helm does not display line numbers by default, with Emacs-26+ you
+can enable it permanently in all helm buffers with:
+
+ #+begin_src elisp
+ (add-hook ’helm-after-initialize-hook ’helm-init-relative-display-line-numbers)
+ #+end_src
+
+You can also toggle line numbers with
+{{{kbd(C-c l)}}} in current Helm
+buffer.
+
+Of course when enabling ~global-display-line-numbers-mode~ Helm
+buffers will have line numbers as well. (Don’t forget to
+customize ~display-line-numbers-type~ to relative).
+
+In Emacs versions < to 26 you will have to use linum-relative[fn:3]
+package and ~helm-linum-relative-mode~.
+
+Then when line numbers are enabled with one of the methods above
+the following keys are available[fn:4]:
+
+{{{kbd(C-x <n>)}}}: Execute default action on the n-th candidate before
+currently selected candidate.
+
+{{{kbd(C-c <n>)}}}: Execute default action on the n-th candidate after
+current selected candidate.
+
+=n= is limited to 1-9. For larger jumps use other navigation
+keys.
+
+** Mouse control in Helm
+
+A basic support for the mouse is provided when the user sets
+~helm-allow-mouse~ to non-nil.
+
+- mouse-1 selects the candidate.
+- mouse-2 executes the default action on selected candidate.
+- mouse-3 pops up the action menu.
+
+*Note*: When mouse control is enabled in Helm, it also lets you
+click around and lose the minibuffer focus: you’ll have to click
+on the Helm buffer or the minibuffer to retrieve control of your
+Helm session.
+
+** Marked candidates
+
+You can mark candidates to execute an action on all of them
+instead of the current selected candidate only. (See bindings
+below.) Most Helm actions operate on marked candidates unless
+candidate-marking is explicitely forbidden for a specific source.
+
+- To mark/unmark a candidate, use
+ {{{kbd(C-@)}}}. (See bindings below.) With a
+ numeric prefix arg mark ARG candidates forward, if ARG is
+ negative mark ARG candidates backward.
+
+- To mark all visible unmarked candidates at once in current
+ source use {{{kbd(M-a)}}}. With a prefix argument, mark all
+ candidates in all sources.
+
+- To unmark all visible marked candidates at once use
+ {{{kbd(M-U)}}}.
+
+- To mark/unmark all candidates at once use
+ {{{kbd(M-m)}}}. With a prefix argument, mark/unmark
+ all candidates in all sources.
+
+*Note*: When multiple candidates are selected across different
+sources, only the candidates of the current source will be used
+when executing most actions (as different sources can have
+different actions). Some actions support multi-source marking
+however.
+
+** Follow candidates
+
+When ~helm-follow-mode~ is on ({{{kbd(C-c C-f)}}}
+to toggle it), moving up and down Helm session or updating the
+list of candidates will automatically execute the
+persistent-action as specified for the current source.
+
+If ~helm-follow-mode-persistent~ is non-nil, the state of the
+mode will be restored for the following Helm sessions.
+
+If you just want to follow candidates occasionally without
+enabling ~helm-follow-mode~, you can use
+{{{kbd(C-<down>)}}} or
+{{{kbd(C-<up>)}}} instead. Conversely, when
+~helm-follow-mode~ is enabled, those commands go to previous/next
+line without executing the persistent action.
+
+** Frequently Used Commands
+
+| Keys | Description |
+|----------+-----------------------------------------------------------------------------------|
+| C-t | Toggle vertical/horizontal split on first hit and swap Helm window on second hit. |
+| C-c % | Exchange minibuffer and header-line. |
+| C-x C-f | Drop into ‘helm-find-files’. |
+| C-c C-k | Kill display value of candidate and quit (with prefix arg, kill the real value). |
+| C-c C-y | Yank current selection into pattern. |
+| C-c TAB | Copy selected candidate at point in current buffer. |
+| C-c C-f | Toggle automatic execution of persistent action. |
+| C-<down> | Run persistent action then select next line. |
+| C-<up> | Run persistent action then select previous line. |
+| C-c C-u | Recalculate and redisplay candidates. |
+| C-! | Toggle candidate updates. |
+
+** Special yes, no or yes for all answers
+
+You may be prompted in the minibuffer to answer by [y,n,!,q] in
+some places for confirmation.
+
+- y mean yes
+- no mean no
+- ! mean yes for all
+- q mean quit or abort current operation.
+
+When using ! you will not be prompted for the same thing in
+current operation any more, e.g. file deletion, file copy etc...
+
+** Moving in ~helm-buffer~
+
+You can move in ~helm-buffer~ with the usual commands used in
+Emacs: ({{{kbd(C-n)}}},
+{{{kbd(C-p)}}}, etc. See above basic
+commands. When ~helm-buffer~ contains more than one source,
+change source with {{{kbd(C-o)}}} and
+{{{kbd(M-o)}}}.
+
+*Note*: When reaching the end of a source,
+{{{kbd(C-n)}}} will *not* go to the next source
+when variable ~helm-move-to-line-cycle-in-source~ is non-nil, so
+you will have to use {{{kbd(C-o)}}} and
+{{{kbd(M-o)}}}.
+
+** Resume previous session from current Helm session
+
+You can use {{{kbd(C-c n)}}} (~helm-run-cycle-resume~) to cycle in
+resumables sources. {{{kbd(C-c n)}}} is a special key set with
+~helm-define-key-with-subkeys~ which, after pressing it, allows
+you to keep cycling with further {{{kbd(n)}}}.
+
+*Tip*: You can bound the same key in ~global-map~ to
+ ~helm-cycle-resume~ with ~helm-define-key-with-subkeys~ to
+ let you transparently cycle sessions, Helm fired up or not.
+ You can also bind the cycling commands to single key
+ presses (e.g., {{{kbd(S-<f1>)}}}) this time with a simple
+ ~define-key~. (Note that {{{kbd(S-<f1>)}}} is not available in
+ terminals.)
+
+*Note*: ~helm-define-key-with-subkeys~ is available only once Helm
+is loaded.
+
+You can also use
+{{{kbd(C-x b)}}} to resume
+the previous session, or
+{{{kbd(C-x C-b)}}} to have
+completion on all resumable buffers.
+
+** Global commands
+
+*** Resume Helm session from outside Helm
+
+{{{kbd(C-x c b)}}} revives the last Helm session.
+Binding a key to this command will greatly improve Helm
+interactivity, e.g. when quitting Helm accidentally.
+
+You can call {{{kbd(C-x c b)}}} with a prefix argument
+to choose (with completion!) which session you’d like to resume.
+You can also cycle in these sources with ~helm-cycle-resume~ (see
+above).
+
+** Debugging Helm
+
+Helm exposes the special variable ~helm-debug~: setting it to
+non-nil will enable Helm logging in a special outline-mode
+buffer. Helm resets the variable to nil at the end of each
+session.
+
+For convenience, {{{kbd(C-h C-d)}}}
+allows you to turn on debugging for this session only. To avoid
+accumulating log entries while you are typing patterns, you can
+use {{{kbd(C-!)}}} to turn off
+updating. When you are ready turn it on again to resume logging.
+
+Once you exit your Helm session you can access the debug buffer
+with ~helm-debug-open-last-log~. It is possible to save logs to
+dated files when ~helm-debug-root-directory~ is set to a valid
+directory.
+
+*Note*: Be aware that Helm log buffers grow really fast, so use
+~helm-debug~ only when needed.
+
+** Writing your own Helm sources
+
+Writing simple sources for your own usage is easy. When calling
+the ~helm~ function, the sources are added the ~:sources~ slot
+which can be a symbol or a list of sources. Sources can be built
+with different EIEIO classes depending on what you want to do. To
+simplify this, several ~helm-build-*~ macros are provided. Below
+there are simple examples to start with.
+
+#+begin_src elisp
+ ;; Candidates are stored in a list.
+ (helm :sources (helm-build-sync-source "test"
+ ;; A function can be used as well
+ ;; to provide candidates.
+ :candidates ’("foo" "bar" "baz"))
+ :buffer "*helm test*")
+
+ ;; Candidates are stored in a buffer.
+ ;; Generally faster but doesn’t allow a dynamic updating
+ ;; of the candidates list i.e the list is fixed on start.
+ (helm :sources (helm-build-in-buffer-source "test"
+ :data ’("foo" "bar" "baz"))
+ :buffer "*helm test*")
+#+end_src
+
+*Additional Readings*:
+
+- For source code and complex examples :: https://github.com/emacs-helm/helm/wiki/Developing
+
+** Helm Map
+
+| *Key* | *Binding* | *Comments* |
+|---------------+------------------------------------------+--------------------------------------|
+| C-@ | helm-toggle-visible-mark | |
+| C-c | Prefix Command | |
+| C-g | helm-keyboard-quit | |
+| C-h | Prefix Command | |
+| TAB | helm-select-action | |
+| C-j | helm-execute-persistent-action | |
+| C-k | helm-delete-minibuffer-contents | |
+| C-l | helm-recenter-top-bottom-other-window | |
+| RET | helm-maybe-exit-minibuffer | |
+| C-n | helm-next-line | |
+| C-o | helm-next-source | |
+| C-p | helm-previous-line | |
+| C-t | helm-toggle-resplit-and-swap-windows | |
+| C-v | helm-next-page | |
+| C-w | ?? | |
+| C-x | Prefix Command | |
+| ESC | Prefix Command | |
+| C-SPC | helm-toggle-visible-mark-forward | |
+| C-! | helm-toggle-suspend-update | |
+| C-{ | helm-enlarge-window | |
+| C-} | helm-narrow-window | |
+| C-M-<down> | helm-scroll-other-window | |
+| C-M-<up> | helm-scroll-other-window-down | |
+| C-<down> | helm-follow-action-forward | |
+| C-<up> | helm-follow-action-backward | |
+| M-<next> | helm-scroll-other-window | |
+| M-<prior> | helm-scroll-other-window-down | |
+| <XF86Back> | previous-history-element | |
+| <XF86Forward> | next-history-element | |
+| <down> | helm-next-line | |
+| <f1> | ?? | |
+| <f2> | ?? | |
+| <f3> | ?? | |
+| <f4> | ?? | |
+| <f5> | ?? | |
+| <f6> | ?? | |
+| <f7> | ?? | |
+| <f8> | ?? | |
+| <f9> | ?? | |
+| <f10> | ?? | |
+| <f11> | ?? | |
+| <f12> | ?? | |
+| <f13> | ?? | |
+| <help> | Prefix Command | |
+| <left> | helm-previous-source | |
+| <next> | helm-next-page | |
+| <prior> | helm-previous-page | |
+| <right> | helm-next-source | |
+| <tab> | helm-execute-persistent-action | |
+| <up> | helm-previous-line | |
+| | | |
+| <help> m | helm-help | |
+| | | |
+| C-h C-d | helm-enable-or-switch-to-debug | |
+| C-h c | helm-customize-group | |
+| C-h m | helm-help | |
+| | | |
+| C-c C-f | helm-follow-mode | |
+| C-c TAB | helm-copy-to-buffer | |
+| C-c C-k | helm-kill-selection-and-quit | |
+| C-c C-u | helm-refresh | |
+| C-c C-y | helm-yank-selection | |
+| C-c % | helm-exchange-minibuffer-and-header-line | |
+| C-c - | helm-swap-windows | |
+| C-c 1 | helm-execute-selection-action-at-nth-+1 | |
+| C-c 2 | helm-execute-selection-action-at-nth-+2 | |
+| C-c 3 | helm-execute-selection-action-at-nth-+3 | |
+| C-c 4 | helm-execute-selection-action-at-nth-+4 | |
+| C-c 5 | helm-execute-selection-action-at-nth-+5 | |
+| C-c 6 | helm-execute-selection-action-at-nth-+6 | |
+| C-c 7 | helm-execute-selection-action-at-nth-+7 | |
+| C-c 8 | helm-execute-selection-action-at-nth-+8 | |
+| C-c 9 | helm-execute-selection-action-at-nth-+9 | |
+| C-c > | helm-toggle-truncate-line | |
+| C-c ? | helm-help | |
+| C-c _ | helm-toggle-full-frame | |
+| C-c l | helm-display-line-numbers-mode | |
+| C-c n | ?? | |
+| | | |
+| C-x C-b | helm-resume-list-buffers-after-quit | |
+| C-x C-f | helm-quit-and-find-file | |
+| C-x 1 | helm-execute-selection-action-at-nth-+1 | |
+| C-x 2 | helm-execute-selection-action-at-nth-+2 | |
+| C-x 3 | helm-execute-selection-action-at-nth-+3 | |
+| C-x 4 | helm-execute-selection-action-at-nth-+4 | |
+| C-x 5 | helm-execute-selection-action-at-nth-+5 | |
+| C-x 6 | helm-execute-selection-action-at-nth-+6 | |
+| C-x 7 | helm-execute-selection-action-at-nth-+7 | |
+| C-x 8 | helm-execute-selection-action-at-nth-+8 | |
+| C-x 9 | helm-execute-selection-action-at-nth-+9 | |
+| C-x b | helm-resume-previous-session-after-quit | |
+| | | |
+| C-M-a | helm-show-all-candidates-in-source | |
+| C-M-e | helm-display-all-sources | |
+| C-M-l | helm-reposition-window-other-window | |
+| C-M-v | helm-scroll-other-window | |
+| C-M-y | helm-scroll-other-window-down | |
+| M-SPC | helm-toggle-visible-mark-backward | |
+| M-( | helm-prev-visible-mark | |
+| M-) | helm-next-visible-mark | |
+| M-< | helm-beginning-of-buffer | |
+| M-> | helm-end-of-buffer | |
+| M-U | helm-unmark-all | |
+| M-a | helm-mark-all | |
+| M-g | Prefix Command | |
+| M-m | helm-toggle-all-marks | |
+| M-n | next-history-element | |
+| M-o | helm-previous-source | |
+| M-p | previous-history-element | |
+| M-v | helm-previous-page | |
+| C-M-S-v | helm-scroll-other-window-down | |
+| | | |
+| M-g ESC | Prefix Command | |
+| | | |
+| M-< | minibuffer-beginning-of-buffer | (this binding is currently shadowed) |
+| M-g | Prefix Command | |
+| M-r | previous-matching-history-element | |
+| M-s | next-matching-history-element | (this binding is currently shadowed) |
+| | | |
+| M-g ESC | Prefix Command | |
+| | | |
+| M-g M-c | helm-comint-input-ring | |
+| | | |
+| M-g M-h | helm-minibuffer-history | |
+
+* Package: helm
+
+** Library: helm
+
+*** Modes in library ~helm~
+
+**** other-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-major-mode~ ::
+
+ #+findex: helm-major-mode
+
+ [INTERNAL] Provide major-mode name in Helm buffers.
+ Unuseful when used outside Helm, don't use it.
+
+ This mode runs the hook ~helm-major-mode-hook~, as the final or
+ penultimate step during initialization.
+
+ \{helm-major-mode-map}
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm--minor-mode~ ::
+
+ #+findex: helm--minor-mode
+
+ (helm--minor-mode &optional ARG)
+
+ [INTERNAL] Enable keymap in Helm minibuffer.
+ Since this mode has no effect when run outside of Helm context,
+ please don't use it outside of Helm.
+
+ If called interactively, toggle ~Helm- minor mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+ \{helm-map}
+
+- ~helm--remap-mouse-mode~ ::
+
+ #+findex: helm--remap-mouse-mode
+
+ (helm--remap-mouse-mode &optional ARG)
+
+ [INTERNAL] Prevent escaping helm minibuffer with mouse clicks.
+ Do nothing when used outside of helm context.
+
+ If called interactively, toggle ~Helm--Remap-Mouse mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+ WARNING: Do not use this mode yourself, it is internal to Helm.
+
+- ~helm-autoresize-mode~ ::
+
+ #+findex: helm-autoresize-mode
+
+ (helm-autoresize-mode &optional ARG)
+
+ Auto resize helm window when enabled.
+ Helm window is re-sized according to ~helm-autoresize-max-height~
+ and ~helm-autoresize-min-height~. Note that when this mode is
+ enabled, Helm behaves as if ~helm-always-two-windows~ is enabled.
+
+ If called interactively, toggle ~Helm-Autoresize mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+ See ~fit-window-to-buffer~ for more infos.
+
+*** Commands in keymap ~helm-map~
+
+**** Most Important
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-g)}}} (~helm-keyboard-quit~) ::
+
+ #+findex: helm-keyboard-quit @r{(helm-map)}
+
+ #+kindex: C-g @r{(helm-map)}
+
+ Quit minibuffer in helm.
+ If action buffer is displayed, kill it.
+
+- {{{kbd(RET)}}} (~helm-maybe-exit-minibuffer~) ::
+
+ #+findex: helm-maybe-exit-minibuffer @r{(helm-map)}
+
+ #+kindex: RET @r{(helm-map)}
+
+- {{{kbd(C-j)}}} (~helm-execute-persistent-action~) ::
+
+ #+findex: helm-execute-persistent-action @r{(helm-map)}
+
+ #+kindex: C-j @r{(helm-map)}
+
+ (helm-execute-persistent-action &optional ATTR SPLIT)
+
+ Perform the associated action ATTR without quitting helm.
+
+ Arg ATTR default will be ~persistent-action~ or
+ ~persistent-action-if~ if unspecified depending on what's found
+ in source, but it can be anything else.
+ In this case you have to add this new attribute to your source.
+ See ~persistent-action~ and ~persistent-action-if~ slot
+ documentation in ~helm-source~.
+
+ When ~helm-full-frame~ is non-nil, and ~helm-buffer~ is displayed
+ in only one window, the helm window is split to display
+ ~helm-select-persistent-action-window~ in other window to
+ maintain visibility. The argument SPLIT can be used to force
+ splitting inconditionally, it is unused actually.
+
+- {{{kbd(TAB)}}} (~helm-select-action~) ::
+
+ #+findex: helm-select-action @r{(helm-map)}
+
+ #+kindex: TAB @r{(helm-map)}
+
+ Select an action for the currently selected candidate.
+ If action buffer is selected, back to the Helm buffer.
+
+- {{{kbd(C-x 1)}}} (~helm-execute-selection-action-at-nth-+1~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+1 @r{(helm-map)}
+
+ #+kindex: C-x 1 @r{(helm-map)}
+
+- {{{kbd(C-c 1)}}} (~helm-execute-selection-action-at-nth-+1~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+1 @r{(helm-map)}
+
+ #+kindex: C-c 1 @r{(helm-map)}
+
+- {{{kbd(C-x 2)}}} (~helm-execute-selection-action-at-nth-+2~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+2 @r{(helm-map)}
+
+ #+kindex: C-x 2 @r{(helm-map)}
+
+- {{{kbd(C-c 2)}}} (~helm-execute-selection-action-at-nth-+2~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+2 @r{(helm-map)}
+
+ #+kindex: C-c 2 @r{(helm-map)}
+
+- {{{kbd(C-x 3)}}} (~helm-execute-selection-action-at-nth-+3~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+3 @r{(helm-map)}
+
+ #+kindex: C-x 3 @r{(helm-map)}
+
+- {{{kbd(C-c 3)}}} (~helm-execute-selection-action-at-nth-+3~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+3 @r{(helm-map)}
+
+ #+kindex: C-c 3 @r{(helm-map)}
+
+- {{{kbd(C-x 4)}}} (~helm-execute-selection-action-at-nth-+4~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+4 @r{(helm-map)}
+
+ #+kindex: C-x 4 @r{(helm-map)}
+
+- {{{kbd(C-c 4)}}} (~helm-execute-selection-action-at-nth-+4~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+4 @r{(helm-map)}
+
+ #+kindex: C-c 4 @r{(helm-map)}
+
+- {{{kbd(C-x 5)}}} (~helm-execute-selection-action-at-nth-+5~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+5 @r{(helm-map)}
+
+ #+kindex: C-x 5 @r{(helm-map)}
+
+- {{{kbd(C-c 5)}}} (~helm-execute-selection-action-at-nth-+5~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+5 @r{(helm-map)}
+
+ #+kindex: C-c 5 @r{(helm-map)}
+
+- {{{kbd(C-x 6)}}} (~helm-execute-selection-action-at-nth-+6~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+6 @r{(helm-map)}
+
+ #+kindex: C-x 6 @r{(helm-map)}
+
+- {{{kbd(C-c 6)}}} (~helm-execute-selection-action-at-nth-+6~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+6 @r{(helm-map)}
+
+ #+kindex: C-c 6 @r{(helm-map)}
+
+- {{{kbd(C-x 7)}}} (~helm-execute-selection-action-at-nth-+7~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+7 @r{(helm-map)}
+
+ #+kindex: C-x 7 @r{(helm-map)}
+
+- {{{kbd(C-c 7)}}} (~helm-execute-selection-action-at-nth-+7~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+7 @r{(helm-map)}
+
+ #+kindex: C-c 7 @r{(helm-map)}
+
+- {{{kbd(C-x 8)}}} (~helm-execute-selection-action-at-nth-+8~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+8 @r{(helm-map)}
+
+ #+kindex: C-x 8 @r{(helm-map)}
+
+- {{{kbd(C-c 8)}}} (~helm-execute-selection-action-at-nth-+8~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+8 @r{(helm-map)}
+
+ #+kindex: C-c 8 @r{(helm-map)}
+
+- {{{kbd(C-x 9)}}} (~helm-execute-selection-action-at-nth-+9~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+9 @r{(helm-map)}
+
+ #+kindex: C-x 9 @r{(helm-map)}
+
+- {{{kbd(C-c 9)}}} (~helm-execute-selection-action-at-nth-+9~) ::
+
+ #+findex: helm-execute-selection-action-at-nth-+9 @r{(helm-map)}
+
+ #+kindex: C-c 9 @r{(helm-map)}
+
+- {{{kbd(C-<tab>)}}} ::
+- {{{kbd(C-s)}}} ::
+- {{{kbd(C-h h)}}} ::
+- {{{kbd(C-h C-h)}}} ::
+- {{{kbd(M-s)}}} (~undefined~) ::
+
+ #+findex: undefined @r{(helm-map)}
+
+ #+kindex: C-<tab> @r{(helm-map)}
+ #+kindex: C-s @r{(helm-map)}
+ #+kindex: C-h h @r{(helm-map)}
+ #+kindex: C-h C-h @r{(helm-map)}
+ #+kindex: M-s @r{(helm-map)}
+
+ Beep to tell the user this binding is undefined.
+
+- {{{kbd(C-k)}}} (~helm-delete-minibuffer-contents~) ::
+
+ #+findex: helm-delete-minibuffer-contents @r{(helm-map)}
+
+ #+kindex: C-k @r{(helm-map)}
+
+ (helm-delete-minibuffer-contents &optional ARG)
+
+ Delete minibuffer contents.
+ When ~helm-delete-minibuffer-contents-from-point~ is non-nil,
+ delete minibuffer contents from point instead of deleting all.
+ With a prefix arg reverse this behaviour. When at the end of
+ minibuffer, delete all.
+
+- {{{kbd(<help> m)}}} ::
+- {{{kbd(C-h m)}}} ::
+- {{{kbd(C-c ?)}}} (~helm-help~) ::
+
+ #+findex: helm-help @r{(helm-map)}
+
+ #+kindex: <help> m @r{(helm-map)}
+ #+kindex: C-h m @r{(helm-map)}
+ #+kindex: C-c ? @r{(helm-map)}
+
+ Generate Helm's help according to ~help-message~ attribute.
+
+ If ~helm-buffer~ is empty, provide completions on ~helm-sources~
+ to choose its local documentation.
+ If source doesn't have any ~help-message~ attribute, a generic
+ message explaining this is added instead.
+ The global ~helm-help-message~ is always added after this local
+ help.
+
+- {{{kbd(C-h c)}}} (~helm-customize-group~) ::
+
+ #+findex: helm-customize-group @r{(helm-map)}
+
+ #+kindex: C-h c @r{(helm-map)}
+
+ Jump to customization group of current source.
+
+ Default to Helm group when group is not defined in source.
+
+**** Minor Modes
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c l)}}} (~helm-display-line-numbers-mode~) ::
+
+ #+findex: helm-display-line-numbers-mode @r{(helm-map)}
+
+ #+kindex: C-c l @r{(helm-map)}
+
+ (helm-display-line-numbers-mode &optional ARG)
+
+ Toggle display of line numbers in current Helm buffer.
+
+ If called interactively, toggle ~Helm-Display-Line-Numbers mode~.
+ If the prefix argument is positive, enable the mode, and if it is
+ zero or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+- {{{kbd(C-c C-f)}}} (~helm-follow-mode~) ::
+
+ #+findex: helm-follow-mode @r{(helm-map)}
+
+ #+kindex: C-c C-f @r{(helm-map)}
+
+ (helm-follow-mode &optional ARG)
+
+ Execute persistent action every time the cursor is moved.
+
+ This mode is source local, i.e. It applies on current source only.
+ \<helm-map>
+ This mode can be enabled or disabled interactively at anytime during
+ a helm session with \[helm-follow-mode].
+
+ When enabling interactively ~helm-follow-mode~ in a source, you
+ can keep it enabled for next Emacs sessions by setting
+ ~helm-follow-mode-persistent~ to a non-nil value.
+
+ When ~helm-follow-mode~ is called with a prefix arg and
+ ~helm-follow-mode-persistent~ is non-nil ~helm-follow-mode~ will
+ be persistent only for this Emacs session, but not for the next
+ Emacs sessions, i.e. the current source will not be saved to
+ ~helm-source-names-using-follow~.
+
+ A prefix arg with ~helm-follow-mode~ already enabled will have no
+ effect.
+
+ Note that you can use instead of this mode the commands
+ ~helm-follow-action-forward~ and ~helm-follow-action-backward~ at
+ anytime in all Helm sessions.
+
+ They are bound by default to \[helm-follow-action-forward] and
+ \[helm-follow-action-backward].
+
+**** Control what is displayed
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c >)}}} (~helm-toggle-truncate-line~) ::
+
+ #+findex: helm-toggle-truncate-line @r{(helm-map)}
+
+ #+kindex: C-c > @r{(helm-map)}
+
+ Toggle ~truncate-lines~ value in ~helm-buffer~
+
+- {{{kbd(C-M-e)}}} (~helm-display-all-sources~) ::
+
+ #+findex: helm-display-all-sources @r{(helm-map)}
+
+ #+kindex: C-M-e @r{(helm-map)}
+
+ Display all sources previously hidden by ~helm-set-source-filter~.
+
+- {{{kbd(C-M-a)}}} (~helm-show-all-candidates-in-source~) ::
+
+ #+findex: helm-show-all-candidates-in-source @r{(helm-map)}
+
+ #+kindex: C-M-a @r{(helm-map)}
+
+ (helm-show-all-candidates-in-source ARG)
+
+ Toggle all or only candidate-number-limit cands in current source.
+ With a numeric prefix arg show only the ARG number of candidates.
+ The prefix arg has no effect when toggling to only
+ candidate-number-limit.
+
+**** Control the layout
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c %)}}} (~helm-exchange-minibuffer-and-header-line~) ::
+
+ #+findex: helm-exchange-minibuffer-and-header-line @r{(helm-map)}
+
+ #+kindex: C-c % @r{(helm-map)}
+
+ Display minibuffer in header-line and vice versa for current Helm session.
+
+ This is a toggle command.
+
+- {{{kbd(C-{)}}} (~helm-enlarge-window~) ::
+
+ #+findex: helm-enlarge-window @r{(helm-map)}
+
+ #+kindex: C-@{ @r{(helm-map)}
+
+ Enlarge helm window.
+
+- {{{kbd(C-})}}} (~helm-narrow-window~) ::
+
+ #+findex: helm-narrow-window @r{(helm-map)}
+
+ #+kindex: C-@} @r{(helm-map)}
+
+ Narrow helm window.
+
+- {{{kbd(C-c -)}}} (~helm-swap-windows~) ::
+
+ #+findex: helm-swap-windows @r{(helm-map)}
+
+ #+kindex: C-c - @r{(helm-map)}
+
+ Swap window holding ~helm-buffer~ with other window.
+
+- {{{kbd(C-c _)}}} (~helm-toggle-full-frame~) ::
+
+ #+findex: helm-toggle-full-frame @r{(helm-map)}
+
+ #+kindex: C-c _ @r{(helm-map)}
+
+ (helm-toggle-full-frame &optional ARG)
+
+ Toggle ~helm-buffer~ full-frame view.
+
+- {{{kbd(C-t)}}} (~helm-toggle-resplit-and-swap-windows~) ::
+
+ #+findex: helm-toggle-resplit-and-swap-windows @r{(helm-map)}
+
+ #+kindex: C-t @r{(helm-map)}
+
+ Multi key command to re-split and swap Helm window.
+ First call runs ~helm-toggle-resplit-window~,
+ and second call within 1s runs ~helm-swap-windows~.
+
+**** Act on Other Window
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-l)}}} (~helm-recenter-top-bottom-other-window~) ::
+
+ #+findex: helm-recenter-top-bottom-other-window @r{(helm-map)}
+
+ #+kindex: C-l @r{(helm-map)}
+
+ (helm-recenter-top-bottom-other-window &optional ARG)
+
+ Run ~recenter-top-bottom~ in other window.
+ Meaning of prefix ARG is the same as in ~recenter-top-bottom~.
+
+- {{{kbd(C-M-l)}}} (~helm-reposition-window-other-window~) ::
+
+ #+findex: helm-reposition-window-other-window @r{(helm-map)}
+
+ #+kindex: C-M-l @r{(helm-map)}
+
+ (helm-reposition-window-other-window &optional ARG)
+
+ Run ~reposition-window~ in other window.
+ Meaning of prefix ARG is the same as in ~reposition-window~.
+
+- {{{kbd(C-M-<down>)}}} ::
+- {{{kbd(M-<next>)}}} ::
+- {{{kbd(C-M-v)}}} (~helm-scroll-other-window~) ::
+
+ #+findex: helm-scroll-other-window @r{(helm-map)}
+
+ #+kindex: C-M-<down> @r{(helm-map)}
+ #+kindex: M-<next> @r{(helm-map)}
+ #+kindex: C-M-v @r{(helm-map)}
+
+ (helm-scroll-other-window &optional ARG)
+
+ Scroll other window upward ARG many lines.
+ When arg is not provided scroll ~helm-scroll-amount~ lines.
+ See ~scroll-other-window~.
+
+- {{{kbd(C-M-<up>)}}} ::
+- {{{kbd(M-<prior>)}}} ::
+- {{{kbd(C-M-S-v)}}} ::
+- {{{kbd(C-M-y)}}} (~helm-scroll-other-window-down~) ::
+
+ #+findex: helm-scroll-other-window-down @r{(helm-map)}
+
+ #+kindex: C-M-<up> @r{(helm-map)}
+ #+kindex: M-<prior> @r{(helm-map)}
+ #+kindex: C-M-S-v @r{(helm-map)}
+ #+kindex: C-M-y @r{(helm-map)}
+
+ (helm-scroll-other-window-down &optional ARG)
+
+ Scroll other window downward ARG many lines.
+ When arg is not provided scroll ~helm-scroll-amount~ lines.
+ See ~scroll-other-window-down~.
+
+**** Navigate
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+***** Move by line
+
+- {{{kbd(C-p)}}} ::
+- {{{kbd(<up>)}}} (~helm-previous-line~) ::
+
+ #+findex: helm-previous-line @r{(helm-map)}
+
+ #+kindex: C-p @r{(helm-map)}
+ #+kindex: <up> @r{(helm-map)}
+
+ (helm-previous-line &optional ARG)
+
+ Move selection to the ARG previous line(s).
+ Same behavior as ~helm-next-line~ when called with a numeric
+ prefix arg.
+
+- {{{kbd(C-n)}}} ::
+- {{{kbd(<down>)}}} (~helm-next-line~) ::
+
+ #+findex: helm-next-line @r{(helm-map)}
+
+ #+kindex: C-n @r{(helm-map)}
+ #+kindex: <down> @r{(helm-map)}
+
+ (helm-next-line &optional ARG)
+
+ Move selection to the next ARG line(s).
+ When numeric prefix arg is > than the number of candidates, then
+ move to the last candidate of current source (i.e. don't move to
+ next source).
+
+***** Move by page
+
+- {{{kbd(<prior>)}}} ::
+- {{{kbd(M-v)}}} (~helm-previous-page~) ::
+
+ #+findex: helm-previous-page @r{(helm-map)}
+
+ #+kindex: <prior> @r{(helm-map)}
+ #+kindex: M-v @r{(helm-map)}
+
+ Move selection back with a pageful.
+
+- {{{kbd(C-v)}}} ::
+- {{{kbd(<next>)}}} (~helm-next-page~) ::
+
+ #+findex: helm-next-page @r{(helm-map)}
+
+ #+kindex: C-v @r{(helm-map)}
+ #+kindex: <next> @r{(helm-map)}
+
+ Move selection forward with a pageful.
+
+***** Move by source
+
+- {{{kbd(<left>)}}} ::
+- {{{kbd(M-o)}}} (~helm-previous-source~) ::
+
+ #+findex: helm-previous-source @r{(helm-map)}
+
+ #+kindex: <left> @r{(helm-map)}
+ #+kindex: M-o @r{(helm-map)}
+
+ Move selection to the previous source.
+
+- {{{kbd(<right>)}}} ::
+- {{{kbd(C-o)}}} (~helm-next-source~) ::
+
+ #+findex: helm-next-source @r{(helm-map)}
+
+ #+kindex: <right> @r{(helm-map)}
+ #+kindex: C-o @r{(helm-map)}
+
+ Move selection to the next source.
+
+***** Move to beginning or end of buffer
+
+- {{{kbd(M-<)}}} (~helm-beginning-of-buffer~) ::
+
+ #+findex: helm-beginning-of-buffer @r{(helm-map)}
+
+ #+kindex: M-< @r{(helm-map)}
+
+ Move selection at the top.
+
+- {{{kbd(M->)}}} (~helm-end-of-buffer~) ::
+
+ #+findex: helm-end-of-buffer @r{(helm-map)}
+
+ #+kindex: M-> @r{(helm-map)}
+
+ Move selection at the bottom.
+
+***** Move by mark
+
+- {{{kbd(M-()}}} (~helm-prev-visible-mark~) ::
+
+ #+findex: helm-prev-visible-mark @r{(helm-map)}
+
+ #+kindex: M-( @r{(helm-map)}
+
+ Move previous helm visible mark.
+
+- {{{kbd(M-))}}} (~helm-next-visible-mark~) ::
+
+ #+findex: helm-next-visible-mark @r{(helm-map)}
+
+ #+kindex: M-) @r{(helm-map)}
+
+ (helm-next-visible-mark &optional PREV)
+
+ Move next Helm visible mark.
+ If PREV is non-nil move to precedent.
+
+**** Mark
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-a)}}} (~helm-mark-all~) ::
+
+ #+findex: helm-mark-all @r{(helm-map)}
+
+ #+kindex: M-a @r{(helm-map)}
+
+ (helm-mark-all &optional ALL)
+
+ Mark all visible unmarked candidates in current source.
+
+ With a prefix arg mark all visible unmarked candidates in all
+ sources.
+
+- {{{kbd(M-U)}}} (~helm-unmark-all~) ::
+
+ #+findex: helm-unmark-all @r{(helm-map)}
+
+ #+kindex: M-U @r{(helm-map)}
+
+ Unmark all candidates in all sources of current helm session.
+
+- {{{kbd(C-@)}}} (~helm-toggle-visible-mark~) ::
+
+ #+findex: helm-toggle-visible-mark @r{(helm-map)}
+
+ #+kindex: C-@ @r{(helm-map)}
+
+ (helm-toggle-visible-mark ARG)
+
+ Toggle Helm visible mark at point ARG times.
+ If ARG is negative toggle backward.
+
+- {{{kbd(M-m)}}} (~helm-toggle-all-marks~) ::
+
+ #+findex: helm-toggle-all-marks @r{(helm-map)}
+
+ #+kindex: M-m @r{(helm-map)}
+
+ (helm-toggle-all-marks &optional ALL)
+
+ Toggle all marks.
+
+ Mark all visible candidates of current source or unmark all
+ candidates visible or invisible in all sources of current Helm
+ session.
+
+ With a prefix argument mark all candidates in all sources.
+
+- {{{kbd(M-SPC)}}} (~helm-toggle-visible-mark-backward~) ::
+
+ #+findex: helm-toggle-visible-mark-backward @r{(helm-map)}
+
+ #+kindex: M-SPC @r{(helm-map)}
+
+- {{{kbd(C-SPC)}}} (~helm-toggle-visible-mark-forward~) ::
+
+ #+findex: helm-toggle-visible-mark-forward @r{(helm-map)}
+
+ #+kindex: C-SPC @r{(helm-map)}
+
+**** Act on Selected Candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c TAB)}}} (~helm-copy-to-buffer~) ::
+
+ #+findex: helm-copy-to-buffer @r{(helm-map)}
+
+ #+kindex: C-c TAB @r{(helm-map)}
+
+ Copy selection or marked candidates to ~helm-current-buffer~.
+ Note that the real values of candidates are copied and not the
+ display values.
+
+- {{{kbd(C-c C-k)}}} (~helm-kill-selection-and-quit~) ::
+
+ #+findex: helm-kill-selection-and-quit @r{(helm-map)}
+
+ #+kindex: C-c C-k @r{(helm-map)}
+
+ (helm-kill-selection-and-quit ARG)
+
+ Store display value of current selection to kill ring.
+ With a prefix arg use real value of current selection.
+ Display value is shown in ~helm-buffer~ and real value is used to
+ perform actions.
+
+- {{{kbd(C-c C-y)}}} (~helm-yank-selection~) ::
+
+ #+findex: helm-yank-selection @r{(helm-map)}
+
+ #+kindex: C-c C-y @r{(helm-map)}
+
+ (helm-yank-selection ARG)
+
+ Set minibuffer contents to current display selection.
+ With a prefix arg set to real value of current selection.
+
+**** Move and Act
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-<up>)}}} (~helm-follow-action-backward~) ::
+
+ #+findex: helm-follow-action-backward @r{(helm-map)}
+
+ #+kindex: C-<up> @r{(helm-map)}
+
+ Go to previous line and execute persistent action.
+
+- {{{kbd(C-<down>)}}} (~helm-follow-action-forward~) ::
+
+ #+findex: helm-follow-action-forward @r{(helm-map)}
+
+ #+kindex: C-<down> @r{(helm-map)}
+
+ Go to next line and execute persistent action.
+
+**** Resume Previous Session (after quitting)
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x b)}}} (~helm-resume-previous-session-after-quit~) ::
+
+ #+findex: helm-resume-previous-session-after-quit @r{(helm-map)}
+
+ #+kindex: C-x b @r{(helm-map)}
+
+ Resume previous Helm session within a running Helm.
+
+**** Suspend Update of Candidates
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-!)}}} (~helm-toggle-suspend-update~) ::
+
+ #+findex: helm-toggle-suspend-update @r{(helm-map)}
+
+ #+kindex: C-! @r{(helm-map)}
+
+ Enable or disable display update in helm.
+ This can be useful for example for quietly writing a complex
+ regexp without Helm constantly updating.
+
+**** Helm Refresh
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-u)}}} (~helm-refresh~) ::
+
+ #+findex: helm-refresh @r{(helm-map)}
+
+ #+kindex: C-c C-u @r{(helm-map)}
+
+ Force recalculation and update of candidates.
+
+**** COMMENT uncategorized uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~ezmenu-byte-code-function~ ::
+
+ #+findex: ezmenu-byte-code-function
+
+**** Find file after Quit
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x C-f)}}} (~helm-quit-and-find-file~) ::
+
+ #+findex: helm-quit-and-find-file @r{(helm-map)}
+
+ #+kindex: C-x C-f @r{(helm-map)}
+
+ Drop into ~helm-find-files~ from ~helm~.
+ If current selection is a buffer or a file, ~helm-find-files~
+ from its directory.
+
+**** List Buffers after Quitting
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x C-b)}}} (~helm-resume-list-buffers-after-quit~) ::
+
+ #+findex: helm-resume-list-buffers-after-quit @r{(helm-map)}
+
+ #+kindex: C-x C-b @r{(helm-map)}
+
+ List Helm buffers that can be resumed within a running Helm.
+
+**** Debug Helm
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-h C-d)}}} (~helm-enable-or-switch-to-debug~) ::
+
+ #+findex: helm-enable-or-switch-to-debug @r{(helm-map)}
+
+ #+kindex: C-h C-d @r{(helm-map)}
+
+ First hit enable helm debugging, second hit switch to debug buffer.
+
+*** Commands in library ~helm~ (excludes keymaps)
+
+**** Debug
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-debug-open-last-log~ ::
+
+ #+findex: helm-debug-open-last-log
+
+ Open Helm log file or buffer of last Helm session.
+
+- ~helm-debug-output~ ::
+
+ #+findex: helm-debug-output
+
+ Show all Helm-related variables at this time.
+
+**** Select
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-menu-select-action~ ::
+
+ #+findex: helm-menu-select-action
+
+ (helm-menu-select-action EVENT)
+
+ Popup action menu from mouse-3.
+
+- ~helm-mouse-select-candidate~ ::
+
+ #+findex: helm-mouse-select-candidate
+
+ (helm-mouse-select-candidate EVENT)
+
+**** Resume
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-cycle-resume~ ::
+
+ #+findex: helm-cycle-resume
+
+ Cycle in ~helm-buffers~ list and resume when waiting more than 1.2s.
+
+- {{{kbd(C-x c b)}}} (~helm-resume~) ::
+
+ #+findex: helm-resume
+
+ #+kindex: C-x c b
+
+ (helm-resume ARG)
+
+ Resume a previous Helm session.
+ Call with a prefix arg to choose among existing Helm
+ buffers (sessions). When calling from Lisp, specify a
+ ~buffer-name~ as a string with ARG.
+
+- ~helm-run-cycle-resume~ ::
+
+ #+findex: helm-run-cycle-resume
+
+ Same as ~helm-cycle-resume~ but intended to be called only from Helm.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-configuration~ ::
+
+ #+findex: helm-configuration
+
+ Customize Helm.
+
+- ~helm-confirm-and-exit-minibuffer~ ::
+
+ #+findex: helm-confirm-and-exit-minibuffer
+
+ Maybe ask for confirmation when exiting helm.
+ It is similar to ~minibuffer-complete-and-exit~ adapted to Helm.
+ If ~minibuffer-completion-confirm~ value is 'confirm, send
+ minibuffer confirm message and exit on next hit. If
+ ~minibuffer-completion-confirm~ value is t, don't exit and send
+ message 'no match'.
+
+- ~helm-delete-backward-no-update~ ::
+
+ #+findex: helm-delete-backward-no-update
+
+ (helm-delete-backward-no-update ARG)
+
+ Disable update and delete ARG chars backward.
+ Update is reenabled when idle 1s.
+
+- ~helm-toggle-resplit-window~ ::
+
+ #+findex: helm-toggle-resplit-window
+
+ Toggle resplit helm window, vertically or horizontally.
+
+*** Options in library =helm=
+
+**** Min
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-tramp-connection-min-time-diff~ ::
+
+ #+vindex: helm-tramp-connection-min-time-diff
+
+ *Standard Value*: 5
+
+ Value of ~tramp-connection-min-time-diff~ for Helm remote processes.
+ If set to zero Helm remote processes are not delayed.
+
+ Setting this to a value less than 5 or disabling it with a zero
+ value is risky, however on Emacs versions starting at 24.5 it
+ seems it is now possible to disable it.
+
+ Anyway at any time in Helm you can suspend your processes while
+ typing by hitting ~C-!~.
+
+ Only async sources than use a sentinel calling
+ ~helm-process-deferred-sentinel-hook~ are affected by this.
+
+**** Windows
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-always-two-windows~ ::
+
+ #+vindex: helm-always-two-windows
+
+ *Standard Value*: nil
+
+ When non-nil Helm uses two windows in this frame.
+
+ I.e. ~helm-buffer~ in one window and ~helm-current-buffer~
+ in the other.
+
+ Note: this has no effect when ~helm-split-window-inside-p~ is
+ non-nil, or when ~helm-split-window-default-side~ is set to
+ ’same.
+
+ When ~helm-autoresize-mode~ is enabled, setting this to nil
+ will have no effect.
+
+ Also when non-nil it overrides the effect of
+ ~helm-split-window-default-side~ set to ~other~.
+
+**** Functions
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-save-configuration-functions~ ::
+
+ #+vindex: helm-save-configuration-functions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (set-window-configuration . current-window-configuration)
+ #+end_src
+
+ Functions used to restore or save configurations for frames and windows.
+ Specified as a pair of functions, where car is the restore
+ function and cdr is the save function.
+
+ To save and restore frame configuration, set this variable to
+ ’(set-frame-configuration . current-frame-configuration)
+
+ NOTE: This may not work properly with own-frame minibuffer
+ settings. Older versions saves/restores frame configuration, but
+ the default has changed now to avoid flickering.
+
+**** Candidate
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-candidate-number-limit~ ::
+
+ #+vindex: helm-candidate-number-limit
+
+ *Standard Value*: 100
+
+ Global limit for number of candidates displayed.
+ When the pattern is empty, the number of candidates shown will be
+ as set here instead of the entire list, which may be hundreds or
+ thousands. Since narrowing and filtering rapidly reduces
+ available candidates, having a small list will keep the interface
+ responsive.
+
+ Set this value to nil for no limit.
+
+- ~helm-candidate-separator~ ::
+
+ #+vindex: helm-candidate-separator
+
+ *Standard Value*: ――――――――――――――――――――――――――――――――――――――
+
+ Candidates separator of ~multiline~ source.
+
+**** Minibuffer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-delete-minibuffer-contents-from-point~ ::
+
+ #+vindex: helm-delete-minibuffer-contents-from-point
+
+ *Standard Value*: t
+
+ When non-nil, ~helm-delete-minibuffer-contents~ deletes region from ~point~.
+ Otherwise it deletes ~minibuffer-contents~.
+ See documentation for ~helm-delete-minibuffer-contents~.
+
+- ~helm-prevent-escaping-from-minibuffer~ ::
+
+ #+vindex: helm-prevent-escaping-from-minibuffer
+
+ *Standard Value*: t
+
+ Prevent escaping from minibuffer with ~other-window~ during the Helm session.
+
+**** Width
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-left-margin-width~ ::
+
+ #+vindex: helm-left-margin-width
+
+ *Standard Value*: 0
+
+ ~left-margin-width~ value for the ~helm-buffer~.
+
+**** Delay
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-cycle-resume-delay~ ::
+
+ #+vindex: helm-cycle-resume-delay
+
+ *Standard Value*: 1.0
+
+ Delay used before resuming in ~helm-run-cycle-resume~.
+
+- ~helm-exit-idle-delay~ ::
+
+ #+vindex: helm-exit-idle-delay
+
+ *Standard Value*: 0
+
+ Idle time before exiting minibuffer while Helm is updating.
+ Has no affect when helm-buffer is up to date (i.e. exit without
+ delay in this condition).
+
+**** Mouse
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-allow-mouse~ ::
+
+ #+vindex: helm-allow-mouse
+
+ *Standard Value*: nil
+
+ Allow mouse usage during the Helm session when non-nil.
+
+ Note that this also allows moving out of minibuffer when clicking
+ outside of ~helm-buffer~, so it is up to you to get back to Helm
+ by clicking back in ~helm-buffer~ or minibuffer.
+
+**** Source
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-source-names-using-follow~ ::
+
+ #+vindex: helm-source-names-using-follow
+
+ *Standard Value*: nil
+
+ A list of source names to have follow enabled.
+ This list of source names will be used only
+ when ~helm-follow-mode-persistent~ is non-nil.
+
+ You don’t have to customize this yourself unless you really want
+ and know what you are doing, instead just set
+ ~helm-follow-mode-persistent~ to non-nil and as soon as you turn
+ on or off ~helm-follow-mode~ (C-c C-f) in a source, Helm will
+ save or remove source name in this variable.
+
+**** Search
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-case-fold-search~ ::
+
+ #+vindex: helm-case-fold-search
+
+ *Standard Value*: smart
+
+ Adds ’smart’ option to ~case-fold-search~.
+ Smart option ignores case for searches as long as there are no
+ upper case characters in the pattern.
+
+ Use nil or t to turn off smart behavior and use
+ ~case-fold-search~ behavior.
+
+ Default is smart.
+
+ NOTE: Case fold search has no effect when searching asynchronous
+ sources, which relies on customized features implemented directly
+ into their execution process. See helm-grep.el for an example.
+
+- ~helm-file-name-case-fold-search~ ::
+
+ #+vindex: helm-file-name-case-fold-search
+
+ *Standard Value*: smart
+
+ Local setting of ~helm-case-fold-search~ for reading filenames.
+
+ See ~helm-case-fold-search~ for more info.
+
+**** Action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-action-at-nth-negative-prefix-key~ ::
+
+ #+vindex: helm-action-at-nth-negative-prefix-key
+
+ *Standard Value*: C-x %d
+
+ The prefix key to execute default action on nth <-n> candidate.
+
+ This is a format spec where %d will be replaced by the candidate
+ number.
+
+ NOTE: ~setq~ have no effect until you restart Emacs, use
+ customize for immediate effect.
+
+- ~helm-action-at-nth-positive-prefix-key~ ::
+
+ #+vindex: helm-action-at-nth-positive-prefix-key
+
+ *Standard Value*: C-c %d
+
+ The prefix key to execute default action on nth <+n> candidate.
+
+ This is a format spec where %d will be replaced by the candidate
+ number.
+
+ NOTE: ~setq~ have no effect until you restart Emacs, use
+ customize for immediate effect.
+
+**** Fuzzy
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-fuzzy-match-fn~ ::
+
+ #+vindex: helm-fuzzy-match-fn
+
+ *Standard Value*: helm-fuzzy-match
+
+ The function for fuzzy matching in ~helm-source-sync~ based sources.
+
+- ~helm-fuzzy-matching-highlight-fn~ ::
+
+ #+vindex: helm-fuzzy-matching-highlight-fn
+
+ *Standard Value*: helm-fuzzy-default-highlight-match
+
+ The function to highlight fuzzy matches.
+
+- ~helm-fuzzy-search-fn~ ::
+
+ #+vindex: helm-fuzzy-search-fn
+
+ *Standard Value*: helm-fuzzy-search
+
+ The function for fuzzy matching in ~helm-source-in-buffer~ based sources.
+
+- ~helm-fuzzy-sort-fn~ ::
+
+ #+vindex: helm-fuzzy-sort-fn
+
+ *Standard Value*: helm-fuzzy-matching-default-sort-fn
+
+ The sort transformer function used in fuzzy matching.
+
+**** Autoresize
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-autoresize-max-height~ ::
+
+ #+vindex: helm-autoresize-max-height
+
+ *Standard Value*: 40
+
+ Specify maximum height and defaults to percent of Helm window’s frame height.
+
+ See ~fit-window-to-buffer~ for more infos.
+
+- ~helm-autoresize-min-height~ ::
+
+ #+vindex: helm-autoresize-min-height
+
+ *Standard Value*: 10
+
+ Specify minimum height and defaults to percent of Helm window’s frame height.
+
+ If nil, ~window-min-height~ is used.
+ See ~fit-window-to-buffer~ for details.
+
+**** Line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-header-line-space-before-prompt~ ::
+
+ #+vindex: helm-header-line-space-before-prompt
+
+ *Standard Value*: left-fringe
+
+ Specify the space before prompt in header-line.
+
+ This will be used when ~helm-echo-input-in-header-line~ is
+ non-nil.
+
+ Value can be one of the symbols ’left-fringe or ’left-margin or
+ an integer specifying the number of spaces before prompt. Note
+ that on input longer that ~window-width~ the continuation string
+ will be shown on left side of window without taking care of
+ this.
+
+- ~helm-move-to-line-cycle-in-source~ ::
+
+ #+vindex: helm-move-to-line-cycle-in-source
+
+ *Standard Value*: nil
+
+ Cycle to the beginning or end of the list after reaching the bottom or top.
+ This applies when using ~helm-next/previous-line~.
+
+**** Input
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-echo-input-in-header-line~ ::
+
+ #+vindex: helm-echo-input-in-header-line
+
+ *Standard Value*: nil
+
+ Send current input to header-line when non-nil.
+
+- ~helm-inherit-input-method~ ::
+
+ #+vindex: helm-inherit-input-method
+
+ *Standard Value*: t
+
+ Inherit ~current-input-method~ from ~current-buffer~ when non-nil.
+ The default is to enable this by default and then toggle
+ ~toggle-input-method~.
+
+- ~helm-input-idle-delay~ ::
+
+ #+vindex: helm-input-idle-delay
+
+ *Standard Value*: 0.01
+
+ Idle time before updating, specified in seconds.
+
+- ~helm-input-method-verbose-flag~ ::
+
+ #+vindex: helm-input-method-verbose-flag
+
+ *Standard Value*: nil
+
+ The default value for ~input-method-verbose-flag~ used in Helm minibuffer.
+ It is nil by default, which does not turn off input method. Helm
+ updates and exits without interruption -- necessary for complex
+ methods.
+
+ If set to any other value as per ~input-method-verbose-flag~,
+ then use ~C-\~ to disable the ~current-input-method~ to exit or
+ update Helm.
+
+**** Mode
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm--minor-mode-hook~ ::
+
+ #+vindex: helm--minor-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm--minor-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm--remap-mouse-mode-hook~ ::
+
+ #+vindex: helm--remap-mouse-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm--remap-mouse-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm-autoresize-mode-hook~ ::
+
+ #+vindex: helm-autoresize-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-autoresize-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm-follow-mode-persistent~ ::
+
+ #+vindex: helm-follow-mode-persistent
+
+ *Standard Value*: nil
+
+ When non-nil, save last state of ~helm-follow-mode~ for the next Emacs sessions.
+
+ Each time you turn on or off ~helm-follow-mode~, the current
+ source name will be stored or removed from
+ ~helm-source-names-using-follow~.
+
+ Note that this may be disabled in some places where it is unsafe
+ to use because persistent action is changing according to
+ context.
+
+**** Default
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-sources-using-default-as-input~ ::
+
+ #+vindex: helm-sources-using-default-as-input
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-source-imenu helm-source-imenu-all helm-source-info-elisp helm-source-etags-select helm-source-man-pages helm-source-occur helm-source-moccur helm-source-grep-ag helm-source-grep-git helm-source-grep)
+ #+end_src
+
+ List of Helm sources that need to use ~helm-maybe-use-default-as-input~.
+ When a source is a member of this list, default ~thing-at-point~
+ will be used as input.
+
+**** Frame Use
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-use-frame-when-more-than-two-windows~ ::
+
+ #+vindex: helm-use-frame-when-more-than-two-windows
+
+ *Standard Value*: nil
+
+ Display Helm buffer in frame when more than two windows.
+
+- ~helm-use-undecorated-frame-option~ ::
+
+ #+vindex: helm-use-undecorated-frame-option
+
+ *Standard Value*: t
+
+ Display Helm frame undecorated when non nil.
+
+ This option has no effect with Emacs versions lower than 26.
+
+**** Frame Color
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-frame-background-color~ ::
+
+ #+vindex: helm-frame-background-color
+
+ *Standard Value*: nil
+
+ Background color for Helm frames, a string.
+ Fallback to default face background when nil.
+
+- ~helm-frame-foreground-color~ ::
+
+ #+vindex: helm-frame-foreground-color
+
+ *Standard Value*: nil
+
+ Foreground color for Helm frames, a string.
+ Fallback to default face foreground when nil
+
+**** Frame uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-actions-inherit-frame-settings~ ::
+
+ #+vindex: helm-actions-inherit-frame-settings
+
+ *Standard Value*: t
+
+ Actions inherit Helm frame settings of initial command when non nil.
+
+- ~helm-commands-using-frame~ ::
+
+ #+vindex: helm-commands-using-frame
+
+ *Standard Value*: nil
+
+ A list of commands where ~helm-buffer~ is displayed in a frame.
+
+- ~helm-frame-alpha~ ::
+
+ #+vindex: helm-frame-alpha
+
+ *Standard Value*: nil
+
+ Alpha parameter for Helm frames, an integer.
+ Fallback to 100 when nil.
+
+- ~helm-full-frame~ ::
+
+ #+vindex: helm-full-frame
+
+ *Standard Value*: nil
+
+ Use current window for showing candidates.
+ If t, then Helm does not pop-up a new window.
+
+**** Window When
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-use-frame-when-dedicated-window~ ::
+
+ #+vindex: helm-use-frame-when-dedicated-window
+
+ *Standard Value*: nil
+
+ Display Helm buffer in frame when Helm is started from a dedicated window.
+
+**** Window Other
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-show-action-window-other-window~ ::
+
+ #+vindex: helm-show-action-window-other-window
+
+ *Standard Value*: nil
+
+ Show action buffer beside ~helm-buffer~ when non-nil.
+
+ If nil don’t split and replace helm-buffer by the action buffer
+ in same window.
+ If left display the action buffer at the left of helm-buffer.
+ If right or any other value, split at right.
+
+ Note that this may not fit well with some Helm window
+ configurations, so it have only effect when
+ ~helm-always-two-windows~ is non-nil.
+
+**** Window Split
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-reuse-last-window-split-state~ ::
+
+ #+vindex: helm-reuse-last-window-split-state
+
+ *Standard Value*: nil
+
+ Use the same state of window split, vertical or horizontal.
+ ~helm-toggle-resplit-window~ for the next helm session will use
+ the same window scheme as the previous session unless
+ ~helm-split-window-default-side~ is ’same or ’other.
+
+- ~helm-split-window-default-side~ ::
+
+ #+vindex: helm-split-window-default-side
+
+ *Standard Value*: below
+
+ The default side to display ~helm-buffer~.
+ Must be one acceptable arg for ~split-window~ SIDE,
+ that is ~below~, ~above~, ~left~ or ~right~.
+
+ Other acceptable values are ~same~ which always displays
+ ~helm-buffer~ in current window and ~other~ that displays
+ ~helm-buffer~ below if only one window or in
+ ~other-window-for-scrolling~ when available.
+
+ A nil value has same effect as ~below~. If ~helm-full-frame~ is
+ non-nil, it take precedence over this setting.
+
+ See also ~helm-split-window-inside-p~ and
+ ~helm-always-two-windows~ that take precedence over this.
+
+ NOTE: this has no effect if
+ ~helm-split-window-preferred-function~ is not
+ ~helm-split-window-default-fn~ unless this new function can
+ handle this.
+
+- ~helm-split-window-in-side-p~ ::
+
+ #+vindex: helm-split-window-in-side-p
+
+ *Standard Value*: nil
+
+ Force split inside selected window when non-nil.
+ See also ~helm-split-window-default-side~.
+
+ NOTE: this has no effect if
+ ~helm-split-window-preferred-function~ is not
+ ~helm-split-window-default-fn~ unless this new function can
+ handle this.
+
+- ~helm-split-window-inside-p~ ::
+
+ #+vindex: helm-split-window-inside-p
+
+ *Standard Value*: nil
+
+ Force split inside selected window when non-nil.
+ See also ~helm-split-window-default-side~.
+
+ NOTE: this has no effect if
+ ~helm-split-window-preferred-function~ is not
+ ~helm-split-window-default-fn~ unless this new function can
+ handle this.
+
+- ~helm-split-window-other-side-when-one-window~ ::
+
+ #+vindex: helm-split-window-other-side-when-one-window
+
+ *Standard Value*: below
+
+ The default side to display ~helm-buffer~ when (1)
+ ~helm-split-window-default-side~ is ’other and (2)
+ the current frame only has one window. Possible values
+ are acceptable args for ~split-window~ SIDE, that is ~below~,
+ ~above~, ~left~ or ~right~.
+
+ If ~helm-full-frame~ is non-nil, it takes precedence over this
+ setting.
+
+ See also ~helm-split-window-inside-p~ and ~helm-always-two-windows~ that
+ takes precedence over this.
+
+ NOTE: this has no effect if
+ ~helm-split-window-preferred-function~ is not
+ ~helm-split-window-default-fn~ unless this new function can
+ handle this.
+
+- ~helm-split-window-preferred-function~ ::
+
+ #+vindex: helm-split-window-preferred-function
+
+ *Standard Value*: helm-split-window-default-fn
+
+ Default function used for splitting window.
+
+**** Window uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-completion-window-scroll-margin~ ::
+
+ #+vindex: helm-completion-window-scroll-margin
+
+ *Standard Value*: 5
+
+ ~scroll-margin~ to use for Helm completion window.
+ Set to 0 to disable.
+ NOTE: This has no effect when ~helm-display-source-at-screen-top~
+ id is non-nil.
+
+**** Display Line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-display-header-line~ ::
+
+ #+vindex: helm-display-header-line
+
+ *Standard Value*: t
+
+ Display header-line when non nil.
+
+- ~helm-display-line-numbers-mode-hook~ ::
+
+ #+vindex: helm-display-line-numbers-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-display-line-numbers-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+**** Display Function
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-display-function~ ::
+
+ #+vindex: helm-display-function
+
+ *Standard Value*: helm-default-display-buffer
+
+ Function used to display ~helm-buffer~.
+
+ Local value in ~helm-buffer~ will take precedence on this default
+ value. Commands that are in ~helm-commands-using-frame~ will have
+ ~helm-buffer~ displayed in frame, ~helm-display-function~ being
+ ignored.
+ If no local value is found and current command is not one of
+ ~helm-commands-using-frame~ use this default value.
+ The function in charge of deciding which value use is
+ ~helm-resolve-display-function~.
+
+ To set it locally to ~helm-buffer~ in Helm sources use
+ ~helm-set-local-variable~ in init function or use
+ :display-function slot in ~helm~ call.
+
+**** Display Default
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-default-prompt-display-function~ ::
+
+ #+vindex: helm-default-prompt-display-function
+
+ *Standard Value*: helm-set-default-prompt-display
+
+ The function to use to set face of fake cursor in header-line.
+
+**** Display Buffer Width
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-display-buffer-width~ ::
+
+ #+vindex: helm-display-buffer-width
+
+ *Standard Value*: 72
+
+ Frame width when displaying helm-buffer in own frame.
+
+**** Display Buffer Height
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-display-buffer-height~ ::
+
+ #+vindex: helm-display-buffer-height
+
+ *Standard Value*: 20
+
+ Frame height when displaying helm-buffer in own frame.
+
+**** Display Buffer Default
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-default-display-buffer-alist~ ::
+
+ #+vindex: helm-default-display-buffer-alist
+
+ *Standard Value*: nil
+
+ Additional alist to pass to ~display-buffer~ action.
+ See (info "(elisp) Action Alists for Buffer Display").
+
+ It has no effect when ~helm-always-two-windows~ is non-nil and
+ may override other settings like ~helm-split-window-inside-p~.
+ Note that window-height and window-width have to be configured in
+ ~helm-display-buffer-height~ and ~helm-display-buffer-width~.
+
+- ~helm-default-display-buffer-functions~ ::
+
+ #+vindex: helm-default-display-buffer-functions
+
+ *Standard Value*: nil
+
+ Action functions to pass to ~display-buffer~.
+ See (info "(elisp) Action Functions for Buffer Display").
+
+ It has no effect when ~helm-always-two-windows~ is non-nil and
+ may override other settings like ~helm-split-window-inside-p~.
+
+- ~helm-display-buffer-default-height~ ::
+
+ #+vindex: helm-display-buffer-default-height
+
+ *Standard Value*: nil
+
+ Initial height of ~helm-buffer~, specified as an integer or a function.
+
+ The function should take one arg and be responsible for re-sizing
+ the window; function’s return value is ignored. Note that this
+ has no effect when the split is vertical. See ~display-buffer~
+ for more info.
+
+- ~helm-display-buffer-default-width~ ::
+
+ #+vindex: helm-display-buffer-default-width
+
+ *Standard Value*: nil
+
+ Initial width of ~helm-buffer~, specified as an integer or a function.
+
+ The function should take one arg and be responsible for re-sizing
+ the window; function’s return value is ignored. Note that this
+ have no effect when the split is horizontal. See ~display-buffer~
+ for more info.
+
+**** Display Buffer uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-display-buffer-reuse-frame~ ::
+
+ #+vindex: helm-display-buffer-reuse-frame
+
+ *Standard Value*: nil
+
+ When non nil Helm frame is not deleted and reused in next sessions.
+
+ This was used to workaround a bug in Emacs where frames where
+ popping up slowly, now that the bug have been fixed upstream
+ (emacs-27) probably you don’t want to use this any more. On
+ emacs-26 set ~x-wait-for-event-timeout~ to nil to have your
+ frames popping up fast.
+
+**** Display uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-display-source-at-screen-top~ ::
+
+ #+vindex: helm-display-source-at-screen-top
+
+ *Standard Value*: t
+
+ Display candidates at the top of screen.
+ This happens with ~helm-next-source~ and ~helm-previous-source~.
+ NOTE: When non-nil (default), disable
+ ~helm-completion-window-scroll-margin~.
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm--remap-mouse-mode~ ::
+
+ #+vindex: helm--remap-mouse-mode
+
+ *Standard Value*: nil
+
+ (helm--remap-mouse-mode &optional ARG)
+
+ [INTERNAL] Prevent escaping helm minibuffer with mouse clicks.
+ Do nothing when used outside of helm context.
+
+ If called interactively, toggle ~Helm--Remap-Mouse mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+ WARNING: Do not use this mode yourself, it is internal to Helm.
+
+- ~helm-autoresize-mode~ ::
+
+ #+vindex: helm-autoresize-mode
+
+ *Standard Value*: nil
+
+ (helm-autoresize-mode &optional ARG)
+
+ Auto resize helm window when enabled.
+ Helm window is re-sized according to ~helm-autoresize-max-height~
+ and ~helm-autoresize-min-height~. Note that when this mode is
+ enabled, Helm behaves as if ~helm-always-two-windows~ is enabled.
+
+ If called interactively, toggle ~Helm-Autoresize mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+ See ~fit-window-to-buffer~ for more infos.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-debug-root-directory~ ::
+
+ #+vindex: helm-debug-root-directory
+
+ *Standard Value*: nil
+
+ When non-nil, save Helm log messages to a file in this directory.
+ When nil log messages are saved to a buffer instead. Log message
+ are saved only when ~helm-debug~ is non-nil, so setting this
+ doesn’t enable debugging by itself.
+
+ See ~helm-log-save-maybe~ for more info.
+
+- ~helm-samewindow~ ::
+
+ #+vindex: helm-samewindow
+
+ *Standard Value*: nil
+
+ Use current window for showing candidates.
+ If t, then Helm does not pop-up a new window.
+
+- ~helm-truncate-lines~ ::
+
+ #+vindex: helm-truncate-lines
+
+ *Standard Value*: nil
+
+ The value of ~truncate-lines~ when Helm starts.
+ You can toggle later ~truncate-lines~ with
+ C-c >.
+
+*** Hooks in library =helm=
+
+**** Run
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-log-run-hook~ ::
+
+ #+vindex: helm-log-run-hook
+
+ *Standard Value*:
+
+**** Exit
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-confirm-and-exit-hook~ ::
+
+ #+vindex: helm-confirm-and-exit-hook
+
+ *Standard Value*:
+
+**** Temp
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~with-helm-temp-hook~ ::
+
+ #+vindex: with-helm-temp-hook
+
+ *Standard Value*:
+
+**** Hooks
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm--run-init-hooks~ ::
+
+ #+vindex: helm--run-init-hooks
+
+ *Standard Value*:
+
+- ~helm--temp-hooks~ ::
+
+ #+vindex: helm--temp-hooks
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ((helm--hook94 . helm-after-update-hook))
+ #+end_src
+
+ Store temporary hooks added by ~with-helm-temp-hook~.
+
+**** Minibuffer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-exit-minibuffer-hook~ ::
+
+ #+vindex: helm-exit-minibuffer-hook
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-files-save-file-name-history)
+ #+end_src
+
+ Runs just before exiting the minibuffer.
+
+ This hook runs when Helm exits the minibuffer normally (e.g., via
+ candidate selection), but does NOT run if Helm exits the
+ minibuffer abnormally (e.g. via ~helm-keyboard-quit~).
+
+- ~helm-minibuffer-set-up-hook~ ::
+
+ #+vindex: helm-minibuffer-set-up-hook
+
+ *Standard Value*: nil
+
+ Hook that runs at minibuffer initialization.
+ A hook useful for modifying minibuffer settings in Helm.
+
+ An example that hides the minibuffer when using
+ ~helm-echo-input-in-header-line~:
+
+ (add-hook ’helm-minibuffer-set-up-hook #’helm-hide-minibuffer-maybe)
+
+ Note that we check ~helm-echo-input-in-header-line~ value
+ from ~helm-buffer~ which allows detecting possible local
+ value of this var.
+
+**** Autoresize
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm--autoresize-hook~ ::
+
+ #+vindex: helm--autoresize-hook
+
+ *Standard Value*:
+
+**** Before
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-before-initialize-hook~ ::
+
+ #+vindex: helm-before-initialize-hook
+
+ *Standard Value*: nil
+
+ Runs before Helm initialization.
+ This hook runs before init functions in ~helm-sources~, which is
+ before creation of ~helm-buffer~. Set local variables for
+ ~helm-buffer~ that need a value from ~current-buffer~ with
+ ~helm-set-local-variable~.
+
+- ~helm-move-selection-before-hook~ ::
+
+ #+vindex: helm-move-selection-before-hook
+
+ *Standard Value*: nil
+
+ Runs before moving selection in ~helm-buffer~.
+
+**** Update
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-before-update-hook~ ::
+
+ #+vindex: helm-before-update-hook
+
+ *Standard Value*: nil
+
+ Runs before updating the Helm buffer with the new input pattern.
+
+- ~helm-update-hook~ ::
+
+ #+vindex: helm-update-hook
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm--maybe-update-keymap helm-match-line-cleanup-maybe helm-revive-visible-mark helm-confirm-and-exit-hook)
+ #+end_src
+
+ Runs after updating the Helm buffer with the new input pattern.
+
+**** Action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-before-action-hook~ ::
+
+ #+vindex: helm-before-action-hook
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-ff-before-action-hook-fn)
+ #+end_src
+
+ Runs before executing action.
+ Unlike ~helm-cleanup-hook~, this hook runs before Helm closes the
+ minibuffer and also before performing an action.
+
+- ~helm-select-action-hook~ ::
+
+ #+vindex: helm-select-action-hook
+
+ *Standard Value*: nil
+
+ Runs when opening the action buffer.
+
+**** Mode
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm--minor-mode-hook~ ::
+
+ #+vindex: helm--minor-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm--minor-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm--remap-mouse-mode-hook~ ::
+
+ #+vindex: helm--remap-mouse-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm--remap-mouse-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm-autoresize-mode-hook~ ::
+
+ #+vindex: helm-autoresize-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-autoresize-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm-display-line-numbers-mode-hook~ ::
+
+ #+vindex: helm-display-line-numbers-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-display-line-numbers-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm-major-mode-hook~ ::
+
+ #+vindex: helm-major-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering Hmm mode.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+**** After Action
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-after-action-hook~ ::
+
+ #+vindex: helm-after-action-hook
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-match-line-cleanup-pulse)
+ #+end_src
+
+ Runs after executing action.
+
+- ~helm-after-persistent-action-hook~ ::
+
+ #+vindex: helm-after-persistent-action-hook
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-find-files--reset-level-tree helm-match-line-update helm-persistent-autoresize-hook)
+ #+end_src
+
+ Runs after executing persistent action.
+
+**** After Update
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-after-update-hook~ ::
+
+ #+vindex: helm-after-update-hook
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm--maybe-update-keymap helm-match-line-cleanup-maybe helm-revive-visible-mark helm-confirm-and-exit-hook)
+ #+end_src
+
+ Runs after updating the Helm buffer with the new input pattern.
+
+- ~with-helm-after-update-hook~ ::
+
+ #+vindex: with-helm-after-update-hook
+
+ *Standard Value*:
+
+**** After uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-after-initialize-hook~ ::
+
+ #+vindex: helm-after-initialize-hook
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-reset-yank-point)
+ #+end_src
+
+ Runs after Helm initialization.
+ This hook runs after ~helm-buffer~ is created but not from
+ ~helm-buffer~. The hook needs to specify in which buffer to
+ run.
+
+- ~helm-after-preselection-hook~ ::
+
+ #+vindex: helm-after-preselection-hook
+
+ *Standard Value*: nil
+
+ Runs after pre-selection in ~helm-buffer~.
+
+- ~helm-move-selection-after-hook~ ::
+
+ #+vindex: helm-move-selection-after-hook
+
+ *Standard Value*: nil
+
+ Runs after moving selection in ~helm-buffer~.
+
+- ~helm-resume-after-hook~ ::
+
+ #+vindex: helm-resume-after-hook
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-ff--update-resume-after-hook)
+ #+end_src
+
+ A hook that runs after resuming a Helm session.
+ The hook should takes one arg SOURCES.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-async-outer-limit-hook~ ::
+
+ #+vindex: helm-async-outer-limit-hook
+
+ *Standard Value*: nil
+
+ A hook that runs in async sources when process output comes out of ~candidate-number-limit~.
+ Should be set locally to ~helm-buffer~ with ~helm-set-local-variable~.
+
+- ~helm-cleanup-hook~ ::
+
+ #+vindex: helm-cleanup-hook
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-ff-save-history helm-find-files--reset-level-tree helm-match-line-cleanup helm-handle-winner-boring-buffers helm-reset-yank-point)
+ #+end_src
+
+ Runs after exiting the minibuffer and before performing an
+ action.
+
+ This hook runs even if Helm exits the minibuffer abnormally (e.g.
+ via ~helm-keyboard-quit~).
+
+- ~helm-process-deferred-sentinel-hook~ ::
+
+ #+vindex: helm-process-deferred-sentinel-hook
+
+ *Standard Value*:
+
+- ~helm-quit-hook~ ::
+
+ #+vindex: helm-quit-hook
+
+ *Standard Value*: nil
+
+ A hook that runs when quitting Helm.
+
+- ~helm-window-configuration-hook~ ::
+
+ #+vindex: helm-window-configuration-hook
+
+ *Standard Value*: nil
+
+ Runs when switching to and from the action buffer.
+ Should run also at end of ~helm-display-function~.
+
+** Library: helm-adaptive
+
+*** Modes in library ~helm-adaptive~
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-adaptive-mode~ ::
+
+ #+findex: helm-adaptive-mode
+
+ (helm-adaptive-mode &optional ARG)
+
+ Toggle adaptive sorting in all sources.
+
+ If called interactively, toggle ~Helm-Adaptive mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+*** Commands in library ~helm-adaptive~ (excludes keymaps)
+
+**** History
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-adaptive-save-history~ ::
+
+ #+findex: helm-adaptive-save-history
+
+ (helm-adaptive-save-history &optional ARG)
+
+ Save history information to the file given by ~helm-adaptive-history-file~.
+
+- ~helm-reset-adaptive-history~ ::
+
+ #+findex: helm-reset-adaptive-history
+
+ Delete all ~helm-adaptive-history~ and his file.
+ Useful when you have a old or corrupted
+ ~helm-adaptive-history-file~.
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-adaptive-mode~ ::
+
+ #+findex: helm-adaptive-mode
+
+ (helm-adaptive-mode &optional ARG)
+
+ Toggle adaptive sorting in all sources.
+
+ If called interactively, toggle ~Helm-Adaptive mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+*** Options in library =helm-adaptive=
+
+**** Mode
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-adaptive-mode-hook~ ::
+
+ #+vindex: helm-adaptive-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-adaptive-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+**** History
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-adaptive-history-file~ ::
+
+ #+vindex: helm-adaptive-history-file
+
+ *Standard Value*: ~/.emacs.d/helm-adaptive-history
+
+ Path of file where history information is stored.
+ When nil history is not saved nor restored after Emacs restart
+ unless you save/restore ~helm-adaptive-history~ with something
+ else like psession or desktop.
+
+- ~helm-adaptive-history-length~ ::
+
+ #+vindex: helm-adaptive-history-length
+
+ *Standard Value*: 50
+
+ Maximum number of candidates stored for a source.
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-adaptive-mode~ ::
+
+ #+vindex: helm-adaptive-mode
+
+ *Standard Value*: nil
+
+ (helm-adaptive-mode &optional ARG)
+
+ Toggle adaptive sorting in all sources.
+
+ If called interactively, toggle ~Helm-Adaptive mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-adaptive-sort-by-frequent-recent-usage~ ::
+
+ #+vindex: helm-adaptive-sort-by-frequent-recent-usage
+
+ *Standard Value*: t
+
+ Try to sort on an average of frequent and recent usage when non-nil.
+
+ When nil sort on frequency usage only.
+
+ Only frequency:
+ When candidate have low frequency, you have to hit on it many
+ times to make it going up on top.
+
+ Frequency+recent:
+ Even with a low frequency, candidate go up on top. If a candidate
+ have a high frequency but it is not used since some time, it goes
+ down slowly, but as soon you reuse it it go up on top quickly.
+
+*** Hooks in library =helm-adaptive=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-adaptive-mode-hook~ ::
+
+ #+vindex: helm-adaptive-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-adaptive-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+** Library: helm-bookmark
+
+*** Commands in keymap ~helm-bookmark-find-files-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x C-d)}}} (~helm-bookmark-run-browse-project~) ::
+
+ #+findex: helm-bookmark-run-browse-project @r{(helm-bookmark-find-files-map)}
+
+ #+kindex: C-x C-d @r{(helm-bookmark-find-files-map)}
+
+ Run ~helm-bookmark-browse-project~ from keyboard.
+
+*** Commands in keymap ~helm-bookmark-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-d)}}} (~helm-bookmark-run-delete~) ::
+
+ #+findex: helm-bookmark-run-delete @r{(helm-bookmark-map)}
+
+ #+kindex: C-d @r{(helm-bookmark-map)}
+
+ Delete bookmark from keyboard.
+
+- {{{kbd(M-e)}}} (~helm-bookmark-run-edit~) ::
+
+ #+findex: helm-bookmark-run-edit @r{(helm-bookmark-map)}
+
+ #+kindex: M-e @r{(helm-bookmark-map)}
+
+ Run ~helm-bookmark-edit-bookmark~ from keyboard.
+
+- {{{kbd(C-c C-o)}}} (~helm-bookmark-run-jump-other-frame~) ::
+
+ #+findex: helm-bookmark-run-jump-other-frame @r{(helm-bookmark-map)}
+
+ #+kindex: C-c C-o @r{(helm-bookmark-map)}
+
+ Jump to bookmark other frame from keyboard.
+
+- {{{kbd(C-c o)}}} (~helm-bookmark-run-jump-other-window~) ::
+
+ #+findex: helm-bookmark-run-jump-other-window @r{(helm-bookmark-map)}
+
+ #+kindex: C-c o @r{(helm-bookmark-map)}
+
+ Jump to bookmark from keyboard.
+
+- {{{kbd(C-])}}} (~helm-bookmark-toggle-filename~) ::
+
+ #+findex: helm-bookmark-toggle-filename @r{(helm-bookmark-map)}
+
+ #+kindex: C-] @r{(helm-bookmark-map)}
+
+ Toggle bookmark location visibility.
+
+*** Commands in library ~helm-bookmark~ (excludes keymaps)
+
+**** Bookmarks
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-bookmarks~ ::
+
+ #+findex: helm-bookmarks
+
+ Preconfigured ~helm~ for bookmarks.
+
+- {{{kbd(C-x c C-x r b)}}} (~helm-filtered-bookmarks~) ::
+
+ #+findex: helm-filtered-bookmarks
+
+ #+kindex: C-x c C-x r b
+
+ Preconfigured ~helm~ for bookmarks (filtered by category).
+ Optional source ~helm-source-bookmark-addressbook~ is loaded only
+ if external addressbook-bookmark package is installed.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-bookmark-rename~ ::
+
+ #+findex: helm-bookmark-rename
+
+ (helm-bookmark-rename OLD &optional NEW BATCH)
+
+ Change bookmark's name from OLD to NEW.
+ Interactively:
+ If called from the keyboard, then prompt for OLD.
+ If called from the menubar, select OLD from a menu.
+ If NEW is nil, then prompt for its string value.
+
+ If BATCH is non-nil, then do not rebuild the menu list.
+
+ While the user enters the new name, repeated ~C-w~ inserts
+ consecutive words from the buffer into the new bookmark name.
+
+*** Options in library =helm-bookmark=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-bookmark-default-filtered-sources~ ::
+
+ #+vindex: helm-bookmark-default-filtered-sources
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-source-bookmark-org helm-source-bookmark-files&dirs helm-source-bookmark-helm-find-files helm-source-bookmark-info helm-source-bookmark-gnus helm-source-bookmark-man helm-source-bookmark-images helm-source-bookmark-w3m helm-source-bookmark-uncategorized helm-source-bookmark-set)
+ #+end_src
+
+ List of sources to use in ~helm-filtered-bookmarks~.
+
+- ~helm-bookmark-show-location~ ::
+
+ #+vindex: helm-bookmark-show-location
+
+ *Standard Value*: nil
+
+ Show location of bookmark on display.
+
+** Library: helm-buffers
+
+*** Commands in keymap ~helm-buffer-map~
+
+**** Control what you see
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c a)}}} (~helm-buffers-toggle-show-hidden-buffers~) ::
+
+ #+findex: helm-buffers-toggle-show-hidden-buffers @r{(helm-buffer-map)}
+
+ #+kindex: C-c a @r{(helm-buffer-map)}
+
+- {{{kbd(C-])}}} (~helm-toggle-buffers-details~) ::
+
+ #+findex: helm-toggle-buffers-details @r{(helm-buffer-map)}
+
+ #+kindex: C-] @r{(helm-buffer-map)}
+
+**** Browse Project
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x C-d)}}} (~helm-buffers-run-browse-project~) ::
+
+ #+findex: helm-buffers-run-browse-project @r{(helm-buffer-map)}
+
+ #+kindex: C-x C-d @r{(helm-buffer-map)}
+
+ Run ~helm-buffers-browse-project~ from key.
+
+**** Switch to Buffer in other frame, window or tab
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-o)}}} (~helm-buffer-switch-other-frame~) ::
+
+ #+findex: helm-buffer-switch-other-frame @r{(helm-buffer-map)}
+
+ #+kindex: C-c C-o @r{(helm-buffer-map)}
+
+ Run switch to other frame action from ~helm-source-buffers-list~.
+
+- {{{kbd(C-c o)}}} (~helm-buffer-switch-other-window~) ::
+
+ #+findex: helm-buffer-switch-other-window @r{(helm-buffer-map)}
+
+ #+kindex: C-c o @r{(helm-buffer-map)}
+
+ Run switch to other window action from ~helm-source-buffers-list~.
+
+- {{{kbd(C-c C-t)}}} (~helm-buffers-switch-to-buffer-new-tab~) ::
+
+ #+findex: helm-buffers-switch-to-buffer-new-tab @r{(helm-buffer-map)}
+
+ #+kindex: C-c C-t @r{(helm-buffer-map)}
+
+ Run switch to buffer in other tab action from ~helm-source-buffers-list~.
+
+**** Run Occur
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-s)}}} (~helm-buffers-run-occur~) ::
+
+ #+findex: helm-buffers-run-occur @r{(helm-buffer-map)}
+
+ #+kindex: C-s @r{(helm-buffer-map)}
+
+ Run ~helm-multi-occur-as-action~ by key.
+
+**** Query Replace on Buffers' contents
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-%)}}} (~helm-buffer-run-query-replace~) ::
+
+ #+findex: helm-buffer-run-query-replace @r{(helm-buffer-map)}
+
+ #+kindex: M-% @r{(helm-buffer-map)}
+
+ Run Query replace action from ~helm-source-buffers-list~.
+
+- {{{kbd(C-M-%)}}} (~helm-buffer-run-query-replace-regexp~) ::
+
+ #+findex: helm-buffer-run-query-replace-regexp @r{(helm-buffer-map)}
+
+ #+kindex: C-M-% @r{(helm-buffer-map)}
+
+ Run Query replace regexp action from ~helm-source-buffers-list~.
+
+**** Mark similar Buffers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-M-SPC)}}} (~helm-buffers-mark-similar-buffers~) ::
+
+ #+findex: helm-buffers-mark-similar-buffers @r{(helm-buffer-map)}
+
+ #+kindex: C-M-SPC @r{(helm-buffer-map)}
+
+ Mark All buffers that have same property ~type~ than current.
+ I.e. same color.
+
+**** Save Buffer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x C-s)}}} (~helm-buffer-save-persistent~) ::
+
+ #+findex: helm-buffer-save-persistent @r{(helm-buffer-map)}
+
+ #+kindex: C-x C-s @r{(helm-buffer-map)}
+
+ Save buffer without quitting Helm.
+
+- {{{kbd(C-x s)}}} (~helm-buffer-run-save-some-buffers~) ::
+
+ #+findex: helm-buffer-run-save-some-buffers @r{(helm-buffer-map)}
+
+ #+kindex: C-x s @r{(helm-buffer-map)}
+
+ Save unsaved file buffers without quitting Helm.
+
+**** Run Diff and friends
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-=)}}} (~helm-buffer-diff-persistent~) ::
+
+ #+findex: helm-buffer-diff-persistent @r{(helm-buffer-map)}
+
+ #+kindex: C-= @r{(helm-buffer-map)}
+
+ Toggle diff buffer without quitting helm.
+
+- {{{kbd(C-c =)}}} (~helm-buffer-run-ediff~) ::
+
+ #+findex: helm-buffer-run-ediff @r{(helm-buffer-map)}
+
+ #+kindex: C-c = @r{(helm-buffer-map)}
+
+ Run ediff action from ~helm-source-buffers-list~.
+
+- {{{kbd(M-=)}}} (~helm-buffer-run-ediff-merge~) ::
+
+ #+findex: helm-buffer-run-ediff-merge @r{(helm-buffer-map)}
+
+ #+kindex: M-= @r{(helm-buffer-map)}
+
+ Run ediff action from ~helm-source-buffers-list~.
+
+**** Kill Buffers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c d)}}} (~helm-buffer-run-kill-persistent~) ::
+
+ #+findex: helm-buffer-run-kill-persistent @r{(helm-buffer-map)}
+
+ #+kindex: C-c d @r{(helm-buffer-map)}
+
+ Kill buffer without quitting Helm.
+
+- {{{kbd(M-D)}}} (~helm-buffer-run-kill-buffers~) ::
+
+ #+findex: helm-buffer-run-kill-buffers @r{(helm-buffer-map)}
+
+ #+kindex: M-D @r{(helm-buffer-map)}
+
+ Run kill buffer action from ~helm-source-buffers-list~.
+
+**** Rename Buffer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-R)}}} (~helm-buffer-run-rename-buffer~) ::
+
+ #+findex: helm-buffer-run-rename-buffer @r{(helm-buffer-map)}
+
+ #+kindex: M-R @r{(helm-buffer-map)}
+
+ Run rename buffer action from ~helm-source-buffers-list~.
+
+**** Revert Buffer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-G)}}} (~helm-buffer-revert-persistent~) ::
+
+ #+findex: helm-buffer-revert-persistent @r{(helm-buffer-map)}
+
+ #+kindex: M-G @r{(helm-buffer-map)}
+
+ Revert buffer without quitting helm.
+
+**** Goto line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-g M-g)}}} (~helm-buffer-run-goto-line~) ::
+
+ #+findex: helm-buffer-run-goto-line @r{(helm-buffer-map)}
+
+ #+kindex: M-g M-g @r{(helm-buffer-map)}
+
+ Switch to buffer at line number.
+
+**** Run ZGrep
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-g s)}}} (~helm-buffer-run-zgrep~) ::
+
+ #+findex: helm-buffer-run-zgrep @r{(helm-buffer-map)}
+
+ #+kindex: M-g s @r{(helm-buffer-map)}
+
+ Run Grep action from ~helm-source-buffers-list~.
+
+*** Commands in keymap ~helm-buffer-not-found-map~
+
+**** Create new Buffers in other frame or window
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-o)}}} (~helm-buffers-not-found-run-switch-of~) ::
+
+ #+findex: helm-buffers-not-found-run-switch-of @r{(helm-buffer-not-found-map)}
+
+ #+kindex: C-c C-o @r{(helm-buffer-not-found-map)}
+
+ Run create new buffer other frame action from keymap.
+
+- {{{kbd(C-c o)}}} (~helm-buffers-not-found-run-switch-ow~) ::
+
+ #+findex: helm-buffers-not-found-run-switch-ow @r{(helm-buffer-not-found-map)}
+
+ #+kindex: C-c o @r{(helm-buffer-not-found-map)}
+
+ Run create new buffer other window action from keymap.
+
+*** Commands in library ~helm-buffers~ (excludes keymaps)
+
+**** Mini
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-mini~ ::
+
+ #+findex: helm-mini
+
+ Preconfigured ~helm~ displaying ~helm-mini-default-sources~.
+
+- ~helm-quit-and-helm-mini~ ::
+
+ #+findex: helm-quit-and-helm-mini
+
+ Drop into ~helm-mini~ from ~helm~.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-buffer-run-grep~ ::
+
+ #+findex: helm-buffer-run-grep
+
+ Run Grep action from ~helm-source-buffers-list~.
+
+- {{{kbd(C-x c C-x C-b)}}} ::
+- {{{kbd(C-x C-b)}}} (~helm-buffers-list~) ::
+
+ #+findex: helm-buffers-list
+
+ #+kindex: C-x c C-x C-b
+ #+kindex: C-x C-b
+
+ Preconfigured ~helm~ to list buffers.
+
+*** Options in library =helm-buffers=
+
+**** Buffer List
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-boring-buffer-regexp-list~ ::
+
+ #+vindex: helm-boring-buffer-regexp-list
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("\\` " "\\`\\*helm" "\\`\\*Echo Area" "\\`\\*Minibuf")
+ #+end_src
+
+ The regexp list that match boring buffers.
+ Buffer candidates matching these regular expression will be
+ filtered from the list of candidates if the
+ ~helm-skip-boring-buffers~ candidate transformer is used.
+
+- ~helm-buffer-list-reorder-fn~ ::
+
+ #+vindex: helm-buffer-list-reorder-fn
+
+ *Standard Value*: helm-buffers-reorder-buffer-list
+
+ A function in charge of ordering the initial buffer list.
+ It takes two arguments VISIBLES buffers and OTHERS buffers.
+ Arg VISIBLES handles the buffers visibles in this frame.
+ Arg OTHERS handles all the other buffers.
+ You can write a function that reorder VISIBLES and OTHERS as you
+ want.
+ Default function returns OTHERS buffers on top and VISIBLES
+ buffer at the end. See ~helm-buffers-reorder-buffer-list~.
+
+- ~helm-white-buffer-regexp-list~ ::
+
+ #+vindex: helm-white-buffer-regexp-list
+
+ *Standard Value*: nil
+
+ The regexp list of not boring buffers.
+ These buffers will be displayed even if they match one of
+ ~helm-boring-buffer-regexp-list~.
+
+**** Buffer uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-buffer--pretty-names~ ::
+
+ #+vindex: helm-buffer--pretty-names
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ((dired-mode . "Dired")
+ (lisp-interaction-mode . "Lisp Inter"))
+ #+end_src
+
+ An alist specifying pretty names for modes.
+ Most of the time buffer’s ~mode-name~ is a string so no need to
+ add it here as there is no need to compute it, but sometimes it
+ may be a mode-line specification which may be costly to compute,
+ in this case add here the pretty name as a string to avoid this
+ costly computation. Also if some pretty names are too long you
+ can add your own abbreviation here.
+
+- ~helm-buffer-details-flag~ ::
+
+ #+vindex: helm-buffer-details-flag
+
+ *Standard Value*: t
+
+ Always show details in buffer list when non-nil.
+
+- ~helm-buffer-max-length~ ::
+
+ #+vindex: helm-buffer-max-length
+
+ *Standard Value*: 20
+
+ Max length of buffer names before truncate.
+ When disabled (nil) use the longest ~buffer-name~ length found.
+
+- ~helm-buffer-skip-remote-checking~ ::
+
+ #+vindex: helm-buffer-skip-remote-checking
+
+ *Standard Value*: nil
+
+ Ignore checking for ~file-exists-p~ on remote files.
+
+**** Buffers uncategorized uncategorized uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-buffers-column-separator~ ::
+
+ #+vindex: helm-buffers-column-separator
+
+ *Standard Value*:
+
+ Separator for columns in buffer listing.
+
+- ~helm-buffers-end-truncated-string~ ::
+
+ #+vindex: helm-buffers-end-truncated-string
+
+ *Standard Value*: ...
+
+ The string to display at end of truncated buffer names.
+
+- ~helm-buffers-favorite-modes~ ::
+
+ #+vindex: helm-buffers-favorite-modes
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (lisp-interaction-mode emacs-lisp-mode text-mode org-mode)
+ #+end_src
+
+ List of preferred mode to open new buffers with.
+
+- ~helm-buffers-fuzzy-matching~ ::
+
+ #+vindex: helm-buffers-fuzzy-matching
+
+ *Standard Value*: nil
+
+ Fuzzy matching buffer names when non-nil.
+ Only buffer names are fuzzy matched when this is enabled,
+ ~major-mode~ matching is not affected by this.
+
+- ~helm-buffers-left-margin-width~ ::
+
+ #+vindex: helm-buffers-left-margin-width
+
+ *Standard Value*: 0
+
+ ~left-margin-width~ value for ~helm-mini~ and ~helm-buffers-list~.
+
+- ~helm-buffers-maybe-switch-to-tab~ ::
+
+ #+vindex: helm-buffers-maybe-switch-to-tab
+
+ *Standard Value*: nil
+
+ Switch to buffer in its tab when non nil.
+ This has no effect when ~tab-bar-mode~ is not available.
+
+- ~helm-buffers-sort-fn~ ::
+
+ #+vindex: helm-buffers-sort-fn
+
+ *Standard Value*: helm-fuzzy-matching-default-sort-fn
+
+ The sort function to use in ~helm-buffers-list~.
+
+ Default to ~helm-fuzzy-sort-fn~ you can use
+ ~helm-fuzzy-matching-sort-fn-preserve-ties-order~ as alternative if
+ you want to keep the recentest order when narrowing candidates.
+
+- ~helm-buffers-truncate-lines~ ::
+
+ #+vindex: helm-buffers-truncate-lines
+
+ *Standard Value*: t
+
+ Truncate lines in ~helm-buffers-list~ when non-nil.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-mini-default-sources~ ::
+
+ #+vindex: helm-mini-default-sources
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-source-buffers-list helm-source-recentf helm-source-buffer-not-found)
+ #+end_src
+
+ Default sources list used in ~helm-mini~.
+
+ When adding a source here it is up to you to ensure the library
+ of this source is accessible and properly loaded.
+
+** Library: helm-color
+
+*** Commands in keymap ~helm-color-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c n)}}} (~helm-color-run-insert-name~) ::
+
+ #+findex: helm-color-run-insert-name @r{(helm-color-map)}
+
+ #+kindex: C-c n @r{(helm-color-map)}
+
+ Insert name of color from ~helm-source-colors~.
+
+- {{{kbd(C-c r)}}} (~helm-color-run-insert-rgb~) ::
+
+ #+findex: helm-color-run-insert-rgb @r{(helm-color-map)}
+
+ #+kindex: C-c r @r{(helm-color-map)}
+
+ Insert RGB of color from ~helm-source-colors~.
+
+- {{{kbd(C-c N)}}} (~helm-color-run-kill-name~) ::
+
+ #+findex: helm-color-run-kill-name @r{(helm-color-map)}
+
+ #+kindex: C-c N @r{(helm-color-map)}
+
+ Kill name of color from ~helm-source-colors~.
+
+- {{{kbd(C-c R)}}} (~helm-color-run-kill-rgb~) ::
+
+ #+findex: helm-color-run-kill-rgb @r{(helm-color-map)}
+
+ #+kindex: C-c R @r{(helm-color-map)}
+
+ Kill RGB of color from ~helm-source-colors~.
+
+*** Commands in library ~helm-color~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c c)}}} (~helm-colors~) ::
+
+ #+findex: helm-colors
+
+ #+kindex: C-x c c
+
+ Preconfigured ~helm~ for color.
+
+** Library: helm-comint
+
+*** Commands in keymap ~helm-comint-prompts-keymap~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-o)}}} (~helm-comint-prompts-other-frame~) ::
+
+ #+findex: helm-comint-prompts-other-frame @r{(helm-comint-prompts-keymap)}
+
+ #+kindex: C-c C-o @r{(helm-comint-prompts-keymap)}
+
+- {{{kbd(C-c o)}}} (~helm-comint-prompts-other-window~) ::
+
+ #+findex: helm-comint-prompts-other-window @r{(helm-comint-prompts-keymap)}
+
+ #+kindex: C-c o @r{(helm-comint-prompts-keymap)}
+
+*** Commands in library ~helm-comint~ (excludes keymaps)
+
+**** Prompts
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-comint-prompts~ ::
+
+ #+findex: helm-comint-prompts
+
+ Pre-configured ~helm~ to browse the prompts of the current comint buffer.
+
+- ~helm-comint-prompts-all~ ::
+
+ #+findex: helm-comint-prompts-all
+
+ Pre-configured ~helm~ to browse the prompts of all comint sessions.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-comint-input-ring~ ::
+
+ #+findex: helm-comint-input-ring
+
+ Preconfigured ~helm~ that provide completion of ~comint~ history.
+
+*** Options in library =helm-comint=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-comint-max-offset~ ::
+
+ #+vindex: helm-comint-max-offset
+
+ *Standard Value*: 400
+
+ Max number of chars displayed per candidate in comint-input-ring browser.
+ When t, don’t truncate candidate, show all.
+ By default it is approximatively the number of bits contained in
+ five lines of 80 chars each i.e 80*5.
+ Note that if you set this to nil multiline will be disabled, i.e
+ you will not have anymore separators between candidates.
+
+- ~helm-comint-mode-list~ ::
+
+ #+vindex: helm-comint-mode-list
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (comint-mode slime-repl-mode sly-mrepl-mode sql-interactive-mode)
+ #+end_src
+
+ Supported modes for prompt navigation.
+ Derived modes (e.g., Geiser’s REPL) are automatically supported.
+
+- ~helm-comint-next-prompt-function~ ::
+
+ #+vindex: helm-comint-next-prompt-function
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ((sly-mrepl-mode lambda nil
+ (sly-mrepl-next-prompt)
+ (point)))
+ #+end_src
+
+ Alist of (MODE . NEXT-PROMPT-FUNCTION) to use.
+ If the current major mode is a key in this list, the associated
+ function will be used to navigate the prompts.
+ The function must return the point after the prompt.
+ Otherwise (comint-next-prompt 1) will be used.
+
+- ~helm-comint-prompts-promptidx-p~ ::
+
+ #+vindex: helm-comint-prompts-promptidx-p
+
+ *Standard Value*: t
+
+ Show prompt number.
+
+** Library: helm-command
+
+*** Commands in keymap ~helm-M-x-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-u)}}} (~helm-M-x-universal-argument~) ::
+
+ #+findex: helm-M-x-universal-argument @r{(helm-M-x-map)}
+
+ #+kindex: C-u @r{(helm-M-x-map)}
+
+ Same as ~universal-argument~ but for ~helm-M-x~.
+
+*** Commands in library ~helm-command~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c M-x)}}} ::
+- {{{kbd(<execute>)}}} ::
+- {{{kbd(<menu>)}}} ::
+- {{{kbd(M-x)}}} (~helm-M-x~) ::
+
+ #+findex: helm-M-x
+
+ #+kindex: C-x c M-x
+ #+kindex: <execute>
+ #+kindex: <menu>
+ #+kindex: M-x
+
+ (helm-M-x ARG)
+
+ Preconfigured ~helm~ for Emacs commands.
+ It is ~helm~ replacement of regular ~M-x~
+ ~execute-extended-command~.
+
+ Unlike regular ~M-x~ Emacs vanilla ~execute-extended-command~
+ command, the prefix args if needed, can be passed AFTER starting
+ ~helm-M-x~. When a prefix arg is passed BEFORE starting
+ ~helm-M-x~, the first ~C-u~ while in ~helm-M-x~ session will
+ disable it.
+
+ You can get help on each command by persistent action.
+
+*** Options in library =helm-command=
+
+**** X
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-M-x-always-save-history~ ::
+
+ #+vindex: helm-M-x-always-save-history
+
+ *Standard Value*: nil
+
+ ~helm-M-x~ save command in ~extended-command-history~ even when it fails.
+
+- ~helm-M-x-reverse-history~ ::
+
+ #+vindex: helm-M-x-reverse-history
+
+ *Standard Value*: nil
+
+ The history source of ~helm-M-x~ appear in second position when non-nil.
+
+- ~helm-M-x-use-completion-styles~ ::
+
+ #+vindex: helm-M-x-use-completion-styles
+
+ *Standard Value*: nil
+
+ Use ~completion-styles~ and dynamic completion when non nil.
+ It is disable by default as it is a regression starting from Emacs-27.
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-mode~ ::
+
+ #+vindex: helm-mode
+
+ *Standard Value*: t
+
+ (helm-mode &optional ARG)
+
+ Toggle generic helm completion.
+
+ If called interactively, toggle ~Helm mode~. If the prefix
+ argument is positive, enable the mode, and if it is zero or
+ negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+ All functions in Emacs that use ~completing-read~,
+ ~read-file-name~, ~completion-in-region~ and friends will use helm
+ interface when this mode is turned on.
+
+ However you can modify this behavior for functions of your choice
+ with ~helm-completing-read-handlers-alist~.
+
+ Called with a positive arg, turn on unconditionally, with a
+ negative arg turn off.
+ You can toggle it with M-x ~helm-mode~.
+
+ About ~ido-mode~:
+ DO NOT enable ~ido-everywhere~ when using ~helm-mode~. Instead of
+ using ~ido-mode~, add the commands where you want to use ido to
+ ~helm-completing-read-handlers-alist~ with ~ido~ as value.
+
+ Note: This mode is incompatible with Emacs23.
+
+*** Hooks in library =helm-command=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-M-x--before-action-hook~ ::
+
+ #+vindex: helm-M-x--before-action-hook
+
+ *Standard Value*:
+
+- ~helm-M-x--move-selection-after-hook~ ::
+
+ #+vindex: helm-M-x--move-selection-after-hook
+
+ *Standard Value*:
+
+** Library: helm-config
+
+** Library: helm-dabbrev
+
+*** Commands in library ~helm-dabbrev~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-/)}}} (~helm-dabbrev~) ::
+
+ #+findex: helm-dabbrev
+
+ #+kindex: M-/
+
+ Preconfigured helm for dynamic abbreviations.
+
+*** Options in library =helm-dabbrev=
+
+**** Search
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-dabbrev-always-search-all~ ::
+
+ #+vindex: helm-dabbrev-always-search-all
+
+ *Standard Value*: t
+
+ Always search in all buffers when non--nil.
+ Note that even if nil, a search in all buffers will occur if the
+ length of candidates is <= than
+ ~helm-dabbrev-max-length-result~.
+
+- ~helm-dabbrev-case-fold-search~ ::
+
+ #+vindex: helm-dabbrev-case-fold-search
+
+ *Standard Value*: smart
+
+ Set ~case-fold-search~ in ~helm-dabbrev~.
+ Same as ~helm-case-fold-search~ but for ~helm-dabbrev~.
+ Note that this is not affecting searching in Helm buffer, but the
+ initial search for all candidates in buffer(s).
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-dabbrev-candidates-number-limit~ ::
+
+ #+vindex: helm-dabbrev-candidates-number-limit
+
+ *Standard Value*: 1000
+
+ Maximum number of candidates to collect.
+
+ The higher this number is, the slower the computation of
+ candidates will be. You can use safely a higher value with
+ emacs-26+.
+ Note that this have nothing to do with
+ ~helm-candidate-number-limit~, this means that computation of
+ candidates stop when this value is reached but only
+ ~helm-candidate-number-limit~ candidates are displayed in the
+ Helm buffer.
+
+- ~helm-dabbrev-cycle-threshold~ ::
+
+ #+vindex: helm-dabbrev-cycle-threshold
+
+ *Standard Value*: 5
+
+ Number of time helm-dabbrev cycle before displaying helm completion.
+ When nil or 0 disable cycling.
+
+- ~helm-dabbrev-ignored-buffers-regexps~ ::
+
+ #+vindex: helm-dabbrev-ignored-buffers-regexps
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("\\*helm" "\\*Messages" "\\*Echo Area" "\\*Buffer List")
+ #+end_src
+
+ List of regexps matching names of buffers that ~helm-dabbrev~ should not check.
+
+- ~helm-dabbrev-lineno-around~ ::
+
+ #+vindex: helm-dabbrev-lineno-around
+
+ *Standard Value*: 30
+
+ Search first in this number of lines before and after point.
+
+- ~helm-dabbrev-major-mode-assoc~ ::
+
+ #+vindex: helm-dabbrev-major-mode-assoc
+
+ *Standard Value*: nil
+
+ Major mode association alist.
+
+ This allow helm-dabbrev searching in buffers with the associated
+ ~major-mode~.
+ E.g. (emacs-lisp-mode . lisp-interaction-mode)
+
+ will allow searching in the lisp-interaction-mode buffer when
+ ~current-buffer~ is an ~emacs-lisp-mode~ buffer and vice versa
+ i.e. no need to provide (lisp-interaction-mode .
+ emacs-lisp-mode) association.
+
+ When nil check is the searched buffer has same ~major-mode~ than
+ the ~current-buffer~.
+
+ This has no effect when ~helm-dabbrev-related-buffer-fn~ is nil
+ or of course bound to a function that doesn’t handle this var.
+
+- ~helm-dabbrev-related-buffer-fn~ ::
+
+ #+vindex: helm-dabbrev-related-buffer-fn
+
+ *Standard Value*: helm-dabbrev--same-major-mode-p
+
+ A function that decide if a buffer to search in its related to ~current-buffer~.
+
+ This is actually determined by comparing ~major-mode~ of the
+ buffer to search and the ~current-buffer~.
+
+ The function take one arg, the buffer which is current, look at
+ ~helm-dabbrev--same-major-mode-p~ for an example.
+
+ When nil all buffers are considered related to ~current-buffer~.
+
+** Library: helm-easymenu
+
+** Library: helm-elisp
+
+*** Commands in library ~helm-elisp~ (excludes keymaps)
+
+**** Lisp
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-lisp-indent~ ::
+
+ #+findex: helm-lisp-indent
+
+**** Point
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-complete-file-name-at-point~ ::
+
+ #+findex: helm-complete-file-name-at-point
+
+ (helm-complete-file-name-at-point &optional FORCE)
+
+ Preconfigured Helm to complete file name at point.
+
+- {{{kbd(C-x c <tab>)}}} (~helm-lisp-completion-at-point~) ::
+
+ #+findex: helm-lisp-completion-at-point
+
+ #+kindex: C-x c <tab>
+
+ Preconfigured Helm for Lisp symbol completion at point.
+
+- ~helm-lisp-completion-or-file-name-at-point~ ::
+
+ #+findex: helm-lisp-completion-or-file-name-at-point
+
+ Preconfigured Helm to complete Lisp symbol or filename at point.
+ Filename completion happens if string start after or between a
+ double quote.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c a)}}} ::
+- {{{kbd(C-h a)}}} ::
+- {{{kbd(<f1> a)}}} ::
+- {{{kbd(<help> a)}}} (~helm-apropos~) ::
+
+ #+findex: helm-apropos
+
+ #+kindex: C-x c a
+ #+kindex: C-h a
+ #+kindex: <f1> a
+ #+kindex: <help> a
+
+ (helm-apropos DEFAULT)
+
+ Preconfigured Helm to describe commands, functions, variables and faces.
+ In non interactives calls DEFAULT argument should be provided as
+ a string, i.e. the ~symbol-name~ of any existing symbol.
+
+- ~helm-complex-command-history~ ::
+
+ #+findex: helm-complex-command-history
+
+ Preconfigured ~helm~ for complex command history.
+
+- ~helm-locate-library~ ::
+
+ #+findex: helm-locate-library
+
+ Preconfigured helm to locate elisp libraries.
+
+- ~helm-manage-advice~ ::
+
+ #+findex: helm-manage-advice
+
+ Preconfigured ~helm~ to disable/enable function advices.
+
+- ~helm-sexp-eval-1~ ::
+
+ #+findex: helm-sexp-eval-1
+
+- ~helm-timers~ ::
+
+ #+findex: helm-timers
+
+ Preconfigured ~helm~ for timers.
+
+*** Options in library =helm-elisp=
+
+**** Fuzzy
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-locate-library-fuzzy-match~ ::
+
+ #+vindex: helm-locate-library-fuzzy-match
+
+ *Standard Value*: t
+
+ Enable fuzzy-matching in ~helm-locate-library~ when non--nil.
+
+**** Apropos
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-apropos-defaut-info-lookup-sources~ ::
+
+ #+vindex: helm-apropos-defaut-info-lookup-sources
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-source-info-elisp helm-source-info-cl helm-source-info-eieio)
+ #+end_src
+
+ A list of sources to look into when searching info page of a symbol.
+
+- ~helm-apropos-fuzzy-match~ ::
+
+ #+vindex: helm-apropos-fuzzy-match
+
+ *Standard Value*: nil
+
+ Enable fuzzy matching for ~helm-apropos~ when non-nil.
+
+**** Completion
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-lisp-fuzzy-completion~ ::
+
+ #+vindex: helm-lisp-fuzzy-completion
+
+ *Standard Value*: nil
+
+ Enable fuzzy matching in emacs-lisp completion when non-nil.
+ NOTE: This enables fuzzy matching in Helm native implementation of
+ elisp completion, but not on helmized elisp completion, i.e. fuzzy
+ completion is not available in ~completion-at-point~.
+
+- ~helm-show-completion-min-window-height~ ::
+
+ #+vindex: helm-show-completion-min-window-height
+
+ *Standard Value*: 7
+
+ Minimum completion window height used in show completion.
+ This is used in macro ~with-helm-show-completion~.
+
+- ~helm-turn-on-show-completion~ ::
+
+ #+vindex: helm-turn-on-show-completion
+
+ *Standard Value*: t
+
+ Display candidate in ~current-buffer~ while moving selection when non--nil.
+
+**** Function
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-apropos-function-list~ ::
+
+ #+vindex: helm-apropos-function-list
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-def-source--emacs-commands helm-def-source--emacs-functions helm-def-source--eieio-classes helm-def-source--eieio-generic helm-def-source--emacs-variables helm-def-source--emacs-faces)
+ #+end_src
+
+ A list of functions that build helm sources to use in ~helm-apropos~.
+
+- ~helm-elisp-help-function~ ::
+
+ #+vindex: helm-elisp-help-function
+
+ *Standard Value*: helm-elisp-show-help
+
+ Function for displaying help for Lisp symbols.
+
+- ~helm-lisp-quoted-function-list~ ::
+
+ #+vindex: helm-lisp-quoted-function-list
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (funcall apply mapc cl-mapc mapcar cl-mapcar callf callf2 cl-callf cl-callf2 fset fboundp fmakunbound symbol-function)
+ #+end_src
+
+ List of function where quoted function completion happen.
+ E.g. give only function names after (funcall ’.
+
+- ~helm-lisp-unquoted-function-list~ ::
+
+ #+vindex: helm-lisp-unquoted-function-list
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ #'defadvice
+ #+end_src
+
+ List of function where unquoted function completion happen.
+ E.g. give only function names after (function .
+
+- ~helm-show-completion-display-function~ ::
+
+ #+vindex: helm-show-completion-display-function
+
+ *Standard Value*: helm-display-buffer-in-own-frame
+
+ The function used to display helm completion buffer.
+
+ This function is used by ~with-helm-show-completion~, when nil
+ fallback to ~helm-default-display-buffer~.
+
+ Default is to use a separate frame on graphic display and
+ ~helm-show-completion-default-display-function~ on non graphic
+ display.
+
+** Library: helm-elisp-package
+
+*** Commands in keymap ~helm-el-package-map~
+
+**** uncategorized Run
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c @)}}} (~helm-el-run-visit-homepage~) ::
+
+ #+findex: helm-el-run-visit-homepage @r{(helm-el-package-map)}
+
+ #+kindex: C-c @ @r{(helm-el-package-map)}
+
+**** uncategorized Package Run
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c i)}}} (~helm-el-run-package-install~) ::
+
+ #+findex: helm-el-run-package-install @r{(helm-el-package-map)}
+
+ #+kindex: C-c i @r{(helm-el-package-map)}
+
+- {{{kbd(C-c r)}}} (~helm-el-run-package-reinstall~) ::
+
+ #+findex: helm-el-run-package-reinstall @r{(helm-el-package-map)}
+
+ #+kindex: C-c r @r{(helm-el-package-map)}
+
+- {{{kbd(C-c d)}}} (~helm-el-run-package-uninstall~) ::
+
+ #+findex: helm-el-run-package-uninstall @r{(helm-el-package-map)}
+
+ #+kindex: C-c d @r{(helm-el-package-map)}
+
+- {{{kbd(C-c u)}}} (~helm-el-run-package-upgrade~) ::
+
+ #+findex: helm-el-run-package-upgrade @r{(helm-el-package-map)}
+
+ #+kindex: C-c u @r{(helm-el-package-map)}
+
+- {{{kbd(C-c U)}}} (~helm-el-run-package-upgrade-all~) ::
+
+ #+findex: helm-el-run-package-upgrade-all @r{(helm-el-package-map)}
+
+ #+kindex: C-c U @r{(helm-el-package-map)}
+
+**** uncategorized Package Show
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-A)}}} (~helm-el-package-show-all~) ::
+
+ #+findex: helm-el-package-show-all @r{(helm-el-package-map)}
+
+ #+kindex: M-A @r{(helm-el-package-map)}
+
+- {{{kbd(M-B)}}} (~helm-el-package-show-built-in~) ::
+
+ #+findex: helm-el-package-show-built-in @r{(helm-el-package-map)}
+
+ #+kindex: M-B @r{(helm-el-package-map)}
+
+- {{{kbd(M-I)}}} (~helm-el-package-show-installed~) ::
+
+ #+findex: helm-el-package-show-installed @r{(helm-el-package-map)}
+
+ #+kindex: M-I @r{(helm-el-package-map)}
+
+- {{{kbd(M-O)}}} (~helm-el-package-show-uninstalled~) ::
+
+ #+findex: helm-el-package-show-uninstalled @r{(helm-el-package-map)}
+
+ #+kindex: M-O @r{(helm-el-package-map)}
+
+- {{{kbd(M-U)}}} (~helm-el-package-show-upgrade~) ::
+
+ #+findex: helm-el-package-show-upgrade @r{(helm-el-package-map)}
+
+ #+kindex: M-U @r{(helm-el-package-map)}
+
+*** Commands in library ~helm-elisp-package~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c @)}}} (~helm-list-elisp-packages~) ::
+
+ #+findex: helm-list-elisp-packages
+
+ #+kindex: C-x c @
+
+ (helm-list-elisp-packages ARG)
+
+ Preconfigured ~helm~ for listing and handling Emacs packages.
+
+- ~helm-list-elisp-packages-no-fetch~ ::
+
+ #+findex: helm-list-elisp-packages-no-fetch
+
+ (helm-list-elisp-packages-no-fetch ARG)
+
+ Preconfigured Helm for Emacs packages.
+
+ Same as ~helm-list-elisp-packages~ but don't fetch packages on
+ remote. Called with a prefix ARG always fetch packages on
+ remote.
+
+*** Options in library =helm-elisp-package=
+
+**** Package
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-el-package-autoremove-on-start~ ::
+
+ #+vindex: helm-el-package-autoremove-on-start
+
+ *Standard Value*: nil
+
+ Try to autoremove no more needed packages on startup.
+ See ~package-autoremove~.
+
+- ~helm-el-package-initial-filter~ ::
+
+ #+vindex: helm-el-package-initial-filter
+
+ *Standard Value*: all
+
+ Show only installed, upgraded or all packages at startup.
+
+- ~helm-el-package-upgrade-on-start~ ::
+
+ #+vindex: helm-el-package-upgrade-on-start
+
+ *Standard Value*: nil
+
+ Show package upgrades on startup when non nil.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-el-truncate-lines~ ::
+
+ #+vindex: helm-el-truncate-lines
+
+ *Standard Value*: t
+
+ Truncate lines in ~helm-buffer~ when non-nil.
+
+** Library: helm-epa
+
+*** Modes in library ~helm-epa~
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-epa-mode~ ::
+
+ #+findex: helm-epa-mode
+
+ (helm-epa-mode &optional ARG)
+
+ Enable helm completion on gpg keys in epa functions.
+
+ If called interactively, toggle ~Helm-Epa mode~. If the prefix
+ argument is positive, enable the mode, and if it is zero or
+ negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+*** Commands in library ~helm-epa~ (excludes keymaps)
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-epa-mode~ ::
+
+ #+findex: helm-epa-mode
+
+ (helm-epa-mode &optional ARG)
+
+ Enable helm completion on gpg keys in epa functions.
+
+ If called interactively, toggle ~Helm-Epa mode~. If the prefix
+ argument is positive, enable the mode, and if it is zero or
+ negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-epa-list-keys~ ::
+
+ #+findex: helm-epa-list-keys
+
+ List all gpg keys.
+ This is the helm interface for ~epa-list-keys~.
+
+*** Options in library =helm-epa=
+
+**** Mode
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-epa-mode-hook~ ::
+
+ #+vindex: helm-epa-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-epa-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-epa-mode~ ::
+
+ #+vindex: helm-epa-mode
+
+ *Standard Value*: nil
+
+ (helm-epa-mode &optional ARG)
+
+ Enable helm completion on gpg keys in epa functions.
+
+ If called interactively, toggle ~Helm-Epa mode~. If the prefix
+ argument is positive, enable the mode, and if it is zero or
+ negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-epa-actions~ ::
+
+ #+vindex: helm-epa-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Show key" . epa--show-key)
+ ("encrypt file with key" . helm-epa-encrypt-file)
+ ("Copy keys to kill ring" . helm-epa-kill-keys-armor)
+ ("Delete keys" . helm-epa-delete-keys))
+ #+end_src
+
+ Actions for ~helm-epa-list-keys~.
+
+*** Hooks in library =helm-epa=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-epa-mode-hook~ ::
+
+ #+vindex: helm-epa-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-epa-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+** Library: helm-eshell
+
+*** Commands in keymap ~helm-eshell-prompts-keymap~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-o)}}} (~helm-eshell-prompts-other-frame~) ::
+
+ #+findex: helm-eshell-prompts-other-frame @r{(helm-eshell-prompts-keymap)}
+
+ #+kindex: C-c C-o @r{(helm-eshell-prompts-keymap)}
+
+- {{{kbd(C-c o)}}} (~helm-eshell-prompts-other-window~) ::
+
+ #+findex: helm-eshell-prompts-other-window @r{(helm-eshell-prompts-keymap)}
+
+ #+kindex: C-c o @r{(helm-eshell-prompts-keymap)}
+
+*** Commands in library ~helm-eshell~ (excludes keymaps)
+
+**** Eshell
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-eshell-history~ ::
+
+ #+findex: helm-eshell-history
+
+ Preconfigured Helm for Eshell history.
+
+- ~helm-eshell-prompts~ ::
+
+ #+findex: helm-eshell-prompts
+
+ Pre-configured ~helm~ to browse the prompts of the current Eshell.
+
+- ~helm-eshell-prompts-all~ ::
+
+ #+findex: helm-eshell-prompts-all
+
+ Pre-configured ~helm~ to browse the prompts of all Eshell sessions.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-esh-pcomplete~ ::
+
+ #+findex: helm-esh-pcomplete
+
+ Preconfigured ~helm~ to provide Helm completion in Eshell.
+
+*** Options in library =helm-eshell=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-eshell-fuzzy-match~ ::
+
+ #+vindex: helm-eshell-fuzzy-match
+
+ *Standard Value*: nil
+
+ Enable fuzzy matching in ~helm-esh-pcomplete~ when non-nil.
+
+- ~helm-eshell-prompts-promptidx-p~ ::
+
+ #+vindex: helm-eshell-prompts-promptidx-p
+
+ *Standard Value*: t
+
+ Show prompt number.
+
+*** Hooks in library =helm-eshell=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-eshell--quit-hook-fn~ ::
+
+ #+vindex: helm-eshell--quit-hook-fn
+
+ *Standard Value*:
+
+** Library: helm-eval
+
+*** Commands in keymap ~helm-eval-expression-map~
+
+**** uncategorized Helm
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-<tab>)}}} ::
+- {{{kbd(C-x c <tab>)}}} (~helm-lisp-completion-at-point~) ::
+
+ #+findex: helm-lisp-completion-at-point @r{(helm-eval-expression-map)}
+
+ #+kindex: C-<tab> @r{(helm-eval-expression-map)}
+ #+kindex: C-x c <tab> @r{(helm-eval-expression-map)}
+
+ Preconfigured Helm for Lisp symbol completion at point.
+
+**** uncategorized Char
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(<left>)}}} ::
+- {{{kbd(C-b)}}} (~backward-char~) ::
+
+ #+findex: backward-char @r{(helm-eval-expression-map)}
+
+ #+kindex: <left> @r{(helm-eval-expression-map)}
+ #+kindex: C-b @r{(helm-eval-expression-map)}
+
+ (backward-char &optional N)
+
+ Move point N characters backward (forward if N is negative).
+ On attempt to pass beginning or end of buffer, stop and signal error.
+ Interactively, N is the numeric prefix argument.
+ If N is omitted or nil, move point 1 character backward.
+
+ Depending on the bidirectional context, the movement may be to the
+ right or to the left on the screen. This is in contrast with
+ \[left-char], which see.
+
+- {{{kbd(<right>)}}} ::
+- {{{kbd(C-f)}}} (~forward-char~) ::
+
+ #+findex: forward-char @r{(helm-eval-expression-map)}
+
+ #+kindex: <right> @r{(helm-eval-expression-map)}
+ #+kindex: C-f @r{(helm-eval-expression-map)}
+
+ (forward-char &optional N)
+
+ Move point N characters forward (backward if N is negative).
+ On reaching end or beginning of buffer, stop and signal error.
+ Interactively, N is the numeric prefix argument.
+ If N is omitted or nil, move point 1 character forward.
+
+ Depending on the bidirectional context, the movement may be to the
+ right or to the left on the screen. This is in contrast with
+ \[right-char], which see.
+
+**** uncategorized Line
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-<return>)}}} (~helm-eval-new-line-and-indent~) ::
+
+ #+findex: helm-eval-new-line-and-indent @r{(helm-eval-expression-map)}
+
+ #+kindex: C-<return> @r{(helm-eval-expression-map)}
+
+- {{{kbd(M-<tab>)}}} (~lisp-indent-line~) ::
+
+ #+findex: lisp-indent-line @r{(helm-eval-expression-map)}
+
+ #+kindex: M-<tab> @r{(helm-eval-expression-map)}
+
+ (lisp-indent-line &optional INDENT)
+
+ Indent current line as Lisp code.
+
+- {{{kbd(<down>)}}} ::
+- {{{kbd(C-n)}}} (~next-line~) ::
+
+ #+findex: next-line @r{(helm-eval-expression-map)}
+
+ #+kindex: <down> @r{(helm-eval-expression-map)}
+ #+kindex: C-n @r{(helm-eval-expression-map)}
+
+ (next-line &optional ARG TRY-VSCROLL)
+
+ Move cursor vertically down ARG lines.
+ Interactively, vscroll tall lines if ~auto-window-vscroll~ is enabled.
+ Non-interactively, use TRY-VSCROLL to control whether to vscroll tall
+ lines: if either ~auto-window-vscroll~ or TRY-VSCROLL is nil, this
+ function will not vscroll.
+
+ ARG defaults to 1.
+
+ If there is no character in the target line exactly under the current column,
+ the cursor is positioned after the character in that line that spans this
+ column, or at the end of the line if it is not long enough.
+ If there is no line in the buffer after this one, behavior depends on the
+ value of ~next-line-add-newlines~. If non-nil, it inserts a newline character
+ to create a line, and moves the cursor to that line. Otherwise it moves the
+ cursor to the end of the buffer.
+
+ If the variable ~line-move-visual~ is non-nil, this command moves
+ by display lines. Otherwise, it moves by buffer lines, without
+ taking variable-width characters or continued lines into account.
+ See \[next-logical-line] for a command that always moves by buffer lines.
+
+ The command \[set-goal-column] can be used to create
+ a semipermanent goal column for this command.
+ Then instead of trying to move exactly vertically (or as close as possible),
+ this command moves to the specified goal column (or as close as possible).
+ The goal column is stored in the variable ~goal-column~, which is nil
+ when there is no goal column. Note that setting ~goal-column~
+ overrides ~line-move-visual~ and causes this command to move by buffer
+ lines rather than by display lines.
+
+- {{{kbd(<up>)}}} ::
+- {{{kbd(C-p)}}} (~previous-line~) ::
+
+ #+findex: previous-line @r{(helm-eval-expression-map)}
+
+ #+kindex: <up> @r{(helm-eval-expression-map)}
+ #+kindex: C-p @r{(helm-eval-expression-map)}
+
+ (previous-line &optional ARG TRY-VSCROLL)
+
+ Move cursor vertically up ARG lines.
+ Interactively, vscroll tall lines if ~auto-window-vscroll~ is enabled.
+ Non-interactively, use TRY-VSCROLL to control whether to vscroll tall
+ lines: if either ~auto-window-vscroll~ or TRY-VSCROLL is nil, this
+ function will not vscroll.
+
+ ARG defaults to 1.
+
+ If there is no character in the target line exactly over the current column,
+ the cursor is positioned after the character in that line that spans this
+ column, or at the end of the line if it is not long enough.
+
+ If the variable ~line-move-visual~ is non-nil, this command moves
+ by display lines. Otherwise, it moves by buffer lines, without
+ taking variable-width characters or continued lines into account.
+ See \[previous-logical-line] for a command that always moves by buffer lines.
+
+ The command \[set-goal-column] can be used to create
+ a semipermanent goal column for this command.
+ Then instead of trying to move exactly vertically (or as close as possible),
+ this command moves to the specified goal column (or as close as possible).
+ The goal column is stored in the variable ~goal-column~, which is nil
+ when there is no goal column. Note that setting ~goal-column~
+ overrides ~line-move-visual~ and causes this command to move by buffer
+ lines rather than by display lines.
+
+*** Commands in library ~helm-eval~ (excludes keymaps)
+
+**** Eval
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-eval-expression~ ::
+
+ #+findex: helm-eval-expression
+
+ (helm-eval-expression ARG)
+
+ Preconfigured ~helm~ for ~helm-source-evaluation-result~.
+
+- {{{kbd(C-x c C-:)}}} (~helm-eval-expression-with-eldoc~) ::
+
+ #+findex: helm-eval-expression-with-eldoc
+
+ #+kindex: C-x c C-:
+
+ Preconfigured ~helm~ for ~helm-source-evaluation-result~ with ~eldoc~ support.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c C-,)}}} (~helm-calcul-expression~) ::
+
+ #+findex: helm-calcul-expression
+
+ #+kindex: C-x c C-,
+
+ Preconfigured ~helm~ for ~helm-source-calculation-result~.
+
+*** Options in library =helm-eval=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-eldoc-in-minibuffer-show-fn~ ::
+
+ #+vindex: helm-eldoc-in-minibuffer-show-fn
+
+ *Standard Value*: helm-show-info-in-mode-line
+
+ A function to display eldoc info.
+ Should take one arg: the string to display.
+
+- ~helm-show-info-in-mode-line-delay~ ::
+
+ #+vindex: helm-show-info-in-mode-line-delay
+
+ *Standard Value*: 12
+
+ Eldoc will show info in mode-line during this delay if user is idle.
+
+** Library: helm-external
+
+*** Commands in library ~helm-external~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c C-c C-x)}}} (~helm-run-external-command~) ::
+
+ #+findex: helm-run-external-command
+
+ #+kindex: C-x c C-c C-x
+
+ (helm-run-external-command PROGRAM)
+
+ Preconfigured ~helm~ to run External PROGRAM asyncronously from Emacs.
+ If program is already running exit with error.
+ You can set your own list of commands with
+ ~helm-external-commands-list~.
+
+*** Options in library =helm-external=
+
+**** External
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-default-external-file-browser~ ::
+
+ #+vindex: helm-default-external-file-browser
+
+ *Standard Value*: nautilus
+
+ Default external file browser for your system.
+ Directories will be opened externally with it when opening file
+ externally in ~helm-find-files~.
+ Set to nil if you do not have an external file browser or do not
+ want to use it.
+ Windows users should set that to "explorer.exe".
+
+- ~helm-external-programs-associations~ ::
+
+ #+vindex: helm-external-programs-associations
+
+ *Standard Value*: nil
+
+ Alist to store externals programs associated with file extension.
+ This variable overhide setting in .mailcap file.
+ E.g.: ’(("jpg" . "gqview") ("pdf" . "xpdf"))
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-raise-command~ ::
+
+ #+vindex: helm-raise-command
+
+ *Standard Value*: nil
+
+ A shell command to jump to a window running specific program.
+ Need external program wmctrl.
+ This will be use with ~format~, so use something like "wmctrl -xa %s".
+
+** Library: helm-fd
+
+*** Commands in keymap ~helm-fd-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(DEL)}}} (~helm-delete-backward-no-update~) ::
+
+ #+findex: helm-delete-backward-no-update @r{(helm-fd-map)}
+
+ #+kindex: DEL @r{(helm-fd-map)}
+
+ (helm-delete-backward-no-update ARG)
+
+ Disable update and delete ARG chars backward.
+ Update is reenabled when idle 1s.
+
+- {{{kbd(M-<down>)}}} (~helm-fd-next-directory~) ::
+
+ #+findex: helm-fd-next-directory @r{(helm-fd-map)}
+
+ #+kindex: M-<down> @r{(helm-fd-map)}
+
+ Move to next directory in a helm-fd source.
+
+- {{{kbd(M-<up>)}}} (~helm-fd-previous-directory~) ::
+
+ #+findex: helm-fd-previous-directory @r{(helm-fd-map)}
+
+ #+kindex: M-<up> @r{(helm-fd-map)}
+
+ Move to previous directory in a helm-fd source.
+
+*** Options in library =helm-fd=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-fd-switches~ ::
+
+ #+vindex: helm-fd-switches
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("--hidden" "--type" "f" "--type" "d" "--color" "always")
+ #+end_src
+
+ A list of options to pass to fd shell command.
+
+** Library: helm-files
+
+*** Modes in library ~helm-files~
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff--delete-async-modeline-mode~ ::
+
+ #+findex: helm-ff--delete-async-modeline-mode
+
+ (helm-ff--delete-async-modeline-mode &optional ARG)
+
+ Notify mode-line that an async process run.
+
+ If called interactively, toggle `Helm-Ff--Delete-Async-Modeline
+ mode'. If the prefix argument is positive, enable the mode, and
+ if it is zero or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+*** Commands in keymap ~helm-browse-project-map~
+
+**** Run Grep on Project
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-g a)}}} (~helm-browse-project-run-ag~) ::
+
+ #+findex: helm-browse-project-run-ag @r{(helm-browse-project-map)}
+
+ #+kindex: M-g a @r{(helm-browse-project-map)}
+
+ Run ~helm-grep~ AG from ~helm-browse-project~.
+
+*** Commands in keymap ~helm-file-name-history-map~
+
+**** Act on File name history
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x C-f)}}} (~helm-ff-file-name-history-run-ff~) ::
+
+ #+findex: helm-ff-file-name-history-run-ff @r{(helm-file-name-history-map)}
+
+ #+kindex: C-x C-f @r{(helm-file-name-history-map)}
+
+ Switch back to current HFF session with selection as preselect.
+
+- {{{kbd(C-c d)}}} (~helm-file-name-history-show-or-hide-deleted~) ::
+
+ #+findex: helm-file-name-history-show-or-hide-deleted @r{(helm-file-name-history-map)}
+
+ #+kindex: C-c d @r{(helm-file-name-history-map)}
+
+*** Commands in keymap ~helm-find-files-map~
+
+**** Control filtering behaviour
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-_)}}} (~helm-ff-undo~) ::
+
+ #+findex: helm-ff-undo @r{(helm-find-files-map)}
+
+ #+kindex: C-_ @r{(helm-find-files-map)}
+
+ Undo minibuffer in ~helm-find-files~.
+ Ensure disabling ~helm-ff-auto-update-flag~ before undoing.
+
+- {{{kbd(C-<backspace>)}}} ::
+- {{{kbd(C-c DEL)}}} (~helm-ff-run-toggle-auto-update~) ::
+
+ #+findex: helm-ff-run-toggle-auto-update @r{(helm-find-files-map)}
+
+ #+kindex: C-<backspace> @r{(helm-find-files-map)}
+ #+kindex: C-c DEL @r{(helm-find-files-map)}
+
+**** RET
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(RET)}}} (~helm-ff-RET~) ::
+
+ #+findex: helm-ff-RET @r{(helm-find-files-map)}
+
+ #+kindex: RET @r{(helm-find-files-map)}
+
+ Default action for RET in ~helm-find-files~.
+
+ Behave differently depending on ~helm-selection~:
+
+ - candidate basename is "." => open it in dired.
+ - candidate is a directory => expand it.
+ - candidate is a file => open it.
+
+**** Move up or down the directory tree
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(<left>)}}} ::
+- {{{kbd(C-l)}}} (~helm-find-files-up-one-level~) ::
+
+ #+findex: helm-find-files-up-one-level @r{(helm-find-files-map)}
+
+ #+kindex: <left> @r{(helm-find-files-map)}
+ #+kindex: C-l @r{(helm-find-files-map)}
+
+ (helm-find-files-up-one-level ARG)
+
+ Go up one level like unix command ~cd ..~.
+ If prefix numeric arg is given go ARG level up.
+
+- {{{kbd(C-r)}}} (~helm-find-files-down-last-level~) ::
+
+ #+findex: helm-find-files-down-last-level @r{(helm-find-files-map)}
+
+ #+kindex: C-r @r{(helm-find-files-map)}
+
+ Retrieve previous paths reached by ~C-l~ in helm-find-files.
+
+**** Sort the listing
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(S-<f1>)}}} (~helm-ff-sort-alpha~) ::
+
+ #+findex: helm-ff-sort-alpha @r{(helm-find-files-map)}
+
+ #+kindex: S-<f1> @r{(helm-find-files-map)}
+
+- {{{kbd(S-<f2>)}}} (~helm-ff-sort-by-newest~) ::
+
+ #+findex: helm-ff-sort-by-newest @r{(helm-find-files-map)}
+
+ #+kindex: S-<f2> @r{(helm-find-files-map)}
+
+- {{{kbd(S-<f3>)}}} (~helm-ff-sort-by-size~) ::
+
+ #+findex: helm-ff-sort-by-size @r{(helm-find-files-map)}
+
+ #+kindex: S-<f3> @r{(helm-find-files-map)}
+
+**** List directories or files only
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(S-<f4>)}}} (~helm-ff-toggle-dirs-only~) ::
+
+ #+findex: helm-ff-toggle-dirs-only @r{(helm-find-files-map)}
+
+ #+kindex: S-<f4> @r{(helm-find-files-map)}
+
+ Show only directories in helm-find-files.
+
+- {{{kbd(S-<f5>)}}} (~helm-ff-toggle-files-only~) ::
+
+ #+findex: helm-ff-toggle-files-only @r{(helm-find-files-map)}
+
+ #+kindex: S-<f5> @r{(helm-find-files-map)}
+
+ Show only files in helm-find-files.
+
+**** Configure display
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-])}}} (~helm-ff-run-toggle-basename~) ::
+
+ #+findex: helm-ff-run-toggle-basename @r{(helm-find-files-map)}
+
+ #+kindex: C-] @r{(helm-find-files-map)}
+
+**** Visit files in other window or frame
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-o)}}} (~helm-ff-run-switch-other-frame~) ::
+
+ #+findex: helm-ff-run-switch-other-frame @r{(helm-find-files-map)}
+
+ #+kindex: C-c C-o @r{(helm-find-files-map)}
+
+ Run switch to other frame action from ~helm-source-find-files~.
+
+- {{{kbd(C-c o)}}} (~helm-ff-run-switch-other-window~) ::
+
+ #+findex: helm-ff-run-switch-other-window @r{(helm-find-files-map)}
+
+ #+kindex: C-c o @r{(helm-find-files-map)}
+
+ Run switch to other window action from ~helm-source-find-files~.
+ When a prefix arg is provided, split is done vertically.
+
+- {{{kbd(C-c C-t)}}} (~helm-ff-find-file-other-tab~) ::
+
+ #+findex: helm-ff-find-file-other-tab @r{(helm-find-files-map)}
+
+ #+kindex: C-c C-t @r{(helm-find-files-map)}
+
+ Run find file in other tab action from ~helm-source-buffers-list~.
+
+- {{{kbd(C-c r)}}} (~helm-ff-run-find-file-as-root~) ::
+
+ #+findex: helm-ff-run-find-file-as-root @r{(helm-find-files-map)}
+
+ #+kindex: C-c r @r{(helm-find-files-map)}
+
+**** Kill Buffers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-K)}}} (~helm-ff-run-kill-buffer-persistent~) ::
+
+ #+findex: helm-ff-run-kill-buffer-persistent @r{(helm-find-files-map)}
+
+ #+kindex: M-K @r{(helm-find-files-map)}
+
+ Execute ~helm-ff-kill-buffer-fname~ without quitting.
+
+**** Open files externally
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x C-v)}}} (~helm-ff-run-find-alternate-file~) ::
+
+ #+findex: helm-ff-run-find-alternate-file @r{(helm-find-files-map)}
+
+ #+kindex: C-x C-v @r{(helm-find-files-map)}
+
+- {{{kbd(C-c C-x)}}} (~helm-ff-run-open-file-externally~) ::
+
+ #+findex: helm-ff-run-open-file-externally @r{(helm-find-files-map)}
+
+ #+kindex: C-c C-x @r{(helm-find-files-map)}
+
+ Run open file externally command action from ~helm-source-find-files~.
+
+- {{{kbd(C-c X)}}} (~helm-ff-run-open-file-with-default-tool~) ::
+
+ #+findex: helm-ff-run-open-file-with-default-tool @r{(helm-find-files-map)}
+
+ #+kindex: C-c X @r{(helm-find-files-map)}
+
+ Run open file externally command action from ~helm-source-find-files~.
+
+- {{{kbd(C-c C-v)}}} (~helm-ff-run-preview-file-externally~) ::
+
+ #+findex: helm-ff-run-preview-file-externally @r{(helm-find-files-map)}
+
+ #+kindex: C-c C-v @r{(helm-find-files-map)}
+
+**** Copy files
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-C)}}} (~helm-ff-run-copy-file~) ::
+
+ #+findex: helm-ff-run-copy-file @r{(helm-find-files-map)}
+
+ #+kindex: M-C @r{(helm-find-files-map)}
+
+ Run Copy file action from ~helm-source-find-files~.
+
+- {{{kbd(M-V)}}} (~helm-ff-run-rsync-file~) ::
+
+ #+findex: helm-ff-run-rsync-file @r{(helm-find-files-map)}
+
+ #+kindex: M-V @r{(helm-find-files-map)}
+
+ Run Rsync file action from ~helm-source-find-files~.
+
+**** Run Query-Replace on Filenames
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-@)}}} (~helm-ff-run-query-replace-fnames-on-marked~) ::
+
+ #+findex: helm-ff-run-query-replace-fnames-on-marked @r{(helm-find-files-map)}
+
+ #+kindex: M-@ @r{(helm-find-files-map)}
+
+- {{{kbd(M-R)}}} (~helm-ff-run-rename-file~) ::
+
+ #+findex: helm-ff-run-rename-file @r{(helm-find-files-map)}
+
+ #+kindex: M-R @r{(helm-find-files-map)}
+
+ Run Rename file action from ~helm-source-find-files~.
+
+**** Run Query-Replace on Buffers' Content
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-%)}}} (~helm-ff-run-query-replace~) ::
+
+ #+findex: helm-ff-run-query-replace @r{(helm-find-files-map)}
+
+ #+kindex: M-% @r{(helm-find-files-map)}
+
+- {{{kbd(C-M-%)}}} (~helm-ff-run-query-replace-regexp~) ::
+
+ #+findex: helm-ff-run-query-replace-regexp @r{(helm-find-files-map)}
+
+ #+kindex: C-M-% @r{(helm-find-files-map)}
+
+**** Touch files
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-T)}}} (~helm-ff-run-touch-files~) ::
+
+ #+findex: helm-ff-run-touch-files @r{(helm-find-files-map)}
+
+ #+kindex: M-T @r{(helm-find-files-map)}
+
+ Used to interactively run touch file action from keyboard.
+
+**** Delete Persistently
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-D)}}} (~helm-ff-run-delete-file~) ::
+
+ #+findex: helm-ff-run-delete-file @r{(helm-find-files-map)}
+
+ #+kindex: M-D @r{(helm-find-files-map)}
+
+ Run Delete file action from ~helm-source-find-files~.
+
+- {{{kbd(C-c d)}}} (~helm-ff-persistent-delete~) ::
+
+ #+findex: helm-ff-persistent-delete @r{(helm-find-files-map)}
+
+ #+kindex: C-c d @r{(helm-find-files-map)}
+
+ Delete current candidate without quitting.
+
+**** Operate on Images
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M--)}}} (~helm-ff-decrease-image-size-persistent~) ::
+
+ #+findex: helm-ff-decrease-image-size-persistent @r{(helm-find-files-map)}
+
+ #+kindex: M-- @r{(helm-find-files-map)}
+
+ Decrease image size without quitting helm.
+
+- {{{kbd(M-+)}}} (~helm-ff-increase-image-size-persistent~) ::
+
+ #+findex: helm-ff-increase-image-size-persistent @r{(helm-find-files-map)}
+
+ #+kindex: M-+ @r{(helm-find-files-map)}
+
+ Increase image size without quitting helm.
+
+- {{{kbd(M-l)}}} (~helm-ff-rotate-left-persistent~) ::
+
+ #+findex: helm-ff-rotate-left-persistent @r{(helm-find-files-map)}
+
+ #+kindex: M-l @r{(helm-find-files-map)}
+
+ Rotate image left without quitting helm.
+
+- {{{kbd(M-r)}}} (~helm-ff-rotate-right-persistent~) ::
+
+ #+findex: helm-ff-rotate-right-persistent @r{(helm-find-files-map)}
+
+ #+kindex: M-r @r{(helm-find-files-map)}
+
+ Rotate image right without quitting helm.
+
+**** Run Grep and friends
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-g g)}}} (~helm-ff-run-git-grep~) ::
+
+ #+findex: helm-ff-run-git-grep @r{(helm-find-files-map)}
+
+ #+kindex: M-g g @r{(helm-find-files-map)}
+
+ Run git-grep action from ~helm-source-find-files~.
+
+- {{{kbd(C-s)}}} ::
+- {{{kbd(M-g s)}}} (~helm-ff-run-grep~) ::
+
+ #+findex: helm-ff-run-grep @r{(helm-find-files-map)}
+
+ #+kindex: C-s @r{(helm-find-files-map)}
+ #+kindex: M-g s @r{(helm-find-files-map)}
+
+ Run Grep action from ~helm-source-find-files~.
+
+- {{{kbd(M-g a)}}} (~helm-ff-run-grep-ag~) ::
+
+ #+findex: helm-ff-run-grep-ag @r{(helm-find-files-map)}
+
+ #+kindex: M-g a @r{(helm-find-files-map)}
+
+- {{{kbd(M-g i)}}} (~helm-ff-run-gid~) ::
+
+ #+findex: helm-ff-run-gid @r{(helm-find-files-map)}
+
+ #+kindex: M-g i @r{(helm-find-files-map)}
+
+- {{{kbd(M-g p)}}} (~helm-ff-run-pdfgrep~) ::
+
+ #+findex: helm-ff-run-pdfgrep @r{(helm-find-files-map)}
+
+ #+kindex: M-g p @r{(helm-find-files-map)}
+
+ Run Pdfgrep action from ~helm-source-find-files~.
+
+- {{{kbd(M-g z)}}} (~helm-ff-run-zgrep~) ::
+
+ #+findex: helm-ff-run-zgrep @r{(helm-find-files-map)}
+
+ #+kindex: M-g z @r{(helm-find-files-map)}
+
+ Run Grep action from ~helm-source-find-files~.
+
+**** Run find or locate
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c /)}}} (~helm-ff-run-find-sh-command~) ::
+
+ #+findex: helm-ff-run-find-sh-command @r{(helm-find-files-map)}
+
+ #+kindex: C-c / @r{(helm-find-files-map)}
+
+ Run find shell command action with key from ~helm-find-files~.
+
+- {{{kbd(C-x C-f)}}} (~helm-ff-run-locate~) ::
+
+ #+findex: helm-ff-run-locate @r{(helm-find-files-map)}
+
+ #+kindex: C-x C-f @r{(helm-find-files-map)}
+
+ Run locate action from ~helm-source-find-files~.
+
+- {{{kbd(C-/)}}} (~helm-ff-run-fd~) ::
+
+ #+findex: helm-ff-run-fd @r{(helm-find-files-map)}
+
+ #+kindex: C-/ @r{(helm-find-files-map)}
+
+ Run fd shell command action with key from ~helm-find-files~.
+
+**** Show Properties
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-i)}}} (~helm-ff-properties-persistent~) ::
+
+ #+findex: helm-ff-properties-persistent @r{(helm-find-files-map)}
+
+ #+kindex: M-i @r{(helm-find-files-map)}
+
+ Show properties without quitting helm.
+
+**** Browse File name history
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c h)}}} (~helm-ff-file-name-history~) ::
+
+ #+findex: helm-ff-file-name-history @r{(helm-find-files-map)}
+
+ #+kindex: C-c h @r{(helm-find-files-map)}
+
+ Switch to ~file-name-history~ without quitting ~helm-find-files~.
+
+- {{{kbd(M-p)}}} (~helm-find-files-history~) ::
+
+ #+findex: helm-find-files-history @r{(helm-find-files-map)}
+
+ #+kindex: M-p @r{(helm-find-files-map)}
+
+ (helm-find-files-history ARG &key (COMP-READ t))
+
+ The ~helm-find-files~ history.
+ Show the first ~helm-ff-history-max-length~ elements of
+ ~helm-ff-history~ in an ~helm-comp-read~.
+
+**** Attach files to an Email
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-a)}}} (~helm-ff-run-mail-attach-files~) ::
+
+ #+findex: helm-ff-run-mail-attach-files @r{(helm-find-files-map)}
+
+ #+kindex: C-c C-a @r{(helm-find-files-map)}
+
+ Run mail attach files command action from ~helm-source-find-files~.
+
+- {{{kbd(C-x C-q)}}} (~helm-ff-run-marked-files-in-dired~) ::
+
+ #+findex: helm-ff-run-marked-files-in-dired @r{(helm-find-files-map)}
+
+ #+kindex: C-x C-q @r{(helm-find-files-map)}
+
+ Execute ~helm-marked-files-in-dired~ interactively.
+
+**** Operate on Elisp files
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-B)}}} (~helm-ff-run-byte-compile-file~) ::
+
+ #+findex: helm-ff-run-byte-compile-file @r{(helm-find-files-map)}
+
+ #+kindex: M-B @r{(helm-find-files-map)}
+
+ Run Byte compile file action from ~helm-source-find-files~.
+
+- {{{kbd(M-L)}}} (~helm-ff-run-load-file~) ::
+
+ #+findex: helm-ff-run-load-file @r{(helm-find-files-map)}
+
+ #+kindex: M-L @r{(helm-find-files-map)}
+
+ Run Load file action from ~helm-source-find-files~.
+
+**** Run Ediff and Emerge
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c =)}}} (~helm-ff-run-ediff-file~) ::
+
+ #+findex: helm-ff-run-ediff-file @r{(helm-find-files-map)}
+
+ #+kindex: C-c = @r{(helm-find-files-map)}
+
+ Run Ediff file action from ~helm-source-find-files~.
+
+- {{{kbd(M-=)}}} (~helm-ff-run-ediff-merge-file~) ::
+
+ #+findex: helm-ff-run-ediff-merge-file @r{(helm-find-files-map)}
+
+ #+kindex: M-= @r{(helm-find-files-map)}
+
+ Run Ediff merge file action from ~helm-source-find-files~.
+
+**** uncategorized Ff Run File
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c p)}}} (~helm-ff-run-print-file~) ::
+
+ #+findex: helm-ff-run-print-file @r{(helm-find-files-map)}
+
+ #+kindex: C-c p @r{(helm-find-files-map)}
+
+ Run Print file action from ~helm-source-find-files~.
+
+**** Link files
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-H)}}} (~helm-ff-run-hardlink-file~) ::
+
+ #+findex: helm-ff-run-hardlink-file @r{(helm-find-files-map)}
+
+ #+kindex: M-H @r{(helm-find-files-map)}
+
+ Run Hardlink file action from ~helm-source-find-files~.
+
+- {{{kbd(M-Y)}}} (~helm-ff-run-relsymlink-file~) ::
+
+ #+findex: helm-ff-run-relsymlink-file @r{(helm-find-files-map)}
+
+ #+kindex: M-Y @r{(helm-find-files-map)}
+
+ Run Symlink file action from ~helm-source-find-files~.
+
+- {{{kbd(M-S)}}} (~helm-ff-run-symlink-file~) ::
+
+ #+findex: helm-ff-run-symlink-file @r{(helm-find-files-map)}
+
+ #+kindex: M-S @r{(helm-find-files-map)}
+
+ Run Symlink file action from ~helm-source-find-files~.
+
+**** uncategorized Ff Run uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x C-d)}}} (~helm-ff-run-browse-project~) ::
+
+ #+findex: helm-ff-run-browse-project @r{(helm-find-files-map)}
+
+ #+kindex: C-x C-d @r{(helm-find-files-map)}
+
+- {{{kbd(C-c i)}}} (~helm-ff-run-complete-fn-at-point~) ::
+
+ #+findex: helm-ff-run-complete-fn-at-point @r{(helm-find-files-map)}
+
+ #+kindex: C-c i @r{(helm-find-files-map)}
+
+ Run complete file name action from ~helm-source-find-files~.
+
+- {{{kbd(M-.)}}} (~helm-ff-run-etags~) ::
+
+ #+findex: helm-ff-run-etags @r{(helm-find-files-map)}
+
+ #+kindex: M-. @r{(helm-find-files-map)}
+
+ Run Etags command action from ~helm-source-find-files~.
+
+- {{{kbd(C-c @)}}} (~helm-ff-run-insert-org-link~) ::
+
+ #+findex: helm-ff-run-insert-org-link @r{(helm-find-files-map)}
+
+ #+kindex: C-c @ @r{(helm-find-files-map)}
+
+**** Manage Helm Find Files Sessioin
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x r m)}}} (~helm-ff-bookmark-set~) ::
+
+ #+findex: helm-ff-bookmark-set @r{(helm-find-files-map)}
+
+ #+kindex: C-x r m @r{(helm-find-files-map)}
+
+ Record ~helm-find-files~ session in bookmarks.
+
+- {{{kbd(C-x r b)}}} (~helm-find-files-switch-to-bookmark~) ::
+
+ #+findex: helm-find-files-switch-to-bookmark @r{(helm-find-files-map)}
+
+ #+kindex: C-x r b @r{(helm-find-files-map)}
+
+ Switch to helm-bookmark for ~helm-find-files~ from ~helm-find-files.~
+
+**** Run Eshell
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-e)}}} (~helm-ff-run-switch-to-shell~) ::
+
+ #+findex: helm-ff-run-switch-to-shell @r{(helm-find-files-map)}
+
+ #+kindex: M-e @r{(helm-find-files-map)}
+
+ Run switch to eshell action from ~helm-source-find-files~.
+
+- {{{kbd(M-!)}}} (~helm-ff-run-eshell-command-on-file~) ::
+
+ #+findex: helm-ff-run-eshell-command-on-file @r{(helm-find-files-map)}
+
+ #+kindex: M-! @r{(helm-find-files-map)}
+
+ Run eshell command on file action from ~helm-source-find-files~.
+
+*** Commands in keymap ~helm-read-file-map~
+
+**** Control what is displayed
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-])}}} (~helm-ff-run-toggle-basename~) ::
+
+ #+findex: helm-ff-run-toggle-basename @r{(helm-read-file-map)}
+
+ #+kindex: C-] @r{(helm-read-file-map)}
+
+**** RET
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(RET)}}} (~helm-ff-RET~) ::
+
+ #+findex: helm-ff-RET @r{(helm-read-file-map)}
+
+ #+kindex: RET @r{(helm-read-file-map)}
+
+ Default action for RET in ~helm-find-files~.
+
+ Behave differently depending on ~helm-selection~:
+
+ - candidate basename is "." => open it in dired.
+ - candidate is a directory => expand it.
+ - candidate is a file => open it.
+
+**** Return empty string
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-<return>)}}} ::
+- {{{kbd(M-RET)}}} (~helm-cr-empty-string~) ::
+
+ #+findex: helm-cr-empty-string @r{(helm-read-file-map)}
+
+ #+kindex: C-<return> @r{(helm-read-file-map)}
+ #+kindex: M-RET @r{(helm-read-file-map)}
+
+ Return empty string.
+
+**** Undo Minibuffer
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-_)}}} (~helm-ff-undo~) ::
+
+ #+findex: helm-ff-undo @r{(helm-read-file-map)}
+
+ #+kindex: C-_ @r{(helm-read-file-map)}
+
+ Undo minibuffer in ~helm-find-files~.
+ Ensure disabling ~helm-ff-auto-update-flag~ before undoing.
+
+**** Go up and down directory tree
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-r)}}} (~helm-find-files-down-last-level~) ::
+
+ #+findex: helm-find-files-down-last-level @r{(helm-read-file-map)}
+
+ #+kindex: C-r @r{(helm-read-file-map)}
+
+ Retrieve previous paths reached by ~C-l~ in helm-find-files.
+
+- {{{kbd(<left>)}}} ::
+- {{{kbd(C-l)}}} ::
+- {{{kbd(C-.)}}} (~helm-find-files-up-one-level~) ::
+
+ #+findex: helm-find-files-up-one-level @r{(helm-read-file-map)}
+
+ #+kindex: <left> @r{(helm-read-file-map)}
+ #+kindex: C-l @r{(helm-read-file-map)}
+ #+kindex: C-. @r{(helm-read-file-map)}
+
+ (helm-find-files-up-one-level ARG)
+
+ Go up one level like unix command ~cd ..~.
+ If prefix numeric arg is given go ARG level up.
+
+**** File name history
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c h)}}} (~helm-ff-file-name-history~) ::
+
+ #+findex: helm-ff-file-name-history @r{(helm-read-file-map)}
+
+ #+kindex: C-c h @r{(helm-read-file-map)}
+
+ Switch to ~file-name-history~ without quitting ~helm-find-files~.
+
+**** Toggle Auto-update
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-<backspace>)}}} ::
+- {{{kbd(C-c DEL)}}} (~helm-ff-run-toggle-auto-update~) ::
+
+ #+findex: helm-ff-run-toggle-auto-update @r{(helm-read-file-map)}
+
+ #+kindex: C-<backspace> @r{(helm-read-file-map)}
+ #+kindex: C-c DEL @r{(helm-read-file-map)}
+
+*** Commands in library ~helm-files~ (excludes keymaps)
+
+**** Delete
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-delete-tramp-connection~ ::
+
+ #+findex: helm-delete-tramp-connection
+
+ Allow deleting tramp connection or marked tramp connections at once.
+
+ This replace ~tramp-cleanup-connection~ which is partially broken
+ in Emacs < to 25.1.50.1 (See Emacs bug http://debbugs.gnu.org/cgi/bugreport.cgi?bug=24432).
+
+ It allows additionally to delete more than one connection at
+ once.
+
+**** Ff
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-RET-must-match~ ::
+
+ #+findex: helm-ff-RET-must-match
+
+ Same as ~helm-ff-RET~ but used in must-match map.
+
+- ~helm-ff-TAB~ ::
+
+ #+findex: helm-ff-TAB
+
+ (helm-ff-TAB ARG)
+
+ Default action for TAB in ~helm-find-files~.
+
+ Behave differently depending on ~helm-selection~:
+
+ - candidate basename is "." => open the action menu.
+ - candidate is a directory => expand it.
+ - candidate is a file => open action menu.
+
+ Called with a prefix arg open menu unconditionally.
+
+- ~helm-ff-delete-char-backward~ ::
+
+ #+findex: helm-ff-delete-char-backward
+
+ Go up one level or disable HFF auto update and delete char backward.
+
+ Going up one level works only when pattern is a directory endings
+ with "/", otherwise this command deletes char backward.
+
+ Going up one level can be disabled if necessary by deleting "/"
+ at end of pattern using \<helm-map>\[backward-char] and
+ \[helm-delete-minibuffer-contents].
+
+- ~helm-ff-kill-rsync-process~ ::
+
+ #+findex: helm-ff-kill-rsync-process
+
+ (helm-ff-kill-rsync-process PROCESS)
+
+ Kill rsync process PROCESS.
+
+ When called interactively prompt user with completion when more than
+ one process.
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff--delete-async-modeline-mode~ ::
+
+ #+findex: helm-ff--delete-async-modeline-mode
+
+ (helm-ff--delete-async-modeline-mode &optional ARG)
+
+ Notify mode-line that an async process run.
+
+ If called interactively, toggle `Helm-Ff--Delete-Async-Modeline
+ mode'. If the prefix argument is positive, enable the mode, and
+ if it is zero or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-browse-project~ ::
+
+ #+findex: helm-browse-project
+
+ (helm-browse-project ARG)
+
+ Preconfigured helm to browse projects.
+ Browse files and see status of project with its VCS.
+ Only HG and GIT are supported for now.
+ Fall back to ~helm-browse-project-find-files~ if current
+ directory is not under control of one of those VCS.
+ With a prefix ARG browse files recursively, with two prefix ARG
+ rebuild the cache.
+ If the current directory is found in the cache, start
+ ~helm-browse-project-find-files~ even with no prefix ARG.
+ NOTE: The prefix ARG have no effect on the VCS controlled
+ directories.
+
+ Needed dependencies for VCS:
+ <https://github.com/emacs-helm/helm-ls-git>
+ and
+ <https://github.com/emacs-helm/helm-ls-hg>.
+
+- {{{kbd(C-x c C-x C-f)}}} ::
+- {{{kbd(<open>)}}} ::
+- {{{kbd(C-x C-f)}}} (~helm-find-files~) ::
+
+ #+findex: helm-find-files
+
+ #+kindex: C-x c C-x C-f
+ #+kindex: <open>
+ #+kindex: C-x C-f
+
+ (helm-find-files ARG)
+
+ Preconfigured ~helm~ for helm implementation of ~find-file~.
+ Called with a prefix arg show history if some.
+ Don't call it from programs, use ~helm-find-files-1~ instead.
+ This is the starting point for nearly all actions you can do on
+ files.
+
+- ~helm-projects-history~ ::
+
+ #+findex: helm-projects-history
+
+ (helm-projects-history ARG)
+
+*** Options in library =helm-files=
+
+**** On
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-substitute-in-filename-stay-on-remote~ ::
+
+ #+vindex: helm-substitute-in-filename-stay-on-remote
+
+ *Standard Value*: nil
+
+ Don’t switch back to local filesystem when expanding pattern with / or ~/.
+
+**** List
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-list-directory-function~ ::
+
+ #+vindex: helm-list-directory-function
+
+ *Standard Value*: helm-list-dir-external
+
+ The function used in ~helm-find-files~ to list remote directories.
+
+ Actually Helm provides two functions to do this:
+ ~helm-list-dir-lisp~ and ~helm-list-dir-external~.
+
+ Using ~helm-list-dir-external~ will provide a similar display to
+ what is provided with local files i.e. colorized symlinks,
+ executables files etc., whereas using ~helm-list-dir-lisp~ will
+ allow colorizing only directories but it is more portable.
+
+ NOTE: ~helm-list-dir-external~ needs ls and awk as dependencies.
+ Also the ls version installed on the remote side should support
+ the same arguments as the GNU/ls version, which are -A -1 -F -b
+ and -Q. So even if you are using a GNU/ls version locally and you
+ want to connect e.g. on a Freebsd server, you may have failures
+ due to the incompatible ls version installed on remote server. In
+ such case use ~helm-list-dir-lisp~ which works everywhere but is
+ slower and less featured (only directories colorized).
+
+**** Rsync
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-rsync-percent-sign~ ::
+
+ #+vindex: helm-rsync-percent-sign
+
+ *Standard Value*: %
+
+ Percentage unicode sign to use in Rsync reporter.
+
+- ~helm-rsync-switches~ ::
+
+ #+vindex: helm-rsync-switches
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("-a" "-z" "-h" "-s" "--info=all2")
+ #+end_src
+
+ Rsync options to use with HFF Rsync action.
+ Note: Using "--info=all2" allows having the name of the file
+ currently transfered in an help-echo in mode-line, if you use
+ "--info=progress2" you will not have this information.
+
+**** Mode
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-rsync-no-mode-line-update~ ::
+
+ #+vindex: helm-rsync-no-mode-line-update
+
+ *Standard Value*: nil
+
+ When non nil don’t update mode-line when rsync is running.
+ This is useful if you display the progress bar somewhere else,
+ e.g. with minibuffer-line in minibuffer, in this case updating
+ mode-line may create flickering in other frame’s mode-line.
+
+**** Files Find
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-browse-project-default-find-files-fn~ ::
+
+ #+vindex: helm-browse-project-default-find-files-fn
+
+ *Standard Value*: helm-browse-project-fd-find-files
+
+ The default function to retrieve files in a non-vc directory.
+
+ A function that takes a directory name as only arg.
+
+- ~helm-find-files-actions~ ::
+
+ #+vindex: helm-find-files-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Find File" . helm-find-file-or-marked)
+ ("Find file in Dired" . helm-point-file-in-dired)
+ ("View file" . view-file)
+ ("Query replace fnames on marked ~M-@~" . helm-ff-query-replace-fnames-on-marked)
+ ("Marked files in dired ~C-x C-q, C-u wdired~" . helm-marked-files-in-dired)
+ ("Query replace contents on marked ~M-%~" . helm-ff-query-replace)
+ ("Query replace regexp contents on marked ~C-M-%~" . helm-ff-query-replace-regexp)
+ ("Attach file(s) to mail buffer ~C-c C-a~" . helm-ff-mail-attach-files)
+ ("Serial rename files" . helm-ff-serial-rename)
+ ("Serial rename by symlinking files" . helm-ff-serial-rename-by-symlink)
+ ("Serial rename by copying files" . helm-ff-serial-rename-by-copying)
+ ("Open file with default tool" . helm-open-file-with-default-tool)
+ ("Find file in hex dump" . hexl-find-file)
+ ("Browse project ~C-x C-d~" . helm-ff-browse-project)
+ ("Complete at point ~C-c i~" . helm-insert-file-name-completion-at-point)
+ ("Insert as org link ~C-c @~" . helm-files-insert-as-org-link)
+ ("Find shell command ~C-c /~" . helm-ff-find-sh-command)
+ ("Fd shell command (C-/)" . helm-ff-fd)
+ ("Add marked files to file-cache" . helm-ff-cache-add-file)
+ ("Open file externally ~C-c C-x, C-u to choose~" . helm-open-file-externally)
+ ("Grep File(s) ~C-s, C-u Recurse~" . helm-find-files-grep)
+ ("Grep current directory with AG ~M-g a, C-u select type~" . helm-find-files-ag)
+ ("Git grep ~M-g g, C-u from root~" . helm-ff-git-grep)
+ ("Zgrep File(s) ~M-g z, C-u Recurse~" . helm-ff-zgrep)
+ ("Pdf Grep File(s)" . helm-ff-pdfgrep)
+ ("Gid ~M-g i~" . helm-ff-gid)
+ ("Switch to Eshell ~M-e~" . helm-ff-switch-to-shell)
+ ("Etags ~M-., C-u reload tag file~" . helm-ff-etags-select)
+ ("Eshell command on file(s) ~M-!, C-u take all marked as arguments.~" . helm-find-files-eshell-command-on-file)
+ ("Find file as root ~C-c r~" . helm-find-file-as-root)
+ ("Find alternate file ~C-x C-v~" . find-alternate-file)
+ ("Ediff File ~C-c =~" . helm-find-files-ediff-files)
+ ("Ediff Merge File ~M-=~" . helm-find-files-ediff-merge-files)
+ ("Delete File(s) ~M-D~ (C-u reverse trash)" . helm-ff-delete-files)
+ ("Touch File(s) ~M-T~" . helm-ff-touch-files)
+ ("Copy file(s) ~M-C, C-u to follow~" . helm-find-files-copy)
+ ("Rsync file(s) ~M-V~ (C-u edit command)" . helm-find-files-rsync)
+ ("Rename file(s) ~M-R, C-u to follow~" . helm-find-files-rename)
+ ("Backup files" . helm-find-files-backup)
+ ("Symlink files(s) ~M-S, C-u to follow~" . helm-find-files-symlink)
+ ("Relsymlink file(s) ~M-Y, C-u to follow~" . helm-find-files-relsymlink)
+ ("Hardlink file(s) ~M-H, C-u to follow~" . helm-find-files-hardlink)
+ ("Find file other window ~C-c o~" . helm-find-files-other-window)
+ ("Find file other frame ~C-c C-o~" . find-file-other-frame)
+ ("Find file other tab ~C-c C-t~" . find-file-other-tab)
+ ("Print File ~C-c p, C-u to refresh~" . helm-ff-print)
+ ("Locate ~C-x C-f, C-u to specify locate db~" . helm-ff-locate))
+ #+end_src
+
+ Actions for ~helm-find-files~.
+
+- ~helm-find-files-after-init-hook~ ::
+
+ #+vindex: helm-find-files-after-init-hook
+
+ *Standard Value*: nil
+
+ Hook that run after initialization of ~helm-find-files~.
+
+- ~helm-find-files-before-init-hook~ ::
+
+ #+vindex: helm-find-files-before-init-hook
+
+ *Standard Value*: nil
+
+ Hook that run before initialization of ~helm-find-files~.
+
+- ~helm-find-files-bookmark-prefix~ ::
+
+ #+vindex: helm-find-files-bookmark-prefix
+
+ *Standard Value*: Helm-find-files:
+
+ bookmark name prefix of ~helm-find-files~ sessions.
+
+- ~helm-find-files-ignore-thing-at-point~ ::
+
+ #+vindex: helm-find-files-ignore-thing-at-point
+
+ *Standard Value*: nil
+
+ Use only ~default-directory~ as default input in ~helm-find-files~.
+ I.e. text under cursor in ~current-buffer~ is ignored.
+ Note that when non-nil you will be unable to complete filename at
+ point in ~current-buffer~.
+
+**** Files uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-files-save-history-extra-sources~ ::
+
+ #+vindex: helm-files-save-history-extra-sources
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("Find" "Locate" "Recentf" "Files from Current Directory" "File Cache")
+ #+end_src
+
+ Extras source that save candidate to ~file-name-history~.
+
+- ~helm-trash-remote-files~ ::
+
+ #+vindex: helm-trash-remote-files
+
+ *Standard Value*: nil
+
+ Allow trashing remote files when non-nil.
+
+ Trashing remote files with tramp doesn’t work out of the box
+ unless the ’trash-cli’ package is installed. This is why trashing
+ remote files from Helm is disabled by default.
+
+ Tramp is using external ’trash’ command in its ~delete-file~ and
+ ~delete-directory~ handlers when using
+ ~delete-by-moving-to-trash~, which is documented nowhere in
+ Emacs.
+
+ If you want to enable this you will have to install the ’trash’
+ command on remote (and/or locally if you want to trash as root).
+ On Ubuntu-based distributions it is ’trash-cli’.
+
+**** Ff Mode
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-preferred-shell-mode~ ::
+
+ #+vindex: helm-ff-preferred-shell-mode
+
+ *Standard Value*: eshell-mode
+
+ Shell to use to switch to a shell buffer from ~helm-find-files~.
+ Possible values are ~shell-mode~, ~eshell-mode~ and ~term-mode~.
+ This affects ~M-e~ keybinding.
+
+**** Ff List
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-printer-list~ ::
+
+ #+vindex: helm-ff-printer-list
+
+ *Standard Value*: nil
+
+ A list of available printers on your system.
+ When non-nil let you choose a printer to print file.
+ Otherwise when nil the variable ~printer-name~ will be used.
+ On Unix based systems (lpstat command needed) you don’t need to
+ set this, ~helm-ff-find-printers~ will find a list of available
+ printers for you.
+
+**** Ff Allow
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-allow-recursive-deletes~ ::
+
+ #+vindex: helm-ff-allow-recursive-deletes
+
+ *Standard Value*: nil
+
+ When ’always don’t prompt for recursive deletion of directories.
+ When nil, will ask for recursive deletion.
+ Note that when deleting multiple directories you can answer !
+ when prompted to avoid being asked for next directories, so it
+ is probably better to not modify this variable.
+
+**** Ff Guess
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-guess-ffap-filenames~ ::
+
+ #+vindex: helm-ff-guess-ffap-filenames
+
+ *Standard Value*: nil
+
+ Use ffap to guess local filenames at point in ~helm-find-files~.
+ This doesn’t disable url or mail at point, see
+ ~helm-ff-guess-ffap-urls~ for this.
+
+- ~helm-ff-guess-ffap-urls~ ::
+
+ #+vindex: helm-ff-guess-ffap-urls
+
+ *Standard Value*: t
+
+ Use ffap to guess local urls at point in ~helm-find-files~.
+ This doesn’t disable guessing filenames at point, see
+ ~helm-ff-guess-ffap-filenames~ for this.
+ See also ~ffap-url-unwrap-remote~ that may override this
+ variable.
+
+**** Ff Level
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-DEL-up-one-level-maybe~ ::
+
+ #+vindex: helm-ff-DEL-up-one-level-maybe
+
+ *Standard Value*: nil
+
+ Use DEL to maybe go up one level when non nil.
+
+ Going up one level works only when pattern is a directory endings
+ with "/", otherwise this command deletes char backward.
+
+ When nil always delete char backward.
+
+**** Ff Delete
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff--delete-async-modeline-mode-hook~ ::
+
+ #+vindex: helm-ff--delete-async-modeline-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-ff--delete-async-modeline-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+**** Ff Update
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-reset-filters-on-update~ ::
+
+ #+vindex: helm-ff-reset-filters-on-update
+
+ *Standard Value*: t
+
+ Reset filter variables when changing directory.
+ When filtering directories/files only, switch back to a "show all" view
+ when moving out of directory when non nil.
+
+**** Ff History
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-history-max-length~ ::
+
+ #+vindex: helm-ff-history-max-length
+
+ *Standard Value*: 100
+
+ Number of elements shown in ~helm-find-files~ history.
+
+**** Ff Initial
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-auto-update-initial-value~ ::
+
+ #+vindex: helm-ff-auto-update-initial-value
+
+ *Standard Value*: nil
+
+ Auto update when only one candidate directory is matched.
+ Default value when starting ~helm-find-files~ is nil to not
+ confuse new users.
+ For a better experience with ~helm-find-files~ set this to
+ non-nil and use C-<backspace> to toggle it.
+
+- ~helm-ff-initial-sort-method~ ::
+
+ #+vindex: helm-ff-initial-sort-method
+
+ *Standard Value*: nil
+
+ Sort method to use when initially listing a directory.
+ Note that this doesn’t affect the listing when matching inside
+ the directory (i.e. filenames).
+
+**** Ff Preselect
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-no-preselect~ ::
+
+ #+vindex: helm-ff-no-preselect
+
+ *Standard Value*: nil
+
+ When non-nil ~helm-find-files~ starts at root of current directory.
+
+- ~helm-ff-up-one-level-preselect~ ::
+
+ #+vindex: helm-ff-up-one-level-preselect
+
+ *Standard Value*: t
+
+ Always preselect previous directory when going one level up.
+
+ When non-nil ~candidate-number-limit~ source value is modified
+ dynamically when going one level up if the position of previous
+ candidate in its directory is > to
+ ~helm-ff-candidate-number-limit~.
+
+ It can be helpful to disable this and reduce
+ ~helm-ff-candidate-number-limit~ if you often navigate across
+ very large directories.
+
+**** Ff File
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-allow-non-existing-file-at-point~ ::
+
+ #+vindex: helm-ff-allow-non-existing-file-at-point
+
+ *Standard Value*: nil
+
+ Use non existing file-at-point as initial input in ~helm-find-files~.
+
+- ~helm-ff-file-compressed-list~ ::
+
+ #+vindex: helm-ff-file-compressed-list
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("gz" "bz2" "zip" "7z")
+ #+end_src
+
+ Minimal list of compressed files extension.
+
+- ~helm-ff-file-name-history-use-recentf~ ::
+
+ #+vindex: helm-ff-file-name-history-use-recentf
+
+ *Standard Value*: nil
+
+ Use ~recentf-list~ instead of ~file-name-history~ in ~helm-find-files~.
+
+**** Ff Image
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-display-image-native~ ::
+
+ #+vindex: helm-ff-display-image-native
+
+ *Standard Value*: nil
+
+ Use native ~image-mode~ when non nil.
+
+ You should use this only with Emacs>= 27 and ~image-auto-resize~
+ enabled to have images resized properly. When this is enabled,
+ you have new commands to zoom in/out images. See
+ ~image-transform-resize~ and ~image-auto-resize~. Otherwise,
+ when nil ~image-dired~ is used, using imagemagick as backend.
+ NOTE: If you see image-mode is eating too much memory, you better have
+ to set this to nil (default).
+
+- ~helm-ff-rotate-image-switch~ ::
+
+ #+vindex: helm-ff-rotate-image-switch
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("-i")
+ #+end_src
+
+ Options used with ~helm-ff-rotate-image-program~.
+ If you are using Mogrify or Jpegtran mandatory option is
+ "-rotate", with Exiftran mandatory option is "-i".
+
+**** Ff Program
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-exif-data-program~ ::
+
+ #+vindex: helm-ff-exif-data-program
+
+ *Standard Value*: exiftran
+
+ Program used to extract exif data of an image file.
+
+- ~helm-ff-exif-data-program-args~ ::
+
+ #+vindex: helm-ff-exif-data-program-args
+
+ *Standard Value*: -d
+
+ Arguments used for ~helm-ff-exif-data-program~.
+
+- ~helm-ff-rotate-image-program~ ::
+
+ #+vindex: helm-ff-rotate-image-program
+
+ *Standard Value*: exiftran
+
+ External program used to rotate images.
+ When nil and ~helm-ff-display-image-native~ is enabled, fallback to
+ ~image-rotate~ without modification of exif data i.e. rotation is not
+ persistent otherwise an error is returned when not using
+ ~helm-ff-display-image-native~ i.e. using image-dired.
+
+**** Ff Files
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-delete-files-function~ ::
+
+ #+vindex: helm-ff-delete-files-function
+
+ *Standard Value*: helm-delete-marked-files
+
+ The function to use by default to delete files.
+
+ Default is to delete files synchronously, other choice is to
+ delete files asynchronously.
+
+ BE AWARE that when deleting async you will not be warned about
+ recursive deletion of directories, IOW non-empty directories will
+ be deleted with no warnings in background!!!
+
+ It is the function that will be used when using
+ ~M-D~ from
+ ~helm-find-files~.
+
+- ~helm-ff-signal-error-on-dot-files~ ::
+
+ #+vindex: helm-ff-signal-error-on-dot-files
+
+ *Standard Value*: t
+
+ Signal error when file is ~.~ or ~..~ on file deletion when non-nil.
+ Default is non-nil.
+ WARNING: Setting this to nil is unsafe and can cause deletion of
+ a whole tree.
+
+- ~helm-ff-skip-boring-files~ ::
+
+ #+vindex: helm-ff-skip-boring-files
+
+ *Standard Value*: nil
+
+ Non-nil to skip boring files.
+ I.e. the files matching regexps in ~helm-boring-file-regexp-list~.
+ This takes effect in ~helm-find-files~ and file completion used by
+ ~helm-mode~ i.e. ~helm-read-file-name~.
+ Note that when non-nil this will slow down slightly ~helm-find-files~.
+
+- ~helm-ff-skip-git-ignored-files~ ::
+
+ #+vindex: helm-ff-skip-git-ignored-files
+
+ *Standard Value*: nil
+
+ Non-nil to skip git ignored files.
+ This take effect only in ~helm-find-files~.
+ Check is not done on remote files.
+ Note that when non-nil this will slow down slightly
+ ~helm-find-files~.
+
+**** Ff uncategorized uncategorized uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-avfs-directory~ ::
+
+ #+vindex: helm-ff-avfs-directory
+
+ *Standard Value*: ~/.avfs
+
+ The default avfs directory, usually ’~/.avfs’.
+ When this is set you will be able to expand archive filenames
+ with ~C-j~ inside an avfs directory mounted with mountavfs.
+ See <http://sourceforge.net/projects/avf/>.
+
+- ~helm-ff-candidate-number-limit~ ::
+
+ #+vindex: helm-ff-candidate-number-limit
+
+ *Standard Value*: 5000
+
+ The ~helm-candidate-number-limit~ for ~helm-find-files~ and friends.
+ Note that when going one level up with
+ ~C-l~ the
+ length of directory will be used instead if it is higher than
+ this value. This is to avoid failing to preselect the previous
+ directory/file if this one is situated lower than
+ ~helm-ff-candidate-number-limit~ num candidate.
+
+- ~helm-ff-fuzzy-matching~ ::
+
+ #+vindex: helm-ff-fuzzy-matching
+
+ *Standard Value*: t
+
+ Enable fuzzy matching for ~helm-find-files~ when non--nil.
+ See ~helm-ff--transform-pattern-for-completion~ for more info.
+
+- ~helm-ff-goto-first-real-dired-exceptions~ ::
+
+ #+vindex: helm-ff-goto-first-real-dired-exceptions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (dired-goto-file)
+ #+end_src
+
+ Dired commands that are allowed moving to first real candidate.
+
+- ~helm-ff-kill-or-find-buffer-fname-fn~ ::
+
+ #+vindex: helm-ff-kill-or-find-buffer-fname-fn
+
+ *Standard Value*: helm-ff-kill-or-find-buffer-fname
+
+ Default function used to expand non-directory filenames in ~helm-find-files~.
+
+ This variable will take effect only in ~helm-find-files~. It
+ affects the behavior of persistent-action on filenames and
+ non-existing filenames.
+
+ The default is to expand filename on first hit on
+ C-j, pop buffer in
+ other window on second hit and finally kill this buffer on third
+ hit. This is very handy to create several new buffers, or when
+ navigating, show quickly the buffer of file to see its contents
+ briefly before killing it and continue navigating.
+
+ However some users may not want this, so to disable this behaviour
+ just set this to ~ignore~ function.
+
+ Of course you can also write your own function to do something
+ else.
+
+- ~helm-ff-lynx-style-map~ ::
+
+ #+vindex: helm-ff-lynx-style-map
+
+ *Standard Value*: t
+
+ Use arrow keys to navigate with ~helm-find-files~.
+ Note that if you define this variable with ~setq~ your change
+ will have no effect, use customize instead.
+
+- ~helm-ff-newfile-prompt-p~ ::
+
+ #+vindex: helm-ff-newfile-prompt-p
+
+ *Standard Value*: t
+
+ Whether Prompt or not when creating new file.
+ This set ~ffap-newfile-prompt~.
+
+- ~helm-ff-search-library-in-sexp~ ::
+
+ #+vindex: helm-ff-search-library-in-sexp
+
+ *Standard Value*: nil
+
+ Search for library in ~require~ and ~declare-function~ sexp.
+
+- ~helm-ff-transformer-show-only-basename~ ::
+
+ #+vindex: helm-ff-transformer-show-only-basename
+
+ *Standard Value*: t
+
+ Show only basename of candidates in ~helm-find-files~.
+ This can be toggled at anytime from ~helm-find-files~ with C-].
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff--delete-async-modeline-mode~ ::
+
+ #+vindex: helm-ff--delete-async-modeline-mode
+
+ *Standard Value*: nil
+
+ (helm-ff--delete-async-modeline-mode &optional ARG)
+
+ Notify mode-line that an async process run.
+
+ If called interactively, toggle `Helm-Ff--Delete-Async-Modeline
+ mode'. If the prefix argument is positive, enable the mode, and
+ if it is zero or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-dwim-target~ ::
+
+ #+vindex: helm-dwim-target
+
+ *Standard Value*: nil
+
+ Default target directory for file actions.
+
+ Define the directory where you want to start navigating for the
+ target directory when copying, renaming, etc.. You can use the
+ ~default-directory~ of ~next-window~, the current
+ ~default-directory~ or have completion on all the directories
+ belonging to each window.
+
+- ~helm-modes-using-escaped-strings~ ::
+
+ #+vindex: helm-modes-using-escaped-strings
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (eshell-mode shell-mode term-mode)
+ #+end_src
+
+ Modes that requires string’s insertion to be escaped.
+
+- ~helm-mounted-network-directories~ ::
+
+ #+vindex: helm-mounted-network-directories
+
+ *Standard Value*: nil
+
+ A list of directories used for mounting remotes filesystem.
+
+ When nil ~helm-file-on-mounted-network-p~ always return nil
+ otherwise check if a file is in one of these directories.
+
+ Remote filesystem are generally mounted with sshfs.
+
+- ~helm-tooltip-hide-delay~ ::
+
+ #+vindex: helm-tooltip-hide-delay
+
+ *Standard Value*: 25
+
+ Hide tooltips automatically after this many seconds.
+
+- ~helm-tramp-verbose~ ::
+
+ #+vindex: helm-tramp-verbose
+
+ *Standard Value*: 0
+
+ Just like ~tramp-verbose~ but specific to Helm.
+ When set to 0 don’t show tramp messages in Helm.
+ If you want to have the default tramp messages set it to 3.
+
+*** Hooks in library =helm-files=
+
+**** After
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-find-files-after-init-hook~ ::
+
+ #+vindex: helm-find-files-after-init-hook
+
+ *Standard Value*: nil
+
+ Hook that run after initialization of ~helm-find-files~.
+
+**** Before
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-find-files-before-init-hook~ ::
+
+ #+vindex: helm-find-files-before-init-hook
+
+ *Standard Value*: nil
+
+ Hook that run before initialization of ~helm-find-files~.
+
+**** Ff
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff--delete-async-modeline-mode-hook~ ::
+
+ #+vindex: helm-ff--delete-async-modeline-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-ff--delete-async-modeline-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm-ff--update-resume-after-hook~ ::
+
+ #+vindex: helm-ff--update-resume-after-hook
+
+ *Standard Value*:
+
+- ~helm-ff-before-action-hook-fn~ ::
+
+ #+vindex: helm-ff-before-action-hook-fn
+
+ *Standard Value*:
+
+- ~helm-ff-setup-update-hook~ ::
+
+ #+vindex: helm-ff-setup-update-hook
+
+ *Standard Value*:
+
+** Library: helm-find
+
+*** Commands in keymap ~helm-find-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(DEL)}}} (~helm-delete-backward-no-update~) ::
+
+ #+findex: helm-delete-backward-no-update @r{(helm-find-map)}
+
+ #+kindex: DEL @r{(helm-find-map)}
+
+ (helm-delete-backward-no-update ARG)
+
+ Disable update and delete ARG chars backward.
+ Update is reenabled when idle 1s.
+
+*** Commands in library ~helm-find~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c /)}}} (~helm-find~) ::
+
+ #+findex: helm-find
+
+ #+kindex: C-x c /
+
+ (helm-find ARG)
+
+ Preconfigured ~helm~ for the find shell command.
+
+ Recursively find files whose names are matched by all specified
+ globbing PATTERNs under the current directory using the external
+ program specified in ~find-program~ (usually "find"). Every
+ input PATTERN is silently wrapped into two stars: *PATTERN*.
+
+ With prefix argument, prompt for a directory to search.
+
+ When user option ~helm-findutils-search-full-path~ is non-nil,
+ match against complete paths, otherwise, against file names
+ without directory part.
+
+ The (possibly empty) list of globbing PATTERNs can be followed by
+ the separator "*" plus any number of additional arguments that
+ are passed to "find" literally.
+
+*** Options in library =helm-find=
+
+**** Findutils
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-findutils-search-full-path~ ::
+
+ #+vindex: helm-findutils-search-full-path
+
+ *Standard Value*: nil
+
+ Search in full path with shell command find when non-nil.
+ I.e. use the -path/ipath arguments of find instead of
+ -name/iname.
+
+- ~helm-findutils-skip-boring-files~ ::
+
+ #+vindex: helm-findutils-skip-boring-files
+
+ *Standard Value*: t
+
+ Ignore boring files in find command results.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-find-noerrors~ ::
+
+ #+vindex: helm-find-noerrors
+
+ *Standard Value*: nil
+
+ Prevent showing error messages in helm buffer when non nil.
+
+** Library: helm-font
+
+*** Commands in keymap ~helm-ucs-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-<left>)}}} (~helm-ucs-persistent-backward~) ::
+
+ #+findex: helm-ucs-persistent-backward @r{(helm-ucs-map)}
+
+ #+kindex: C-<left> @r{(helm-ucs-map)}
+
+- {{{kbd(C-<backspace>)}}} (~helm-ucs-persistent-delete~) ::
+
+ #+findex: helm-ucs-persistent-delete @r{(helm-ucs-map)}
+
+ #+kindex: C-<backspace> @r{(helm-ucs-map)}
+
+- {{{kbd(C-<right>)}}} (~helm-ucs-persistent-forward~) ::
+
+ #+findex: helm-ucs-persistent-forward @r{(helm-ucs-map)}
+
+ #+kindex: C-<right> @r{(helm-ucs-map)}
+
+- {{{kbd(C-c SPC)}}} (~helm-ucs-persistent-insert-space~) ::
+
+ #+findex: helm-ucs-persistent-insert-space @r{(helm-ucs-map)}
+
+ #+kindex: C-c SPC @r{(helm-ucs-map)}
+
+*** Commands in library ~helm-font~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c F)}}} (~helm-select-xfont~) ::
+
+ #+findex: helm-select-xfont
+
+ #+kindex: C-x c F
+
+ Preconfigured ~helm~ to select Xfont.
+
+- {{{kbd(C-x c 8)}}} (~helm-ucs~) ::
+
+ #+findex: helm-ucs
+
+ #+kindex: C-x c 8
+
+ (helm-ucs ARG)
+
+ Preconfigured ~helm~ for ~ucs-names~.
+
+ Called with a prefix arg force reloading cache.
+
+*** Options in library =helm-font=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ucs-actions~ ::
+
+ #+vindex: helm-ucs-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Insert character" . helm-ucs-insert-char)
+ ("Insert character name" . helm-ucs-insert-name)
+ ("Insert character code in hex" . helm-ucs-insert-code)
+ ("Kill marked characters" . helm-ucs-kill-char)
+ ("Kill name" . helm-ucs-kill-name)
+ ("Kill code" . helm-ucs-kill-code))
+ #+end_src
+
+ Actions for ~helm-source-ucs~.
+
+- ~helm-ucs-recent-size~ ::
+
+ #+vindex: helm-ucs-recent-size
+
+ *Standard Value*: 10
+
+ Number of recent chars to keep.
+
+** Library: helm-for-files
+
+*** Commands in library ~helm-for-files~ (excludes keymaps)
+
+**** Files
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-for-files~ ::
+
+ #+findex: helm-for-files
+
+ Preconfigured ~helm~ for opening files.
+ Run all sources defined in ~helm-for-files-preferred-list~.
+
+- {{{kbd(C-x c f)}}} (~helm-multi-files~) ::
+
+ #+findex: helm-multi-files
+
+ #+kindex: C-x c f
+
+ Preconfigured helm like ~helm-for-files~ but running locate only on demand.
+
+ Allow toggling back and forth from locate to others sources with
+ ~helm-multi-files-toggle-locate-binding~ key.
+ This avoids launching locate needlessly when what you are
+ searching for is already found.
+
+- ~helm-multi-files-toggle-to-locate~ ::
+
+ #+findex: helm-multi-files-toggle-to-locate
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c C-c f)}}} (~helm-recentf~) ::
+
+ #+findex: helm-recentf
+
+ #+kindex: C-x c C-c f
+
+ Preconfigured ~helm~ for ~recentf~.
+
+*** Options in library =helm-for-files=
+
+**** Fuzzy
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-file-cache-fuzzy-match~ ::
+
+ #+vindex: helm-file-cache-fuzzy-match
+
+ *Standard Value*: nil
+
+ Enable fuzzy matching in ~helm-source-file-cache~ when non--nil.
+
+**** Recentf
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-recentf-fuzzy-match~ ::
+
+ #+vindex: helm-recentf-fuzzy-match
+
+ *Standard Value*: nil
+
+ Enable fuzzy matching in ~helm-source-recentf~ when non-nil.
+
+- ~helm-turn-on-recentf~ ::
+
+ #+vindex: helm-turn-on-recentf
+
+ *Standard Value*: t
+
+ Automatically turn on ~recentf-mode~ when non-nil.
+
+**** Files
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-for-files-preferred-list~ ::
+
+ #+vindex: helm-for-files-preferred-list
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-source-buffers-list helm-source-recentf helm-source-bookmarks helm-source-file-cache helm-source-files-in-current-dir helm-source-locate)
+ #+end_src
+
+ Your preferred sources for ~helm-for-files~ and ~helm-multi-files~.
+
+ When adding a source here it is up to you to ensure the library
+ of this source is accessible and properly loaded.
+
+- ~helm-for-files-tramp-not-fancy~ ::
+
+ #+vindex: helm-for-files-tramp-not-fancy
+
+ *Standard Value*: t
+
+ Colorize remote files when non nil.
+
+ Be aware that a nil value will make tramp display very slow.
+
+- ~helm-multi-files-toggle-locate-binding~ ::
+
+ #+vindex: helm-multi-files-toggle-locate-binding
+
+ *Standard Value*: C-c p
+
+ Default binding to switch back and forth locate in ~helm-multi-files~.
+
+** Library: helm-global-bindings
+
+*** Commands in keymap ~helm-command-map~
+
+**** View Helm Documentation
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(h h)}}} ::
+- {{{kbd(C-x c h h)}}} (~helm-documentation~) ::
+
+ #+findex: helm-documentation @r{(helm-command-map)}
+
+ #+kindex: h h @r{(helm-command-map)}
+ #+kindex: C-x c h h @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for Helm documentation.
+ With a prefix arg refresh the documentation.
+
+ Find here the documentation of all documented sources.
+
+**** Execute Extended Command
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-x)}}} ::
+- {{{kbd(C-x c M-x)}}} ::
+- {{{kbd(<execute>)}}} ::
+- {{{kbd(<menu>)}}} (~helm-M-x~) ::
+
+ #+findex: helm-M-x @r{(helm-command-map)}
+
+ #+kindex: M-x @r{(helm-command-map)}
+ #+kindex: C-x c M-x @r{(helm-command-map)}
+ #+kindex: <execute> @r{(helm-command-map)}
+ #+kindex: <menu> @r{(helm-command-map)}
+
+ (helm-M-x ARG)
+
+ Preconfigured ~helm~ for Emacs commands.
+ It is ~helm~ replacement of regular ~M-x~
+ ~execute-extended-command~.
+
+ Unlike regular ~M-x~ Emacs vanilla ~execute-extended-command~
+ command, the prefix args if needed, can be passed AFTER starting
+ ~helm-M-x~. When a prefix arg is passed BEFORE starting
+ ~helm-M-x~, the first ~C-u~ while in ~helm-M-x~ session will
+ disable it.
+
+ You can get help on each command by persistent action.
+
+**** Find Files
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x C-f)}}} ::
+- {{{kbd(C-x c C-x C-f)}}} ::
+- {{{kbd(<open>)}}} (~helm-find-files~) ::
+
+ #+findex: helm-find-files @r{(helm-command-map)}
+
+ #+kindex: C-x C-f @r{(helm-command-map)}
+ #+kindex: C-x c C-x C-f @r{(helm-command-map)}
+ #+kindex: <open> @r{(helm-command-map)}
+
+ (helm-find-files ARG)
+
+ Preconfigured ~helm~ for helm implementation of ~find-file~.
+ Called with a prefix arg show history if some.
+ Don't call it from programs, use ~helm-find-files-1~ instead.
+ This is the starting point for nearly all actions you can do on
+ files.
+
+- {{{kbd(f)}}} ::
+- {{{kbd(C-x c f)}}} (~helm-multi-files~) ::
+
+ #+findex: helm-multi-files @r{(helm-command-map)}
+
+ #+kindex: f @r{(helm-command-map)}
+ #+kindex: C-x c f @r{(helm-command-map)}
+
+ Preconfigured helm like ~helm-for-files~ but running locate only on demand.
+
+ Allow toggling back and forth from locate to others sources with
+ ~helm-multi-files-toggle-locate-binding~ key.
+ This avoids launching locate needlessly when what you are
+ searching for is already found.
+
+**** Visit recent Files
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c f)}}} ::
+- {{{kbd(C-x c C-c f)}}} (~helm-recentf~) ::
+
+ #+findex: helm-recentf @r{(helm-command-map)}
+
+ #+kindex: C-c f @r{(helm-command-map)}
+ #+kindex: C-x c C-c f @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for ~recentf~.
+
+**** Run Find
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(/)}}} ::
+- {{{kbd(C-x c /)}}} (~helm-find~) ::
+
+ #+findex: helm-find @r{(helm-command-map)}
+
+ #+kindex: / @r{(helm-command-map)}
+ #+kindex: C-x c / @r{(helm-command-map)}
+
+ (helm-find ARG)
+
+ Preconfigured ~helm~ for the find shell command.
+
+ Recursively find files whose names are matched by all specified
+ globbing PATTERNs under the current directory using the external
+ program specified in ~find-program~ (usually "find"). Every
+ input PATTERN is silently wrapped into two stars: *PATTERN*.
+
+ With prefix argument, prompt for a directory to search.
+
+ When user option ~helm-findutils-search-full-path~ is non-nil,
+ match against complete paths, otherwise, against file names
+ without directory part.
+
+ The (possibly empty) list of globbing PATTERNs can be followed by
+ the separator "*" plus any number of additional arguments that
+ are passed to "find" literally.
+
+**** Run locate
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(l)}}} ::
+- {{{kbd(C-x c l)}}} (~helm-locate~) ::
+
+ #+findex: helm-locate @r{(helm-command-map)}
+
+ #+kindex: l @r{(helm-command-map)}
+ #+kindex: C-x c l @r{(helm-command-map)}
+
+ (helm-locate ARG)
+
+ Preconfigured ~helm~ for Locate.
+ Note: you can add locate options after entering pattern.
+ See 'man locate' for valid options and also ~helm-locate-command~.
+
+ You can specify a local database with prefix argument ARG.
+ With two prefix arg, refresh the current local db or create it if
+ it doesn't exists.
+
+ To create a user specific db, use
+ "updatedb -l 0 -o db_path -U directory".
+ Where db_path is a filename matched by
+ ~helm-locate-db-file-regexp~.
+
+**** List Buffers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x C-b)}}} ::
+- {{{kbd(C-x c C-x C-b)}}} (~helm-buffers-list~) ::
+
+ #+findex: helm-buffers-list @r{(helm-command-map)}
+
+ #+kindex: C-x C-b @r{(helm-command-map)}
+ #+kindex: C-x c C-x C-b @r{(helm-command-map)}
+
+ Preconfigured ~helm~ to list buffers.
+
+**** Browse kill-ring
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-y)}}} ::
+- {{{kbd(C-x c M-y)}}} (~helm-show-kill-ring~) ::
+
+ #+findex: helm-show-kill-ring @r{(helm-command-map)}
+
+ #+kindex: M-y @r{(helm-command-map)}
+ #+kindex: C-x c M-y @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for ~kill-ring~.
+ It is drop-in replacement of ~yank-pop~.
+
+ First call open the kill-ring browser, next calls move to next line.
+
+**** List Bookmarks
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x r b)}}} ::
+- {{{kbd(C-x c C-x r b)}}} (~helm-filtered-bookmarks~) ::
+
+ #+findex: helm-filtered-bookmarks @r{(helm-command-map)}
+
+ #+kindex: C-x r b @r{(helm-command-map)}
+ #+kindex: C-x c C-x r b @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for bookmarks (filtered by category).
+ Optional source ~helm-source-bookmark-addressbook~ is loaded only
+ if external addressbook-bookmark package is installed.
+
+**** List Registers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x r i)}}} ::
+- {{{kbd(C-x c C-x r i)}}} (~helm-register~) ::
+
+ #+findex: helm-register @r{(helm-command-map)}
+
+ #+kindex: C-x r i @r{(helm-command-map)}
+ #+kindex: C-x c C-x r i @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for Emacs registers.
+
+**** Mark Ring
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c SPC)}}} ::
+- {{{kbd(C-x c C-c SPC)}}} (~helm-all-mark-rings~) ::
+
+ #+findex: helm-all-mark-rings @r{(helm-command-map)}
+
+ #+kindex: C-c SPC @r{(helm-command-map)}
+ #+kindex: C-x c C-c SPC @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for ~helm-source-global-mark-ring~ and ~helm-source-mark-ring~.
+
+**** Run Occur
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-s o)}}} ::
+- {{{kbd(C-x c M-s o)}}} (~helm-occur~) ::
+
+ #+findex: helm-occur @r{(helm-command-map)}
+
+ #+kindex: M-s o @r{(helm-command-map)}
+ #+kindex: C-x c M-s o @r{(helm-command-map)}
+
+ Preconfigured helm for searching lines matching pattern in ~current-buffer~.
+
+ When ~helm-source-occur~ is member of
+ ~helm-sources-using-default-as-input~ which is the default,
+ symbol at point is searched at startup.
+
+ When a region is marked search only in this region by narrowing.
+
+ To search in multiples buffers start from one of the commands listing
+ buffers (i.e. a helm command using ~helm-source-buffers-list~ like
+ ~helm-mini~) and use the multi occur buffers action.
+
+ This is the helm implementation that collect lines matching pattern
+ like vanilla Emacs ~occur~ but have nothing to do with it, the search
+ engine beeing completely different and also much faster.
+
+**** Run Grep and friends
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-g a)}}} ::
+- {{{kbd(C-x c M-g a)}}} (~helm-do-grep-ag~) ::
+
+ #+findex: helm-do-grep-ag @r{(helm-command-map)}
+
+ #+kindex: M-g a @r{(helm-command-map)}
+ #+kindex: C-x c M-g a @r{(helm-command-map)}
+
+ (helm-do-grep-ag ARG)
+
+ Preconfigured ~helm~ for grepping with AG in ~default-directory~.
+ With prefix arg prompt for type if available with your AG
+ version.
+
+- {{{kbd(M-g i)}}} ::
+- {{{kbd(C-x c M-g i)}}} (~helm-gid~) ::
+
+ #+findex: helm-gid @r{(helm-command-map)}
+
+ #+kindex: M-g i @r{(helm-command-map)}
+ #+kindex: C-x c M-g i @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for ~gid~ command line of ~ID-Utils~.
+ Need A database created with the command ~mkid~ above
+ ~default-directory~.
+ Need id-utils as dependency which provide ~mkid~, ~gid~ etc..
+ See <https://www.gnu.org/software/idutils/>.
+
+**** Imenu
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(e)}}} ::
+- {{{kbd(C-x c e)}}} (~helm-etags-select~) ::
+
+ #+findex: helm-etags-select @r{(helm-command-map)}
+
+ #+kindex: e @r{(helm-command-map)}
+ #+kindex: C-x c e @r{(helm-command-map)}
+
+ (helm-etags-select REINIT)
+
+ Preconfigured helm for etags.
+ If called with a prefix argument REINIT
+ or if any of the tag files have been modified, reinitialize cache.
+
+ This function aggregates three sources of tag files:
+
+ 1) An automatically located file in the parent directories,
+ by ~helm-etags-get-tag-file~.
+ 2) ~tags-file-name~, which is commonly set by ~find-tag~ command.
+ 3) ~tags-table-list~ which is commonly set by ~visit-tags-table~ command.
+
+- {{{kbd(i)}}} ::
+- {{{kbd(C-x c i)}}} (~helm-imenu~) ::
+
+ #+findex: helm-imenu @r{(helm-command-map)}
+
+ #+kindex: i @r{(helm-command-map)}
+ #+kindex: C-x c i @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for ~imenu~.
+
+- {{{kbd(I)}}} ::
+- {{{kbd(C-x c I)}}} (~helm-imenu-in-all-buffers~) ::
+
+ #+findex: helm-imenu-in-all-buffers @r{(helm-command-map)}
+
+ #+kindex: I @r{(helm-command-map)}
+ #+kindex: C-x c I @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for fetching imenu entries in all buffers with similar mode as current.
+ A mode is similar as current if it is the same, it is derived
+ i.e. ~derived-mode-p~ or it have an association in
+ ~helm-imenu-all-buffer-assoc~.
+
+**** Lisp Completion at Point
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(<tab>)}}} ::
+- {{{kbd(C-x c <tab>)}}} (~helm-lisp-completion-at-point~) ::
+
+ #+findex: helm-lisp-completion-at-point @r{(helm-command-map)}
+
+ #+kindex: <tab> @r{(helm-command-map)}
+ #+kindex: C-x c <tab> @r{(helm-command-map)}
+
+ Preconfigured Helm for Lisp symbol completion at point.
+
+**** Calculate Expression
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-,)}}} ::
+- {{{kbd(C-x c C-,)}}} (~helm-calcul-expression~) ::
+
+ #+findex: helm-calcul-expression @r{(helm-command-map)}
+
+ #+kindex: C-, @r{(helm-command-map)}
+ #+kindex: C-x c C-, @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for ~helm-source-calculation-result~.
+
+- {{{kbd(C-:)}}} ::
+- {{{kbd(C-x c C-:)}}} (~helm-eval-expression-with-eldoc~) ::
+
+ #+findex: helm-eval-expression-with-eldoc @r{(helm-command-map)}
+
+ #+kindex: C-: @r{(helm-command-map)}
+ #+kindex: C-x c C-: @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for ~helm-source-evaluation-result~ with ~eldoc~ support.
+
+- {{{kbd(r)}}} ::
+- {{{kbd(C-x c r)}}} (~helm-regexp~) ::
+
+ #+findex: helm-regexp @r{(helm-command-map)}
+
+ #+kindex: r @r{(helm-command-map)}
+ #+kindex: C-x c r @r{(helm-command-map)}
+
+ Preconfigured helm to build regexps.
+ ~query-replace-regexp~ can be run from there against found regexp.
+
+**** Get help for thing at point
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(h i)}}} ::
+- {{{kbd(C-x c h i)}}} (~helm-info-at-point~) ::
+
+ #+findex: helm-info-at-point @r{(helm-command-map)}
+
+ #+kindex: h i @r{(helm-command-map)}
+ #+kindex: C-x c h i @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for searching info at point.
+
+**** View Emacs manauals
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(h r)}}} ::
+- {{{kbd(C-x c h r)}}} (~helm-info-emacs~) ::
+
+ #+findex: helm-info-emacs @r{(helm-command-map)}
+
+ #+kindex: h r @r{(helm-command-map)}
+ #+kindex: C-x c h r @r{(helm-command-map)}
+
+ Predefined helm for emacs info.
+
+- {{{kbd(h g)}}} ::
+- {{{kbd(C-x c h g)}}} (~helm-info-gnus~) ::
+
+ #+findex: helm-info-gnus @r{(helm-command-map)}
+
+ #+kindex: h g @r{(helm-command-map)}
+ #+kindex: C-x c h g @r{(helm-command-map)}
+
+ Predefined helm for gnus info.
+
+**** Get Elisp Help
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(a)}}} ::
+- {{{kbd(C-x c a)}}} ::
+- {{{kbd(C-h a)}}} ::
+- {{{kbd(<f1> a)}}} ::
+- {{{kbd(<help> a)}}} (~helm-apropos~) ::
+
+ #+findex: helm-apropos @r{(helm-command-map)}
+
+ #+kindex: a @r{(helm-command-map)}
+ #+kindex: C-x c a @r{(helm-command-map)}
+ #+kindex: C-h a @r{(helm-command-map)}
+ #+kindex: <f1> a @r{(helm-command-map)}
+ #+kindex: <help> a @r{(helm-command-map)}
+
+ (helm-apropos DEFAULT)
+
+ Preconfigured Helm to describe commands, functions, variables and faces.
+ In non interactives calls DEFAULT argument should be provided as
+ a string, i.e. the ~symbol-name~ of any existing symbol.
+
+**** List Manpages
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(m)}}} ::
+- {{{kbd(C-x c m)}}} (~helm-man-woman~) ::
+
+ #+findex: helm-man-woman @r{(helm-command-map)}
+
+ #+kindex: m @r{(helm-command-map)}
+ #+kindex: C-x c m @r{(helm-command-map)}
+
+ (helm-man-woman ARG)
+
+ Preconfigured ~helm~ for Man and Woman pages.
+ With a prefix arg reinitialize the cache.
+
+**** List Emacs Processes
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(p)}}} ::
+- {{{kbd(C-x c p)}}} (~helm-list-emacs-process~) ::
+
+ #+findex: helm-list-emacs-process @r{(helm-command-map)}
+
+ #+kindex: p @r{(helm-command-map)}
+ #+kindex: C-x c p @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for Emacs process.
+
+**** List Emacs Lisp Packages
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(@)}}} ::
+- {{{kbd(C-x c @)}}} (~helm-list-elisp-packages~) ::
+
+ #+findex: helm-list-elisp-packages @r{(helm-command-map)}
+
+ #+kindex: @ @r{(helm-command-map)}
+ #+kindex: C-x c @ @r{(helm-command-map)}
+
+ (helm-list-elisp-packages ARG)
+
+ Preconfigured ~helm~ for listing and handling Emacs packages.
+
+**** Resume Helm Session
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(b)}}} ::
+- {{{kbd(C-x c b)}}} (~helm-resume~) ::
+
+ #+findex: helm-resume @r{(helm-command-map)}
+
+ #+kindex: b @r{(helm-command-map)}
+ #+kindex: C-x c b @r{(helm-command-map)}
+
+ (helm-resume ARG)
+
+ Resume a previous Helm session.
+ Call with a prefix arg to choose among existing Helm
+ buffers (sessions). When calling from Lisp, specify a
+ ~buffer-name~ as a string with ARG.
+
+**** Run Exernal Command
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-x)}}} ::
+- {{{kbd(C-x c C-c C-x)}}} (~helm-run-external-command~) ::
+
+ #+findex: helm-run-external-command @r{(helm-command-map)}
+
+ #+kindex: C-c C-x @r{(helm-command-map)}
+ #+kindex: C-x c C-c C-x @r{(helm-command-map)}
+
+ (helm-run-external-command PROGRAM)
+
+ Preconfigured ~helm~ to run External PROGRAM asyncronously from Emacs.
+ If program is already running exit with error.
+ You can set your own list of commands with
+ ~helm-external-commands-list~.
+
+**** Search the Web
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c g)}}} ::
+- {{{kbd(C-x c C-c g)}}} (~helm-google-suggest~) ::
+
+ #+findex: helm-google-suggest @r{(helm-command-map)}
+
+ #+kindex: C-c g @r{(helm-command-map)}
+ #+kindex: C-x c C-c g @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for Google search with Google suggest.
+
+- {{{kbd(s)}}} ::
+- {{{kbd(C-x c s)}}} (~helm-surfraw~) ::
+
+ #+findex: helm-surfraw @r{(helm-command-map)}
+
+ #+kindex: s @r{(helm-command-map)}
+ #+kindex: C-x c s @r{(helm-command-map)}
+
+ (helm-surfraw PATTERN ENGINE)
+
+ Preconfigured ~helm~ to search PATTERN with search ENGINE.
+
+**** Run Top
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(t)}}} ::
+- {{{kbd(C-x c t)}}} (~helm-top~) ::
+
+ #+findex: helm-top @r{(helm-command-map)}
+
+ #+kindex: t @r{(helm-command-map)}
+ #+kindex: C-x c t @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for top command.
+
+**** List Unicode names
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(8)}}} ::
+- {{{kbd(C-x c 8)}}} (~helm-ucs~) ::
+
+ #+findex: helm-ucs @r{(helm-command-map)}
+
+ #+kindex: 8 @r{(helm-command-map)}
+ #+kindex: C-x c 8 @r{(helm-command-map)}
+
+ (helm-ucs ARG)
+
+ Preconfigured ~helm~ for ~ucs-names~.
+
+ Called with a prefix arg force reloading cache.
+
+**** Select XFont
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(F)}}} ::
+- {{{kbd(C-x c F)}}} (~helm-select-xfont~) ::
+
+ #+findex: helm-select-xfont @r{(helm-command-map)}
+
+ #+kindex: F @r{(helm-command-map)}
+ #+kindex: C-x c F @r{(helm-command-map)}
+
+ Preconfigured ~helm~ to select Xfont.
+
+**** List Colors
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(c)}}} ::
+- {{{kbd(C-x c c)}}} (~helm-colors~) ::
+
+ #+findex: helm-colors @r{(helm-command-map)}
+
+ #+kindex: c @r{(helm-command-map)}
+ #+kindex: C-x c c @r{(helm-command-map)}
+
+ Preconfigured ~helm~ for color.
+
+*** Options in library =helm-global-bindings=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-command-prefix-key~ ::
+
+ #+vindex: helm-command-prefix-key
+
+ *Standard Value*: C-x c
+
+ The key ~helm-command-prefix~ is bound to in the global map.
+
+- ~helm-minibuffer-history-key~ ::
+
+ #+vindex: helm-minibuffer-history-key
+
+ *Standard Value*: C-r
+
+ The key ~helm-minibuffer-history~ is bound to in minibuffer local maps.
+
+** Library: helm-grep
+
+*** Modes in library ~helm-grep~
+
+**** other-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-grep-mode~ ::
+
+ #+findex: helm-grep-mode
+
+ Major mode to provide actions in helm grep saved buffer.
+
+ Special commands:
+ \{helm-grep-mode-map}
+
+ In addition to any hooks its parent mode ~special-mode~ might have
+ run, this mode runs the hook ~helm-grep-mode-hook~, as the final or
+ penultimate step during initialization.
+
+*** Commands in keymap ~helm-grep-map~
+
+**** uncategorized Goto
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-<down>)}}} (~helm-goto-next-file~) ::
+
+ #+findex: helm-goto-next-file @r{(helm-grep-map)}
+
+ #+kindex: M-<down> @r{(helm-grep-map)}
+
+ Go to previous file in Helm grep/etags buffers.
+
+- {{{kbd(M-<up>)}}} (~helm-goto-precedent-file~) ::
+
+ #+findex: helm-goto-precedent-file @r{(helm-grep-map)}
+
+ #+kindex: M-<up> @r{(helm-grep-map)}
+
+ Go to previous file in Helm grep/etags buffers.
+
+**** uncategorized Grep
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(<left>)}}} (~helm-grep-run-default-action~) ::
+
+ #+findex: helm-grep-run-default-action @r{(helm-grep-map)}
+
+ #+kindex: <left> @r{(helm-grep-map)}
+
+ Run grep default action from ~helm-do-grep-1~.
+
+- {{{kbd(C-c C-o)}}} (~helm-grep-run-other-frame-action~) ::
+
+ #+findex: helm-grep-run-other-frame-action @r{(helm-grep-map)}
+
+ #+kindex: C-c C-o @r{(helm-grep-map)}
+
+ Run grep goto other frame action from ~helm-do-grep-1~.
+
+- {{{kbd(C-c o)}}} (~helm-grep-run-other-window-action~) ::
+
+ #+findex: helm-grep-run-other-window-action @r{(helm-grep-map)}
+
+ #+kindex: C-c o @r{(helm-grep-map)}
+
+ Run grep goto other window action from ~helm-do-grep-1~.
+
+- {{{kbd(C-x C-s)}}} (~helm-grep-run-save-buffer~) ::
+
+ #+findex: helm-grep-run-save-buffer @r{(helm-grep-map)}
+
+ #+kindex: C-x C-s @r{(helm-grep-map)}
+
+ Run grep save results action from ~helm-do-grep-1~.
+
+**** uncategorized uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(DEL)}}} (~helm-delete-backward-no-update~) ::
+
+ #+findex: helm-delete-backward-no-update @r{(helm-grep-map)}
+
+ #+kindex: DEL @r{(helm-grep-map)}
+
+ (helm-delete-backward-no-update ARG)
+
+ Disable update and delete ARG chars backward.
+ Update is reenabled when idle 1s.
+
+*** Commands in keymap ~helm-grep-mode-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-<down>)}}} ::
+- {{{kbd(M-N)}}} (~helm-gm-next-file~) ::
+
+ #+findex: helm-gm-next-file @r{(helm-grep-mode-map)}
+
+ #+kindex: M-<down> @r{(helm-grep-mode-map)}
+ #+kindex: M-N @r{(helm-grep-mode-map)}
+
+- {{{kbd(M-<up>)}}} ::
+- {{{kbd(M-P)}}} (~helm-gm-precedent-file~) ::
+
+ #+findex: helm-gm-precedent-file @r{(helm-grep-mode-map)}
+
+ #+kindex: M-<up> @r{(helm-grep-mode-map)}
+ #+kindex: M-P @r{(helm-grep-mode-map)}
+
+- {{{kbd(RET)}}} (~helm-grep-mode-jump~) ::
+
+ #+findex: helm-grep-mode-jump @r{(helm-grep-mode-map)}
+
+ #+kindex: RET @r{(helm-grep-mode-map)}
+
+- {{{kbd(C-o)}}} (~helm-grep-mode-jump-other-window~) ::
+
+ #+findex: helm-grep-mode-jump-other-window @r{(helm-grep-mode-map)}
+
+ #+kindex: C-o @r{(helm-grep-mode-map)}
+
+- {{{kbd(C-<up>)}}} ::
+- {{{kbd(M-p)}}} (~helm-grep-mode-jump-other-window-backward~) ::
+
+ #+findex: helm-grep-mode-jump-other-window-backward @r{(helm-grep-mode-map)}
+
+ #+kindex: C-<up> @r{(helm-grep-mode-map)}
+ #+kindex: M-p @r{(helm-grep-mode-map)}
+
+ (helm-grep-mode-jump-other-window-backward ARG)
+
+- {{{kbd(C-<down>)}}} ::
+- {{{kbd(M-n)}}} (~helm-grep-mode-jump-other-window-forward~) ::
+
+ #+findex: helm-grep-mode-jump-other-window-forward @r{(helm-grep-mode-map)}
+
+ #+kindex: C-<down> @r{(helm-grep-mode-map)}
+ #+kindex: M-n @r{(helm-grep-mode-map)}
+
+ (helm-grep-mode-jump-other-window-forward ARG)
+
+*** Commands in keymap ~helm-pdfgrep-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(DEL)}}} (~helm-delete-backward-no-update~) ::
+
+ #+findex: helm-delete-backward-no-update @r{(helm-pdfgrep-map)}
+
+ #+kindex: DEL @r{(helm-pdfgrep-map)}
+
+ (helm-delete-backward-no-update ARG)
+
+ Disable update and delete ARG chars backward.
+ Update is reenabled when idle 1s.
+
+- {{{kbd(M-<down>)}}} (~helm-goto-next-file~) ::
+
+ #+findex: helm-goto-next-file @r{(helm-pdfgrep-map)}
+
+ #+kindex: M-<down> @r{(helm-pdfgrep-map)}
+
+ Go to previous file in Helm grep/etags buffers.
+
+- {{{kbd(M-<up>)}}} (~helm-goto-precedent-file~) ::
+
+ #+findex: helm-goto-precedent-file @r{(helm-pdfgrep-map)}
+
+ #+kindex: M-<up> @r{(helm-pdfgrep-map)}
+
+ Go to previous file in Helm grep/etags buffers.
+
+*** Commands in library ~helm-grep~ (excludes keymaps)
+
+**** Do
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c M-g a)}}} (~helm-do-grep-ag~) ::
+
+ #+findex: helm-do-grep-ag
+
+ #+kindex: C-x c M-g a
+
+ (helm-do-grep-ag ARG)
+
+ Preconfigured ~helm~ for grepping with AG in ~default-directory~.
+ With prefix arg prompt for type if available with your AG
+ version.
+
+- ~helm-grep-do-git-grep~ ::
+
+ #+findex: helm-grep-do-git-grep
+
+ (helm-grep-do-git-grep ARG)
+
+ Preconfigured ~helm~ for git-grepping ~default-directory~.
+ With a prefix arg ARG git-grep the whole repository.
+
+**** Mode
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-grep-mode-mouse-jump~ ::
+
+ #+findex: helm-grep-mode-mouse-jump
+
+ (helm-grep-mode-mouse-jump EVENT)
+
+**** other-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-grep-mode~ ::
+
+ #+findex: helm-grep-mode
+
+ Major mode to provide actions in helm grep saved buffer.
+
+ Special commands:
+ \{helm-grep-mode-map}
+
+ In addition to any hooks its parent mode ~special-mode~ might have
+ run, this mode runs the hook ~helm-grep-mode-hook~, as the final or
+ penultimate step during initialization.
+
+*** Options in library =helm-grep=
+
+**** Style
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-grep-file-path-style~ ::
+
+ #+vindex: helm-grep-file-path-style
+
+ *Standard Value*: basename
+
+ File path display style when grep results are displayed.
+ Possible value are:
+ basename: displays only the filename, none of the directory path
+ absolute: displays absolute path
+ relative: displays relative path from root grep directory.
+
+- ~helm-grep-use-ioccur-style-keys~ ::
+
+ #+vindex: helm-grep-use-ioccur-style-keys
+
+ *Standard Value*: t
+
+ Use Arrow keys to jump to occurences.
+ Note that if you define this variable with ~setq~ your change
+ will have no effect, use customize instead.
+
+**** Zgrep
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-zgrep-file-extension-regexp~ ::
+
+ #+vindex: helm-zgrep-file-extension-regexp
+
+ *Standard Value*: .*\(\.gz\|\.bz\|\.xz\|\.lzma\)$
+
+ Default file extensions zgrep will search in.
+
+**** Ignored
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-grep-ignored-directories~ ::
+
+ #+vindex: helm-grep-ignored-directories
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("SCCS/" "RCS/" "CVS/" "MCVS/" ".svn/" ".git/" ".hg/" ".bzr/" "_MTN/" "_darcs/" "{arch}/" ".gvfs/")
+ #+end_src
+
+ List of names of sub-directories which ~helm-grep~ shall not recurse into.
+
+- ~helm-grep-ignored-files~ ::
+
+ #+vindex: helm-grep-ignored-files
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (".#*" "*.o" "*~" "*.bin" "*.lbin" "*.so" "*.a" "*.ln" "*.blg" "*.bbl" "*.elc" "*.lof" "*.glo" "*.idx" "*.lot" "*.fmt" "*.tfm" "*.class" "*.fas" "*.lib" "*.mem" "*.x86f" "*.sparcf" "*.dfsl" "*.pfsl" "*.d64fsl" "*.p64fsl" "*.lx64fsl" "*.lx32fsl" "*.dx64fsl" "*.dx32fsl" "*.fx64fsl" "*.fx32fsl" "*.sx64fsl" "*.sx32fsl" "*.wx64fsl" "*.wx32fsl" "*.fasl" "*.ufsl" "*.fsl" "*.dxl" "*.lo" "*.la" "*.gmo" "*.mo" "*.toc" "*.aux" "*.cp" "*.fn" "*.ky" "*.pg" "*.tp" "*.vr" "*.cps" "*.fns" "*.kys" "*.pgs" "*.tps" "*.vrs" "*.pyc" "*.pyo")
+ #+end_src
+
+ List of file names which ~helm-grep~ shall exclude.
+
+**** Switches
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-grep-ag-pipe-cmd-switches~ ::
+
+ #+vindex: helm-grep-ag-pipe-cmd-switches
+
+ *Standard Value*: nil
+
+ A list of additional parameters to pass to grep-ag pipe command.
+ Use parameters compatibles with the backend you are using
+ (i.e. AG for AG, PT for PT or RG for RG)
+
+ You probably don’t need to use this unless you know what you are
+ doing.
+
+- ~helm-grep-pipe-cmd-switches~ ::
+
+ #+vindex: helm-grep-pipe-cmd-switches
+
+ *Standard Value*: nil
+
+ A list of additional parameters to pass to grep pipe command.
+ This will be used to pipe command for multiple pattern matching
+ for grep, zgrep ack-grep and git-grep backends.
+ If you add extra args for ack-grep, use ack-grep options, for
+ others (grep, zgrep and git-grep) use grep options.
+ Here are the commands where you may want to add switches:
+
+ grep --color=always
+ ack-grep --smart-case --color
+
+ You probably don’t need to use this unless you know what you are
+ doing.
+
+**** Command Default
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-default-zgrep-command~ ::
+
+ #+vindex: helm-default-zgrep-command
+
+ *Standard Value*: zgrep --color=always -a -n%cH -e %p %f
+
+ Default command for Zgrep.
+ See ~helm-grep-default-command~ for infos on format specs.
+ Option --color=always is supported and can be used safely to
+ replace the Helm internal match highlighting. See
+ ~helm-grep-default-command~ for more infos.
+
+- ~helm-grep-default-command~ ::
+
+ #+vindex: helm-grep-default-command
+
+ *Standard Value*: grep --color=always -a -d skip %e -n%cH -e %p %f
+
+ Default grep format command for ~helm-do-grep-1~.
+ Where:
+ ’%e’ format spec is for --exclude or --include grep options or
+ ack-grep --type option. (Not mandatory)
+
+ ’%c’ format spec is for case-fold-search,
+ whether to use the -i option of grep. (Not mandatory)
+ When you specify this spec, helm grep will use smartcase
+ that is when a upcase character is found in pattern case will
+ be respected and no ’-i’ option will be used, otherwise, when
+ no upcase character is found in pattern always use ’-i’.
+ If you don’t want this behavior, don’t use this spec and
+ specify or not the ’-i’ option.
+ Note that with ack-grep this is not needed, just specify
+ the ’--smart-case’ option.
+
+ ’%p’ format spec is for pattern. (Mandatory)
+
+ ’%f’ format spec is for filenames. (Mandatory)
+
+ If your grep version doesn’t support the --exclude/include args
+ don’t specify the ’%e’ format spec.
+
+ Helm also support ack-grep and git-grep. The following is a
+ default command example for ack-grep:
+
+ (setq helm-grep-default-command "ack-grep -Hn --color --smart-case --no-group %e %p %f"
+ helm-grep-default-recurse-command "ack-grep -H --color --smart-case --no-group %e %p %f")
+
+ You can ommit the %e spec if you don’t want to be prompted for
+ types.
+
+ NOTE: Helm for ack-grep support ANSI sequences, so you can remove
+ the "--no-color" option safely (recommended).
+ However you should specify --color to enable multi matches highlighting
+ because ack disable it when output is piped.
+
+ Same for grep you can use safely the option "--color=always" (default).
+ You can customize the color of matches using GREP_COLORS env var.
+ e.g: (setenv "GREP_COLORS" "ms=30;43:mc=30;43:sl=01;37:cx=:fn=35:ln=32:bn=32:se=36")
+
+ To enable ANSI color in git-grep just add "--color=always".
+ To customize the ANSI color in git-grep, GREP_COLORS have no effect,
+ you will have to setup this in your .gitconfig:
+
+ [color "grep"]
+ match = black yellow
+
+ Where "black" is the foreground and "yellow" the background.
+ See the git documentation for more infos.
+
+ ~helm-grep-default-command~ and
+ ~helm-grep-default-recurse-command~ are independent, so you can
+ enable ~helm-grep-default-command~ with ack-grep and
+ ~helm-grep-default-recurse-command~ with grep if you want to be
+ faster on recursive grep.
+
+ NOTE: Remote grepping is not available with ack-grep, and badly
+ supported with grep because tramp handles badly repeated
+ remote processes in a short delay (< to 5s).
+
+- ~helm-grep-default-recurse-command~ ::
+
+ #+vindex: helm-grep-default-recurse-command
+
+ *Standard Value*: grep --color=always -a -d recurse %e -n%cH -e %p %f
+
+ Default recursive grep format command for ~helm-do-grep-1~.
+ See ~helm-grep-default-command~ for format specs and infos about
+ ack-grep.
+
+- ~helm-pdfgrep-default-command~ ::
+
+ #+vindex: helm-pdfgrep-default-command
+
+ *Standard Value*: pdfgrep --color always -niH %s %s
+
+ Default command for pdfgrep.
+ Option "--color always" is supported starting Helm version
+ 1.7.8. When used matches will be highlighted according to
+ GREP_COLORS env var.
+
+- ~helm-pdfgrep-default-read-command~ ::
+
+ #+vindex: helm-pdfgrep-default-read-command
+
+ *Standard Value*: nil
+
+ Default command to read pdf files from pdfgrep.
+ Where ’%f’ format spec is filename and ’%p’ is page number.
+ E.g. In Ubuntu you can set it to:
+
+ "evince --page-label=%p ’%f’"
+
+ If set to nil either ~doc-view-mode~ or ~pdf-view-mode~ will be
+ used instead of an external command.
+
+- ~helm-pdfgrep-default-recurse-command~ ::
+
+ #+vindex: helm-pdfgrep-default-recurse-command
+
+ *Standard Value*: pdfgrep --color always -rniH %s %s
+
+ Default recurse command for pdfgrep.
+ Option "--color always" is supported starting Helm version
+ 1.7.8. When used matches will be highlighted according to
+ GREP_COLORS env var.
+
+**** Command uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-grep-ag-command~ ::
+
+ #+vindex: helm-grep-ag-command
+
+ *Standard Value*: ag --line-numbers -S --color --nogroup %s %s %s
+
+ The default command for AG, PT or RG.
+
+ Takes three format specs, the first for type(s), the second for
+ pattern and the third for directory.
+
+ You can use safely "--color" (used by default) with AG RG and
+ PT.
+
+ NOTE: Usage of "--color=never" is discouraged as it uses Elisp
+ to colorize matched items which is slower than using the native
+ colorization of backend, however it is still supported.
+
+ For ripgrep here is the command line to use:
+
+ rg --color=always --smart-case --no-heading --line-number %s %s %s
+
+ And to customize colors (always for ripgrep) use something like this:
+
+ rg --color=always --colors ’match:bg:yellow’ --colors ’match:fg:black’
+ --smart-case --no-heading --line-number %s %s %s
+
+ This will change color for matched items from foreground red (the
+ default) to a yellow background with a black foreground. Note
+ that your color settings for RG will not work properly with
+ multiples pattern if you have configured colors in rg config file
+ instead of command line. For more enhanced settings of ansi
+ colors see https://github.com/emacs-helm/helm/issues/2313
+
+ You must use an output format that fit with helm grep, that is:
+
+ "filename:line-number:string"
+
+ The option "--nogroup" allow this.
+ The option "--line-numbers" is also mandatory except with
+ PT (not supported).
+ For RG the options "--no-heading" and "--line-number" are the
+ ones to use.
+
+ When modifying the default colors of matches with e.g.
+ "--color-match" option of AG or "--colors" option of ripgrep
+ you may want to modify as well ~helm-grep-ag-pipe-cmd-switches~
+ to have all matches colorized with the same color in multi
+ match.
+
+ Of course you can use several other options, see the man page of the
+ backend you are using.
+
+- ~helm-grep-git-grep-command~ ::
+
+ #+vindex: helm-grep-git-grep-command
+
+ *Standard Value*: git --no-pager grep -n%cH --color=always --full-name -e %p -- %f
+
+ The git grep default command line.
+ The option "--color=always" can be used safely.
+ The color of matched items can be customized in your .gitconfig
+ See ~helm-grep-default-command~ for more infos.
+
+ The "--exclude-standard" and "--no-index" switches allow
+ skipping unwanted files specified in ~/.gitignore_global and
+ searching files not already staged (not enabled by default).
+
+ You have also to enable this in global ".gitconfig" with
+ "git config --global core.excludesfile ~/.gitignore_global".
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-grep-actions~ ::
+
+ #+vindex: helm-grep-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Find File" . helm-grep-action)
+ ("Find file other frame" . helm-grep-other-frame)
+ ("Save results in grep buffer" . helm-grep-save-results)
+ ("Find file other window (C-u vertically)" . helm-grep-other-window))
+ #+end_src
+
+ Actions for helm grep.
+
+- ~helm-grep-input-idle-delay~ ::
+
+ #+vindex: helm-grep-input-idle-delay
+
+ *Standard Value*: 0.1
+
+ Idle time before updating, specified in seconds.
+ A lower value (default) means Helm will display the results
+ faster. Increasing it to a higher value (e.g. 0.6) prevents the
+ buffer from flickering when updating.
+
+- ~helm-grep-max-length-history~ ::
+
+ #+vindex: helm-grep-max-length-history
+
+ *Standard Value*: 100
+
+ Max number of elements to save in ~helm-grep-history~.
+
+- ~helm-grep-preferred-ext~ ::
+
+ #+vindex: helm-grep-preferred-ext
+
+ *Standard Value*: nil
+
+ This file extension will be preselected for grep.
+
+- ~helm-grep-save-buffer-name-no-confirm~ ::
+
+ #+vindex: helm-grep-save-buffer-name-no-confirm
+
+ *Standard Value*: nil
+
+ When *hgrep* already exists, auto append suffix.
+
+- ~helm-grep-truncate-lines~ ::
+
+ #+vindex: helm-grep-truncate-lines
+
+ *Standard Value*: t
+
+ When nil the grep line that appears will not be truncated.
+
+*** Hooks in library =helm-grep=
+
+**** Init
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-grep-after-init-hook~ ::
+
+ #+vindex: helm-grep-after-init-hook
+
+ *Standard Value*: nil
+
+ Hook that runs after initialization of the Helm buffer.
+
+- ~helm-grep-before-init-hook~ ::
+
+ #+vindex: helm-grep-before-init-hook
+
+ *Standard Value*: nil
+
+ Hook that runs before initialization of the Helm buffer.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-grep-mode-hook~ ::
+
+ #+vindex: helm-grep-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering helm-grep mode.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+** Library: helm-help
+
+*** Commands in library ~helm-help~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c h h)}}} (~helm-documentation~) ::
+
+ #+findex: helm-documentation
+
+ #+kindex: C-x c h h
+
+ Preconfigured ~helm~ for Helm documentation.
+ With a prefix arg refresh the documentation.
+
+ Find here the documentation of all documented sources.
+
+** Library: helm-id-utils
+
+*** Commands in library ~helm-id-utils~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c M-g i)}}} (~helm-gid~) ::
+
+ #+findex: helm-gid
+
+ #+kindex: C-x c M-g i
+
+ Preconfigured ~helm~ for ~gid~ command line of ~ID-Utils~.
+ Need A database created with the command ~mkid~ above
+ ~default-directory~.
+ Need id-utils as dependency which provide ~mkid~, ~gid~ etc..
+ See <https://www.gnu.org/software/idutils/>.
+
+*** Options in library =helm-id-utils=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-gid-db-file-name~ ::
+
+ #+vindex: helm-gid-db-file-name
+
+ *Standard Value*: ID
+
+ Name of a database file created by ~mkid~ command from ~ID-utils~.
+
+- ~helm-gid-program~ ::
+
+ #+vindex: helm-gid-program
+
+ *Standard Value*: gid
+
+ Name of gid command (usually ~gid~).
+ For Mac OS X users, if you install GNU coreutils, the name ~gid~
+ might be occupied by ~id~ from GNU coreutils, and you should set
+ it to correct name (or absolute path). For example, if using
+ MacPorts to install id-utils, it should be ~gid32~.
+
+** Library: helm-imenu
+
+*** Commands in keymap ~helm-imenu-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-<down>)}}} (~helm-imenu-next-section~) ::
+
+ #+findex: helm-imenu-next-section @r{(helm-imenu-map)}
+
+ #+kindex: M-<down> @r{(helm-imenu-map)}
+
+- {{{kbd(M-<up>)}}} (~helm-imenu-previous-section~) ::
+
+ #+findex: helm-imenu-previous-section @r{(helm-imenu-map)}
+
+ #+kindex: M-<up> @r{(helm-imenu-map)}
+
+*** Commands in library ~helm-imenu~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c i)}}} (~helm-imenu~) ::
+
+ #+findex: helm-imenu
+
+ #+kindex: C-x c i
+
+ Preconfigured ~helm~ for ~imenu~.
+
+- {{{kbd(C-x c I)}}} (~helm-imenu-in-all-buffers~) ::
+
+ #+findex: helm-imenu-in-all-buffers
+
+ #+kindex: C-x c I
+
+ Preconfigured ~helm~ for fetching imenu entries in all buffers with similar mode as current.
+ A mode is similar as current if it is the same, it is derived
+ i.e. ~derived-mode-p~ or it have an association in
+ ~helm-imenu-all-buffer-assoc~.
+
+*** Options in library =helm-imenu=
+
+**** All
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-imenu-all-buffer-assoc~ ::
+
+ #+vindex: helm-imenu-all-buffer-assoc
+
+ *Standard Value*: nil
+
+ Major mode association alist for ~helm-imenu-in-all-buffers~.
+ Allow ~helm-imenu-in-all-buffers~ searching in these associated
+ buffers even if they are not derived from each other. The alist
+ is bidirectional, i.e. no need to add ’((foo . bar) (bar . foo)),
+ only ’((foo . bar)) is needed.
+
+- ~helm-imenu-in-all-buffers-separate-sources~ ::
+
+ #+vindex: helm-imenu-in-all-buffers-separate-sources
+
+ *Standard Value*: t
+
+ Display imenu index of each buffer in its own source when non-nil.
+
+ When nil all candidates are displayed in a single source.
+
+ NOTE: Each source will have as name "Imenu <buffer-name>".
+ ~helm-source-imenu-all~ will not be set, however it will continue
+ to be used as a flag for using default as input. If you do not
+ want this behavior, remove it from
+ ~helm-sources-using-default-as-input~ even if not using a single
+ source to display imenu in all buffers.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-imenu-delimiter~ ::
+
+ #+vindex: helm-imenu-delimiter
+
+ *Standard Value*: /
+
+ Delimit types of candidates and their value in ~helm-buffer~.
+
+- ~helm-imenu-execute-action-at-once-if-one~ ::
+
+ #+vindex: helm-imenu-execute-action-at-once-if-one
+
+ *Standard Value*: helm-imenu--execute-action-at-once-p
+
+ Goto the candidate when only one is remaining.
+
+- ~helm-imenu-extra-modes~ ::
+
+ #+vindex: helm-imenu-extra-modes
+
+ *Standard Value*: nil
+
+ Extra modes where ~helm-imenu-in-all-buffers~ should look into.
+
+- ~helm-imenu-fuzzy-match~ ::
+
+ #+vindex: helm-imenu-fuzzy-match
+
+ *Standard Value*: nil
+
+ Enable fuzzy matching in ~helm-source-imenu~.
+
+- ~helm-imenu-lynx-style-map~ ::
+
+ #+vindex: helm-imenu-lynx-style-map
+
+ *Standard Value*: nil
+
+ Use Arrow keys to jump to occurences.
+
+- ~helm-imenu-type-faces~ ::
+
+ #+vindex: helm-imenu-type-faces
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("^Variables$" . font-lock-variable-name-face)
+ ("^\\(Function\\|Functions\\|Defuns\\)$" . font-lock-function-name-face)
+ ("^\\(Types\\|Provides\\|Requires\\|Classes\\|Class\\|Includes\\|Imports\\|Misc\\|Code\\)$" . font-lock-type-face))
+ #+end_src
+
+ Faces for showing type in helm-imenu.
+ This is a list of cons cells. The cdr of each cell is a face to
+ be used, and it can also just be like '(:foreground
+ "yellow"). Each car is a regexp match pattern of the imenu type
+ string.
+
+** Library: helm-info
+
+*** Modes in library ~helm-info~
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-info-nxml-mode~ ::
+
+ #+findex: helm-info-nxml-mode
+
+ Predefined helm for nxml-mode info.
+
+- ~helm-info-octave-mode~ ::
+
+ #+findex: helm-info-octave-mode
+
+ Predefined helm for octave-mode info.
+
+- ~helm-info-todo-mode~ ::
+
+ #+findex: helm-info-todo-mode
+
+ Predefined helm for todo-mode info.
+
+- ~helm-info-vhdl-mode~ ::
+
+ #+findex: helm-info-vhdl-mode
+
+ Predefined helm for vhdl-mode info.
+
+*** Commands in library ~helm-info~ (excludes keymaps)
+
+**** Cvs
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-info-cvs~ ::
+
+ #+findex: helm-info-cvs
+
+ Predefined helm for cvs info.
+
+- ~helm-info-pcl-cvs~ ::
+
+ #+findex: helm-info-pcl-cvs
+
+ Predefined helm for pcl-cvs info.
+
+**** Grub
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-info-grub~ ::
+
+ #+findex: helm-info-grub
+
+ Predefined helm for grub info.
+
+- ~helm-info-grub-dev~ ::
+
+ #+findex: helm-info-grub-dev
+
+ Predefined helm for grub-dev info.
+
+**** Find
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-info-find~ ::
+
+ #+findex: helm-info-find
+
+ Predefined helm for find info.
+
+- ~helm-info-find-maint~ ::
+
+ #+findex: helm-info-find-maint
+
+ Predefined helm for find-maint info.
+
+**** Manual
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-info-helm-manual~ ::
+
+ #+findex: helm-info-helm-manual
+
+ Predefined helm for helm-manual info.
+
+- ~helm-info-helm-manual-1~ ::
+
+ #+findex: helm-info-helm-manual-1
+
+ Predefined helm for helm-manual-1 info.
+
+**** Automake
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-info-automake-1~ ::
+
+ #+findex: helm-info-automake-1
+
+ Predefined helm for automake-1 info.
+
+- ~helm-info-automake-history~ ::
+
+ #+findex: helm-info-automake-history
+
+ Predefined helm for automake-history info.
+
+**** Lzip
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-info-lzip~ ::
+
+ #+findex: helm-info-lzip
+
+ Predefined helm for lzip info.
+
+- ~helm-info-lzip-compressor~ ::
+
+ #+findex: helm-info-lzip-compressor
+
+ Predefined helm for lzip-compressor info.
+
+- ~helm-info-lzip-decompressor~ ::
+
+ #+findex: helm-info-lzip-decompressor
+
+ Predefined helm for lzip-decompressor info.
+
+**** Emacs
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c h r)}}} (~helm-info-emacs~) ::
+
+ #+findex: helm-info-emacs
+
+ #+kindex: C-x c h r
+
+ Predefined helm for emacs info.
+
+- ~helm-info-emacs-gnutls~ ::
+
+ #+findex: helm-info-emacs-gnutls
+
+ Predefined helm for emacs-gnutls info.
+
+- ~helm-info-emacs-mime~ ::
+
+ #+findex: helm-info-emacs-mime
+
+ Predefined helm for emacs-mime info.
+
+**** R uncategorized uncategorized uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-info-R-FAQ~ ::
+
+ #+findex: helm-info-R-FAQ
+
+ Predefined helm for R-FAQ info.
+
+- ~helm-info-R-admin~ ::
+
+ #+findex: helm-info-R-admin
+
+ Predefined helm for R-admin info.
+
+- ~helm-info-R-data~ ::
+
+ #+findex: helm-info-R-data
+
+ Predefined helm for R-data info.
+
+- ~helm-info-R-exts~ ::
+
+ #+findex: helm-info-R-exts
+
+ Predefined helm for R-exts info.
+
+- ~helm-info-R-intro~ ::
+
+ #+findex: helm-info-R-intro
+
+ Predefined helm for R-intro info.
+
+- ~helm-info-R-ints~ ::
+
+ #+findex: helm-info-R-ints
+
+ Predefined helm for R-ints info.
+
+- ~helm-info-R-lang~ ::
+
+ #+findex: helm-info-R-lang
+
+ Predefined helm for R-lang info.
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-info-nxml-mode~ ::
+
+ #+findex: helm-info-nxml-mode
+
+ Predefined helm for nxml-mode info.
+
+- ~helm-info-octave-mode~ ::
+
+ #+findex: helm-info-octave-mode
+
+ Predefined helm for octave-mode info.
+
+- ~helm-info-todo-mode~ ::
+
+ #+findex: helm-info-todo-mode
+
+ Predefined helm for todo-mode info.
+
+- ~helm-info-vhdl-mode~ ::
+
+ #+findex: helm-info-vhdl-mode
+
+ Predefined helm for vhdl-mode info.
+
+**** uncategorized uncategorized uncategorized uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-info~ ::
+
+ #+findex: helm-info
+
+ (helm-info &optional REFRESH)
+
+ Preconfigured ~helm~ for searching Info files' indices.
+
+ With a prefix argument \[universal-argument], set REFRESH to
+ non-nil.
+
+ Optional parameter REFRESH, when non-nil, re-evaluates
+ ~helm-default-info-index-list~. If the variable has been
+ customized, set it to its saved value. If not, set it to its
+ standard value. See ~custom-reevaluate-setting~ for more.
+
+ REFRESH is useful when new Info files are installed. If
+ ~helm-default-info-index-list~ has not been customized, the new
+ Info files are made available.
+
+- {{{kbd(C-x c h i)}}} (~helm-info-at-point~) ::
+
+ #+findex: helm-info-at-point
+
+ #+kindex: C-x c h i
+
+ Preconfigured ~helm~ for searching info at point.
+
+- ~helm-info-auth~ ::
+
+ #+findex: helm-info-auth
+
+ Predefined helm for auth info.
+
+- ~helm-info-autosprintf~ ::
+
+ #+findex: helm-info-autosprintf
+
+ Predefined helm for autosprintf info.
+
+- ~helm-info-autotype~ ::
+
+ #+findex: helm-info-autotype
+
+ Predefined helm for autotype info.
+
+- ~helm-info-bc~ ::
+
+ #+findex: helm-info-bc
+
+ Predefined helm for bc info.
+
+- ~helm-info-bovine~ ::
+
+ #+findex: helm-info-bovine
+
+ Predefined helm for bovine info.
+
+- ~helm-info-bzip2~ ::
+
+ #+findex: helm-info-bzip2
+
+ Predefined helm for bzip2 info.
+
+- ~helm-info-calc~ ::
+
+ #+findex: helm-info-calc
+
+ Predefined helm for calc info.
+
+- ~helm-info-ccmode~ ::
+
+ #+findex: helm-info-ccmode
+
+ Predefined helm for ccmode info.
+
+- ~helm-info-cl~ ::
+
+ #+findex: helm-info-cl
+
+ Predefined helm for cl info.
+
+- ~helm-info-com_err~ ::
+
+ #+findex: helm-info-com_err
+
+ Predefined helm for com_err info.
+
+- ~helm-info-coreutils~ ::
+
+ #+findex: helm-info-coreutils
+
+ Predefined helm for coreutils info.
+
+- ~helm-info-cvsclient~ ::
+
+ #+findex: helm-info-cvsclient
+
+ Predefined helm for cvsclient info.
+
+- ~helm-info-dbus~ ::
+
+ #+findex: helm-info-dbus
+
+ Predefined helm for dbus info.
+
+- ~helm-info-dc~ ::
+
+ #+findex: helm-info-dc
+
+ Predefined helm for dc info.
+
+- ~helm-info-diffutils~ ::
+
+ #+findex: helm-info-diffutils
+
+ Predefined helm for diffutils info.
+
+- ~helm-info-dired-x~ ::
+
+ #+findex: helm-info-dired-x
+
+ Predefined helm for dired-x info.
+
+- ~helm-info-dvipng~ ::
+
+ #+findex: helm-info-dvipng
+
+ Predefined helm for dvipng info.
+
+- ~helm-info-dvips~ ::
+
+ #+findex: helm-info-dvips
+
+ Predefined helm for dvips info.
+
+- ~helm-info-ebrowse~ ::
+
+ #+findex: helm-info-ebrowse
+
+ Predefined helm for ebrowse info.
+
+- ~helm-info-ed~ ::
+
+ #+findex: helm-info-ed
+
+ Predefined helm for ed info.
+
+- ~helm-info-ede~ ::
+
+ #+findex: helm-info-ede
+
+ Predefined helm for ede info.
+
+- ~helm-info-ediff~ ::
+
+ #+findex: helm-info-ediff
+
+ Predefined helm for ediff info.
+
+- ~helm-info-edt~ ::
+
+ #+findex: helm-info-edt
+
+ Predefined helm for edt info.
+
+- ~helm-info-eieio~ ::
+
+ #+findex: helm-info-eieio
+
+ Predefined helm for eieio info.
+
+- ~helm-info-eintr~ ::
+
+ #+findex: helm-info-eintr
+
+ Predefined helm for eintr info.
+
+- ~helm-info-elisp~ ::
+
+ #+findex: helm-info-elisp
+
+ Predefined helm for elisp info.
+
+- ~helm-info-emms~ ::
+
+ #+findex: helm-info-emms
+
+ Predefined helm for emms info.
+
+- ~helm-info-epa~ ::
+
+ #+findex: helm-info-epa
+
+ Predefined helm for epa info.
+
+- ~helm-info-erc~ ::
+
+ #+findex: helm-info-erc
+
+ Predefined helm for erc info.
+
+- ~helm-info-ert~ ::
+
+ #+findex: helm-info-ert
+
+ Predefined helm for ert info.
+
+- ~helm-info-eshell~ ::
+
+ #+findex: helm-info-eshell
+
+ Predefined helm for eshell info.
+
+- ~helm-info-eudc~ ::
+
+ #+findex: helm-info-eudc
+
+ Predefined helm for eudc info.
+
+- ~helm-info-eww~ ::
+
+ #+findex: helm-info-eww
+
+ Predefined helm for eww info.
+
+- ~helm-info-fastjar~ ::
+
+ #+findex: helm-info-fastjar
+
+ Predefined helm for fastjar info.
+
+- ~helm-info-flex~ ::
+
+ #+findex: helm-info-flex
+
+ Predefined helm for flex info.
+
+- ~helm-info-flymake~ ::
+
+ #+findex: helm-info-flymake
+
+ Predefined helm for flymake info.
+
+- ~helm-info-fontname~ ::
+
+ #+findex: helm-info-fontname
+
+ Predefined helm for fontname info.
+
+- ~helm-info-forms~ ::
+
+ #+findex: helm-info-forms
+
+ Predefined helm for forms info.
+
+- ~helm-info-gettext~ ::
+
+ #+findex: helm-info-gettext
+
+ Predefined helm for gettext info.
+
+- ~helm-info-global~ ::
+
+ #+findex: helm-info-global
+
+ Predefined helm for global info.
+
+- ~helm-info-gnupg~ ::
+
+ #+findex: helm-info-gnupg
+
+ Predefined helm for gnupg info.
+
+- {{{kbd(C-x c h g)}}} (~helm-info-gnus~) ::
+
+ #+findex: helm-info-gnus
+
+ #+kindex: C-x c h g
+
+ Predefined helm for gnus info.
+
+- ~helm-info-gpm~ ::
+
+ #+findex: helm-info-gpm
+
+ Predefined helm for gpm info.
+
+- ~helm-info-grep~ ::
+
+ #+findex: helm-info-grep
+
+ Predefined helm for grep info.
+
+- ~helm-info-gzip~ ::
+
+ #+findex: helm-info-gzip
+
+ Predefined helm for gzip info.
+
+- ~helm-info-helm~ ::
+
+ #+findex: helm-info-helm
+
+ Predefined helm for helm info.
+
+- ~helm-info-helm-bugs~ ::
+
+ #+findex: helm-info-helm-bugs
+
+ Predefined helm for helm-bugs info.
+
+- ~helm-info-helm-devel~ ::
+
+ #+findex: helm-info-helm-devel
+
+ Predefined helm for helm-devel info.
+
+- ~helm-info-htmlfontify~ ::
+
+ #+findex: helm-info-htmlfontify
+
+ Predefined helm for htmlfontify info.
+
+- ~helm-info-idlwave~ ::
+
+ #+findex: helm-info-idlwave
+
+ Predefined helm for idlwave info.
+
+- ~helm-info-ido~ ::
+
+ #+findex: helm-info-ido
+
+ Predefined helm for ido info.
+
+- ~helm-info-idutils~ ::
+
+ #+findex: helm-info-idutils
+
+ Predefined helm for idutils info.
+
+- ~helm-info-info~ ::
+
+ #+findex: helm-info-info
+
+ Predefined helm for info info.
+
+- ~helm-info-info-stnd~ ::
+
+ #+findex: helm-info-info-stnd
+
+ Predefined helm for info-stnd info.
+
+- ~helm-info-kpathsea~ ::
+
+ #+findex: helm-info-kpathsea
+
+ Predefined helm for kpathsea info.
+
+- ~helm-info-latex2man~ ::
+
+ #+findex: helm-info-latex2man
+
+ Predefined helm for latex2man info.
+
+- ~helm-info-libffi~ ::
+
+ #+findex: helm-info-libffi
+
+ Predefined helm for libffi info.
+
+- ~helm-info-m4~ ::
+
+ #+findex: helm-info-m4
+
+ Predefined helm for m4 info.
+
+- ~helm-info-mairix-el~ ::
+
+ #+findex: helm-info-mairix-el
+
+ Predefined helm for mairix-el info.
+
+- ~helm-info-message~ ::
+
+ #+findex: helm-info-message
+
+ Predefined helm for message info.
+
+- ~helm-info-mh-e~ ::
+
+ #+findex: helm-info-mh-e
+
+ Predefined helm for mh-e info.
+
+- ~helm-info-nano~ ::
+
+ #+findex: helm-info-nano
+
+ Predefined helm for nano info.
+
+- ~helm-info-nettle~ ::
+
+ #+findex: helm-info-nettle
+
+ Predefined helm for nettle info.
+
+- ~helm-info-newsticker~ ::
+
+ #+findex: helm-info-newsticker
+
+ Predefined helm for newsticker info.
+
+- ~helm-info-org~ ::
+
+ #+findex: helm-info-org
+
+ Predefined helm for org info.
+
+- ~helm-info-pgg~ ::
+
+ #+findex: helm-info-pgg
+
+ Predefined helm for pgg info.
+
+- ~helm-info-rcirc~ ::
+
+ #+findex: helm-info-rcirc
+
+ Predefined helm for rcirc info.
+
+- ~helm-info-rcs~ ::
+
+ #+findex: helm-info-rcs
+
+ Predefined helm for rcs info.
+
+- ~helm-info-reftex~ ::
+
+ #+findex: helm-info-reftex
+
+ Predefined helm for reftex info.
+
+- ~helm-info-remember~ ::
+
+ #+findex: helm-info-remember
+
+ Predefined helm for remember info.
+
+- ~helm-info-rluserman~ ::
+
+ #+findex: helm-info-rluserman
+
+ Predefined helm for rluserman info.
+
+- ~helm-info-sasl~ ::
+
+ #+findex: helm-info-sasl
+
+ Predefined helm for sasl info.
+
+- ~helm-info-sc~ ::
+
+ #+findex: helm-info-sc
+
+ Predefined helm for sc info.
+
+- ~helm-info-sed~ ::
+
+ #+findex: helm-info-sed
+
+ Predefined helm for sed info.
+
+- ~helm-info-semantic~ ::
+
+ #+findex: helm-info-semantic
+
+ Predefined helm for semantic info.
+
+- ~helm-info-ses~ ::
+
+ #+findex: helm-info-ses
+
+ Predefined helm for ses info.
+
+- ~helm-info-sharutils~ ::
+
+ #+findex: helm-info-sharutils
+
+ Predefined helm for sharutils info.
+
+- ~helm-info-sieve~ ::
+
+ #+findex: helm-info-sieve
+
+ Predefined helm for sieve info.
+
+- ~helm-info-smtpmail~ ::
+
+ #+findex: helm-info-smtpmail
+
+ Predefined helm for smtpmail info.
+
+- ~helm-info-spd-say~ ::
+
+ #+findex: helm-info-spd-say
+
+ Predefined helm for spd-say info.
+
+- ~helm-info-speech-dispatcher~ ::
+
+ #+findex: helm-info-speech-dispatcher
+
+ Predefined helm for speech-dispatcher info.
+
+- ~helm-info-speedbar~ ::
+
+ #+findex: helm-info-speedbar
+
+ Predefined helm for speedbar info.
+
+- ~helm-info-srecode~ ::
+
+ #+findex: helm-info-srecode
+
+ Predefined helm for srecode info.
+
+- ~helm-info-ssip~ ::
+
+ #+findex: helm-info-ssip
+
+ Predefined helm for ssip info.
+
+- ~helm-info-tds~ ::
+
+ #+findex: helm-info-tds
+
+ Predefined helm for tds info.
+
+- ~helm-info-texi2html~ ::
+
+ #+findex: helm-info-texi2html
+
+ Predefined helm for texi2html info.
+
+- ~helm-info-texinfo~ ::
+
+ #+findex: helm-info-texinfo
+
+ Predefined helm for texinfo info.
+
+- ~helm-info-time~ ::
+
+ #+findex: helm-info-time
+
+ Predefined helm for time info.
+
+- ~helm-info-tlbuild~ ::
+
+ #+findex: helm-info-tlbuild
+
+ Predefined helm for tlbuild info.
+
+- ~helm-info-tramp~ ::
+
+ #+findex: helm-info-tramp
+
+ Predefined helm for tramp info.
+
+- ~helm-info-url~ ::
+
+ #+findex: helm-info-url
+
+ Predefined helm for url info.
+
+- ~helm-info-vip~ ::
+
+ #+findex: helm-info-vip
+
+ Predefined helm for vip info.
+
+- ~helm-info-viper~ ::
+
+ #+findex: helm-info-viper
+
+ Predefined helm for viper info.
+
+- ~helm-info-wdiff~ ::
+
+ #+findex: helm-info-wdiff
+
+ Predefined helm for wdiff info.
+
+- ~helm-info-web2c~ ::
+
+ #+findex: helm-info-web2c
+
+ Predefined helm for web2c info.
+
+- ~helm-info-wget~ ::
+
+ #+findex: helm-info-wget
+
+ Predefined helm for wget info.
+
+- ~helm-info-widget~ ::
+
+ #+findex: helm-info-widget
+
+ Predefined helm for widget info.
+
+- ~helm-info-wisent~ ::
+
+ #+findex: helm-info-wisent
+
+ Predefined helm for wisent info.
+
+- ~helm-info-woman~ ::
+
+ #+findex: helm-info-woman
+
+ Predefined helm for woman info.
+
+- ~helm-info-xboard~ ::
+
+ #+findex: helm-info-xboard
+
+ Predefined helm for xboard info.
+
+*** Options in library =helm-info=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-default-info-index-list~ ::
+
+ #+vindex: helm-default-info-index-list
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("helm-bugs" "helm-devel" "helm-manual-1" "helm-manual" "helm" "emms" "R-FAQ" "R-admin" "R-data" "R-exts" "R-intro" "R-ints" "R-lang" "auth" "automake-1" "automake-history" "autosprintf" "autotype" "bc" "bovine" "bzip2" "calc" "ccmode" "cl" "com_err" "coreutils" "cvs" "cvsclient" "dbus" "dc" "diffutils" "dired-x" "dvipng" "dvips" "ebrowse" "ed" "ede" "ediff" "edt" "eieio" "eintr" "elisp" "emacs-gnutls" "emacs-mime" "emacs" "epa" "erc" "ert" "eshell" "eudc" "eww" "fastjar" "find-maint" "find" "flex" "flymake" "fontname" "forms" "gettext" "global" "gnupg" "gnus" "gpm" "grep" "grub-dev" "grub" "gzip" "htmlfontify" "idlwave" "ido" "idutils" "info-stnd" "info" "kpathsea" "latex2man" "libffi" "lzip-compressor" "lzip-decompressor" "lzip" "m4" "mairix-el" "message" "mh-e" "nano" "nettle" "newsticker" "nxml-mode" "octave-mode" "org" "pcl-cvs" "pgg" "rcirc" "rcs" "reftex" "remember" "rluserman" "sasl" "sc" "sed" "semantic" "ses" "sharutils" "sieve" "smtpmail" "spd-say" "speech-dispatcher" "speedbar" "srecode" "ssip" "tds" "texi2html" "texinfo" "time" "tlbuild" "todo-mode" "tramp" "url" "vhdl-mode" "vip" "viper" "wdiff" "web2c" "wget" "widget" "wisent" "woman" "xboard")
+ #+end_src
+
+ Info files to search in with ~helm-info~.
+
+- ~helm-info-default-sources~ ::
+
+ #+vindex: helm-info-default-sources
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-source-info-elisp helm-source-info-cl helm-source-info-eieio helm-source-info-pages)
+ #+end_src
+
+ Default sources to use for looking up symbols at point in Info
+ files with ~helm-info-at-point~.
+
+** Library: helm-lib
+
+*** Commands in library ~helm-lib~ (excludes keymaps)
+
+**** Point
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-undo-yank-text-at-point~ ::
+
+ #+findex: helm-undo-yank-text-at-point
+
+ Undo last entry added by ~helm-yank-text-at-point~.
+
+- ~helm-yank-text-at-point~ ::
+
+ #+findex: helm-yank-text-at-point
+
+ (helm-yank-text-at-point ARG)
+
+ Yank text at point in ~helm-current-buffer~ into minibuffer.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm--advice-wdired-finish-edit~ ::
+
+ #+findex: helm--advice-wdired-finish-edit
+
+*** Options in library =helm-lib=
+
+**** File
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-boring-file-regexp-list~ ::
+
+ #+vindex: helm-boring-file-regexp-list
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("\\.o$" "~$" "\\.bin$" "\\.lbin$" "\\.so$" "\\.a$" "\\.ln$" "\\.blg$" "\\.bbl$" "\\.elc$" "\\.lof$" "\\.glo$" "\\.idx$" "\\.lot$" "\\.svn\\(/\\|$\\)" "\\.hg\\(/\\|$\\)" "\\.git\\(/\\|$\\)" "\\.bzr\\(/\\|$\\)" "CVS\\(/\\|$\\)" "_darcs\\(/\\|$\\)" "_MTN\\(/\\|$\\)" "\\.fmt$" "\\.tfm$" "\\.class$" "\\.fas$" "\\.lib$" "\\.mem$" "\\.x86f$" "\\.sparcf$" "\\.dfsl$" "\\.pfsl$" "\\.d64fsl$" "\\.p64fsl$" "\\.lx64fsl$" "\\.lx32fsl$" "\\.dx64fsl$" "\\.dx32fsl$" "\\.fx64fsl$" "\\.fx32fsl$" "\\.sx64fsl$" "\\.sx32fsl$" "\\.wx64fsl$" "\\.wx32fsl$" "\\.fasl$" "\\.ufsl$" "\\.fsl$" "\\.dxl$" "\\.lo$" "\\.la$" "\\.gmo$" "\\.mo$" "\\.toc$" "\\.aux$" "\\.cp$" "\\.fn$" "\\.ky$" "\\.pg$" "\\.tp$" "\\.vr$" "\\.cps$" "\\.fns$" "\\.kys$" "\\.pgs$" "\\.tps$" "\\.vrs$" "\\.pyc$" "\\.pyo$")
+ #+end_src
+
+ A list of regexps matching boring files.
+
+ This list is build by default on ~completion-ignored-extensions~.
+ The directory names should end with "/?" e.g. "\.git/?" and
+ the file names should end with "$" e.g. "\.o$".
+
+ These regexps may be used to match the entire path, not just the
+ file name, so for example to ignore files with a prefix
+ ".bak.", use "\.bak\..*$" as the regexp.
+
+ NOTE: When modifying this, be sure to use customize interface or
+ the customize functions e.g. ~customize-set-variable~ and NOT
+ ~setq~.
+
+- ~helm-file-globstar~ ::
+
+ #+vindex: helm-file-globstar
+
+ *Standard Value*: t
+
+ Same as globstar bash shopt option.
+ When non-nil a pattern beginning with two stars will expand
+ recursively.
+ Directories expansion is not supported yet.
+
+**** Help
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-help-default-prompt~ ::
+
+ #+vindex: helm-help-default-prompt
+
+ *Standard Value*: [SPC,C-v,next:ScrollUp b,M-v,prior:ScrollDown TAB:Cycle M-TAB:All C-s/r:Isearch q:Quit]
+
+ The prompt used in ~helm-help~.
+
+- ~helm-help-full-frame~ ::
+
+ #+vindex: helm-help-full-frame
+
+ *Standard Value*: t
+
+ Display help window in full frame when non nil.
+
+ Even when nil probably the same result (full frame) can be
+ reached by tweaking ~display-buffer-alist~, but it is much more
+ convenient to use a simple boolean value here.
+
+- ~helm-help-hkmap~ ::
+
+ #+vindex: helm-help-hkmap
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("C-v" . helm-help-scroll-up)
+ ("SPC" . helm-help-scroll-up)
+ ("<next>" . helm-help-scroll-up)
+ ("M-v" . helm-help-scroll-down)
+ ("b" . helm-help-scroll-down)
+ ("<prior>" . helm-help-scroll-down)
+ ("C-s" . isearch-forward)
+ ("C-r" . isearch-backward)
+ ("C-a" . move-beginning-of-line)
+ ("C-e" . move-end-of-line)
+ ("C-f" . forward-char)
+ ("<right>" . forward-char)
+ ("C-b" . backward-char)
+ ("<left>" . backward-char)
+ ("C-n" . helm-help-next-line)
+ ("C-p" . helm-help-previous-line)
+ ("<down>" . helm-help-next-line)
+ ("<up>" . helm-help-previous-line)
+ ("M-a" . backward-sentence)
+ ("M-e" . forward-sentence)
+ ("M-f" . forward-word)
+ ("M-b" . backward-word)
+ ("M->" . end-of-buffer)
+ ("M-<" . beginning-of-buffer)
+ ("C-SPC" . helm-help-toggle-mark)
+ ("C-M-SPC" . mark-sexp)
+ ("TAB" . org-cycle)
+ ("C-m" . helm-help-org-open-at-point)
+ ("C-&" . helm-help-org-mark-ring-goto)
+ ("C-%" . org-mark-ring-push)
+ ("M-TAB" . helm-help-org-cycle)
+ ("M-w" . helm-help-copy-region-as-kill)
+ ("q" . helm-help-quit))
+ #+end_src
+
+ Alist of (KEY . FUNCTION) for ~helm-help~.
+
+ This is not a standard keymap, just an alist where it is possible to
+ define a simple KEY (a string with no spaces) associated with a
+ FUNCTION. More complex key like "C-x C-x" are not supported.
+ Interactive functions will be called interactively whereas other
+ functions will be called with funcall except commands that are in
+ ~helm-help-not-interactive-command~.
+ For convenience you can add bindings here with ~helm-help-define-key~.
+
+**** Function
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-describe-function-function~ ::
+
+ #+vindex: helm-describe-function-function
+
+ *Standard Value*: describe-function
+
+ Function used to describe functions in Helm.
+
+- ~helm-describe-variable-function~ ::
+
+ #+vindex: helm-describe-variable-function
+
+ *Standard Value*: describe-variable
+
+ Function used to describe variables in Helm.
+
+- ~helm-yank-text-at-point-function~ ::
+
+ #+vindex: helm-yank-text-at-point-function
+
+ *Standard Value*: nil
+
+ The function used to forward point with ~helm-yank-text-at-point~.
+ With a nil value, fallback to default ~forward-word~.
+ The function should take one arg, an integer like ~forward-word~.
+ NOTE: Using ~forward-symbol~ here is not very useful as it is
+ already provided by M-n.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-advice-push-mark~ ::
+
+ #+vindex: helm-advice-push-mark
+
+ *Standard Value*: t
+
+ Override ~push-mark~ with a version avoiding duplicates when non-nil.
+
+- ~helm-scroll-amount~ ::
+
+ #+vindex: helm-scroll-amount
+
+ *Standard Value*: nil
+
+ Scroll amount when scrolling other window in a helm session.
+ It is used by ~helm-scroll-other-window~
+ and ~helm-scroll-other-window-down~.
+
+ If you prefer scrolling line by line, set this value to 1.
+
+*** Hooks in library =helm-lib=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-help-mode-after-hook~ ::
+
+ #+vindex: helm-help-mode-after-hook
+
+ *Standard Value*: nil
+
+ A hook that runs when helm-help exits.
+
+- ~helm-help-mode-before-hook~ ::
+
+ #+vindex: helm-help-mode-before-hook
+
+ *Standard Value*: nil
+
+ A hook that runs before helm-help starts.
+
+** Library: helm-locate
+
+*** Commands in keymap ~helm-locate-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(DEL)}}} (~helm-delete-backward-no-update~) ::
+
+ #+findex: helm-delete-backward-no-update @r{(helm-locate-map)}
+
+ #+kindex: DEL @r{(helm-locate-map)}
+
+ (helm-delete-backward-no-update ARG)
+
+ Disable update and delete ARG chars backward.
+ Update is reenabled when idle 1s.
+
+*** Commands in library ~helm-locate~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c l)}}} (~helm-locate~) ::
+
+ #+findex: helm-locate
+
+ #+kindex: C-x c l
+
+ (helm-locate ARG)
+
+ Preconfigured ~helm~ for Locate.
+ Note: you can add locate options after entering pattern.
+ See 'man locate' for valid options and also ~helm-locate-command~.
+
+ You can specify a local database with prefix argument ARG.
+ With two prefix arg, refresh the current local db or create it if
+ it doesn't exists.
+
+ To create a user specific db, use
+ "updatedb -l 0 -o db_path -U directory".
+ Where db_path is a filename matched by
+ ~helm-locate-db-file-regexp~.
+
+- ~helm-projects-find-files~ ::
+
+ #+findex: helm-projects-find-files
+
+ (helm-projects-find-files UPDATE)
+
+ Find files with locate in ~helm-locate-project-list~.
+ With a prefix arg refresh the database in each project.
+
+*** Options in library =helm-locate=
+
+**** Fuzzy
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-locate-fuzzy-match~ ::
+
+ #+vindex: helm-locate-fuzzy-match
+
+ *Standard Value*: nil
+
+ Enable fuzzy matching in ~helm-locate~.
+ Note that when this is enabled searching is done on basename.
+
+- ~helm-locate-fuzzy-sort-fn~ ::
+
+ #+vindex: helm-locate-fuzzy-sort-fn
+
+ *Standard Value*: helm-locate-default-fuzzy-sort-fn
+
+ Default fuzzy matching sort function for locate.
+
+**** Db
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ff-locate-db-filename~ ::
+
+ #+vindex: helm-ff-locate-db-filename
+
+ *Standard Value*: locate.db
+
+ The basename of the locatedb file you use locally in your directories.
+ When this is set and Helm finds such a file in the directory from
+ where you launch locate, it will use this file and will not
+ prompt you for a db file.
+ Note that this happen only when locate is launched with a prefix
+ arg.
+
+- ~helm-locate-db-file-regexp~ ::
+
+ #+vindex: helm-locate-db-file-regexp
+
+ *Standard Value*: m?locate.db$
+
+ Default regexp to match locate database.
+ If nil Search in all files.
+
+**** Command
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-locate-command~ ::
+
+ #+vindex: helm-locate-command
+
+ *Standard Value*: nil
+
+ A list of arguments for locate program.
+
+ Helm will calculate a default value for your system on startup
+ unless ~helm-locate-command~ is non-nil.
+
+ Here are the default values it will use according to your system:
+
+ Gnu/linux: "locate %s -e -A --regex %s"
+ berkeley-unix: "locate %s %s"
+ windows-nt: "es %s %s"
+ Others: "locate %s %s"
+
+ This string will be passed to format so it should end with ~%s~.
+ The first format spec is used for the "-i" value of locate/es,
+ so don’t set it directly but use ~helm-locate-case-fold-search~
+ for this.
+
+ The last option must be the one preceding pattern i.e "-r" or
+ "--regex".
+
+ You will be able to pass other options such as "-b" or "l"
+ during Helm invocation after entering pattern only when multi
+ matching, not when fuzzy matching.
+
+ Note that the "-b" option is added automatically by Helm when
+ var ~helm-locate-fuzzy-match~ is non-nil and switching back from
+ multimatch to fuzzy matching (this is done automatically when a
+ space is detected in pattern).
+
+- ~helm-locate-create-db-command~ ::
+
+ #+vindex: helm-locate-create-db-command
+
+ *Standard Value*: updatedb -l 0 -o '%s' -U '%s'
+
+ Command used to create a locale locate db file.
+
+- ~helm-locate-recursive-dirs-command~ ::
+
+ #+vindex: helm-locate-recursive-dirs-command
+
+ *Standard Value*: locate -i -e -A --regex '^%s' '%s.*$'
+
+ Command used for recursive directories completion in ~helm-find-files~.
+
+ For Windows and ~es~ use something like "es -r ^%s.*%s.*$"
+
+ The two format specs are mandatory.
+
+ If for some reasons you can’t use locate because your filesystem
+ doesn’t have a database, you can use find command from findutils
+ but be aware that it will be much slower. See ~helm-find-files~
+ embedded help for more infos.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-locate-case-fold-search~ ::
+
+ #+vindex: helm-locate-case-fold-search
+
+ *Standard Value*: smart
+
+ It have the same meaning as ~helm-case-fold-search~.
+ The -i option of locate will be used depending of value of
+ ~helm-pattern~ when this is set to ’smart.
+ When nil "-i" will not be used at all and when non-nil it will
+ always be used.
+ NOTE: the -i option of the "es" command used on windows does
+ the opposite of "locate" command.
+
+- ~helm-locate-project-list~ ::
+
+ #+vindex: helm-locate-project-list
+
+ *Standard Value*: nil
+
+ A list of directories, your projects.
+ When set, allow browsing recursively files in all directories of
+ this list with ~helm-projects-find-files~.
+
+** Library: helm-man
+
+*** Commands in library ~helm-man~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c m)}}} (~helm-man-woman~) ::
+
+ #+findex: helm-man-woman
+
+ #+kindex: C-x c m
+
+ (helm-man-woman ARG)
+
+ Preconfigured ~helm~ for Man and Woman pages.
+ With a prefix arg reinitialize the cache.
+
+*** Options in library =helm-man=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-man-format-switches~ ::
+
+ #+vindex: helm-man-format-switches
+
+ *Standard Value*: -l %s
+
+ Arguments to pass to the ~manual-entry~ function.
+ Arguments are passed to ~manual-entry~ with ~format.~
+
+- ~helm-man-or-woman-function~ ::
+
+ #+vindex: helm-man-or-woman-function
+
+ *Standard Value*: Man-getpage-in-background
+
+ Default command to display a man page.
+
+** Library: helm-misc
+
+*** Commands in library ~helm-misc~ (excludes keymaps)
+
+**** Commands
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-ratpoison-commands~ ::
+
+ #+findex: helm-ratpoison-commands
+
+ Preconfigured ~helm~ to execute ratpoison commands.
+
+- ~helm-stumpwm-commands~ ::
+
+ #+findex: helm-stumpwm-commands
+
+ Preconfigured helm for stumpwm commands.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-insert-latex-math~ ::
+
+ #+findex: helm-insert-latex-math
+
+ Preconfigured helm for latex math symbols completion.
+
+- ~helm-world-time~ ::
+
+ #+findex: helm-world-time
+
+ Preconfigured ~helm~ to show world time.
+ Default action change TZ environment variable locally to emacs.
+
+*** Options in library =helm-misc=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-minibuffer-history-must-match~ ::
+
+ #+vindex: helm-minibuffer-history-must-match
+
+ *Standard Value*: t
+
+ Allow inserting non matching elements when nil or ’confirm.
+
+- ~helm-time-zone-home-location~ ::
+
+ #+vindex: helm-time-zone-home-location
+
+ *Standard Value*: Paris
+
+ The time zone of your home.
+
+- ~helm-timezone-actions~ ::
+
+ #+vindex: helm-timezone-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Set timezone env (TZ)" lambda
+ (candidate)
+ (setenv "TZ" candidate)))
+ #+end_src
+
+ Actions for helm-timezone.
+
+** Library: helm-mode
+
+*** Modes in library ~helm-mode~
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-mode~ ::
+
+ #+findex: helm-mode
+
+ (helm-mode &optional ARG)
+
+ Toggle generic helm completion.
+
+ If called interactively, toggle ~Helm mode~. If the prefix
+ argument is positive, enable the mode, and if it is zero or
+ negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+ All functions in Emacs that use ~completing-read~,
+ ~read-file-name~, ~completion-in-region~ and friends will use helm
+ interface when this mode is turned on.
+
+ However you can modify this behavior for functions of your choice
+ with ~helm-completing-read-handlers-alist~.
+
+ Called with a positive arg, turn on unconditionally, with a
+ negative arg turn off.
+ You can toggle it with M-x ~helm-mode~.
+
+ About ~ido-mode~:
+ DO NOT enable ~ido-everywhere~ when using ~helm-mode~. Instead of
+ using ~ido-mode~, add the commands where you want to use ido to
+ ~helm-completing-read-handlers-alist~ with ~ido~ as value.
+
+ Note: This mode is incompatible with Emacs23.
+
+*** Commands in keymap ~helm-comp-read-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-<return>)}}} ::
+- {{{kbd(M-RET)}}} (~helm-cr-empty-string~) ::
+
+ #+findex: helm-cr-empty-string @r{(helm-comp-read-map)}
+
+ #+kindex: C-<return> @r{(helm-comp-read-map)}
+ #+kindex: M-RET @r{(helm-comp-read-map)}
+
+ Return empty string.
+
+- {{{kbd(DEL)}}} (~helm-mode-delete-char-backward-maybe~) ::
+
+ #+findex: helm-mode-delete-char-backward-maybe @r{(helm-comp-read-map)}
+
+ #+kindex: DEL @r{(helm-comp-read-map)}
+
+ Delete char backward when text is not the prefix helm is completing against.
+ First call warns user about deleting prefix completion.
+ Second call deletes backward char in current-buffer and quits helm completion,
+ letting the user start a new completion with a new prefix.
+
+*** Commands in library ~helm-mode~ (excludes keymaps)
+
+**** Backward
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-mode-delete-char-backward-1~ ::
+
+ #+findex: helm-mode-delete-char-backward-1
+
+- ~helm-mode-delete-char-backward-2~ ::
+
+ #+findex: helm-mode-delete-char-backward-2
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-mode~ ::
+
+ #+findex: helm-mode
+
+ (helm-mode &optional ARG)
+
+ Toggle generic helm completion.
+
+ If called interactively, toggle ~Helm mode~. If the prefix
+ argument is positive, enable the mode, and if it is zero or
+ negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+ All functions in Emacs that use ~completing-read~,
+ ~read-file-name~, ~completion-in-region~ and friends will use helm
+ interface when this mode is turned on.
+
+ However you can modify this behavior for functions of your choice
+ with ~helm-completing-read-handlers-alist~.
+
+ Called with a positive arg, turn on unconditionally, with a
+ negative arg turn off.
+ You can toggle it with M-x ~helm-mode~.
+
+ About ~ido-mode~:
+ DO NOT enable ~ido-everywhere~ when using ~helm-mode~. Instead of
+ using ~ido-mode~, add the commands where you want to use ido to
+ ~helm-completing-read-handlers-alist~ with ~ido~ as value.
+
+ Note: This mode is incompatible with Emacs23.
+
+*** Options in library =helm-mode=
+
+**** Read
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-comp-read-case-fold-search~ ::
+
+ #+vindex: helm-comp-read-case-fold-search
+
+ *Standard Value*: smart
+
+ Default Local setting of ~helm-case-fold-search~ for ~helm-comp-read~.
+ See ~helm-case-fold-search~ for more info.
+
+**** Alist
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-completing-read-handlers-alist~ ::
+
+ #+vindex: helm-completing-read-handlers-alist
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ((find-tag . helm-completing-read-default-find-tag)
+ (xref-find-definitions . helm-completing-read-default-find-tag)
+ (xref-find-references . helm-completing-read-default-find-tag)
+ (ggtags-find-tag-dwim . helm-completing-read-default-find-tag)
+ (tmm-menubar)
+ (find-file)
+ (execute-extended-command)
+ (dired-do-rename . helm-read-file-name-handler-1)
+ (dired-do-copy . helm-read-file-name-handler-1)
+ (dired-do-symlink . helm-read-file-name-handler-1)
+ (dired-do-relsymlink . helm-read-file-name-handler-1)
+ (dired-do-hardlink . helm-read-file-name-handler-1)
+ (basic-save-buffer . helm-read-file-name-handler-1)
+ (write-file . helm-read-file-name-handler-1)
+ (write-region . helm-read-file-name-handler-1))
+ #+end_src
+
+ Completing read functions for specific Emacs commands.
+
+ By default ~helm-mode~ use ~helm-completing-read-default-handler~ to
+ provide helm completion in each ~completing-read~ or ~read-file-name~
+ found, but other functions can be specified here for specific
+ commands. This also allows disabling helm completion for some commands
+ when needed.
+
+ Each entry is a cons cell like (EMACS_COMMAND . COMPLETING-READ_HANDLER)
+ where key and value are symbols.
+
+ Each key is an Emacs command that use originaly ~completing-read~.
+
+ Each value maybe a helm function that takes same arguments as
+ ~completing-read~ plus NAME and BUFFER, where NAME is the name of the new
+ helm source and BUFFER the name of the buffer we will use, but it can
+ be also a function not using helm, in this case the function should
+ take the same args as ~completing-read~ and not be prefixed by "helm-".
+
+ ~helm~ will use the name of the command calling ~completing-read~ as
+ NAME and BUFFER will be computed as well with NAME but prefixed with
+ "*helm-mode-".
+
+ This function prefix name must start by "helm-" when it uses helm,
+ otherwise ~helm~ assumes the function is not a helm function and
+ expects the same args as ~completing-read~, this allows you to define a
+ handler not using helm completion.
+
+ Example:
+
+ (defun foo/test ()
+ (interactive)
+ (message "%S" (completing-read "test: " ’(a b c d e))))
+
+ (defun helm-foo/test-completing-read-handler (prompt collection
+ predicate require-match
+ initial-input hist def
+ inherit-input-method
+ name buffer)
+ (helm-comp-read prompt collection :marked-candidates t
+ :name name
+ :buffer buffer))
+
+ (add-to-list ’helm-completing-read-handlers-alist
+ ’(foo/test . helm-foo/test-completing-read-handler))
+
+ We want here to make the regular ~completing-read~ in ~foo/test~
+ return a list of candidate(s) instead of a single candidate.
+
+ Note that this function will be reused for ALL the ~completing-read~
+ of this command, so it should handle all cases. E.g.,
+ if first ~completing-read~ completes against symbols and
+ second ~completing-read~ should handle only buffer,
+ your specialized function should handle both.
+
+ If the value of an entry is nil completion will fall back to
+ Emacs vanilla behaviour.
+ Example:
+
+ If you want to disable helm completion for ~describe-function~, use:
+
+ (describe-function . nil)
+
+ Ido is also supported, you can use ~ido-completing-read~ and
+ ~ido-read-file-name~ as value of an entry or just ’ido.
+ Example:
+ Enable ido completion for ~find-file~:
+
+ (find-file . ido)
+
+ same as
+
+ (find-file . ido-read-file-name)
+
+ Note that you don’t need to enable ~ido-mode~ for this to work, see
+ ~helm-mode~ documentation.
+
+**** Mode
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-mode-fuzzy-match~ ::
+
+ #+vindex: helm-mode-fuzzy-match
+
+ *Standard Value*: nil
+
+ Enable fuzzy matching in ~helm-mode~ globally.
+
+ This is deprecated, use instead helm-fuzzy as ~helm-completion-style~ or
+ even better ’emacs as ~helm-completion-style~ and add ’flex to
+ ~completion-styles~ (emacs-27) or ’helm-flex if ’flex is not available
+ in ~completion-styles-alist~ (emacs-26).
+
+- ~helm-mode-hook~ ::
+
+ #+vindex: helm-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm-mode-reverse-history~ ::
+
+ #+vindex: helm-mode-reverse-history
+
+ *Standard Value*: t
+
+ Display history source after current source when non nil.
+
+ Apply only in ~helm-mode~ handled commands.
+
+**** Completion
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-completion-in-region-default-sort-fn~ ::
+
+ #+vindex: helm-completion-in-region-default-sort-fn
+
+ *Standard Value*: helm-completion-in-region-sort-fn
+
+ The default sort function to sort candidates in completion-in-region.
+
+ When nil no sorting is done.
+ The function is a ~filtered-candidate-transformer~ function which takes
+ two args CANDIDATES and SOURCE.
+ The function must use the flag ~helm-completion--sorting-done~ and
+ return CANDIDATES unchanged when the flag is nil.
+ See default function ~helm-completion-in-region-sort-fn~ as example.
+ It will be used only when ~helm-completion-style~ is either Emacs or
+ helm, otherwise when helm-fuzzy style is used, the fuzzy sort function
+ will be used.
+
+- ~helm-completion-mark-suffix~ ::
+
+ #+vindex: helm-completion-mark-suffix
+
+ *Standard Value*: t
+
+ Push mark at end of suffix when non nil.
+
+- ~helm-completion-style~ ::
+
+ #+vindex: helm-completion-style
+
+ *Standard Value*: helm
+
+ Style of completion to use in ~completion-in-region~.
+
+ This affects only ~completion-at-point~ and friends, and
+ the ~completing-read~ using the default handler
+ i.e. ~helm-completing-read-default-handler~.
+
+ NB: This has nothing to do with ~completion-styles~, it is independent from
+ helm, but when using ’emacs as helm-completion-style helm
+ will use the ~completion-styles~ for its completions.
+ Up to the user to configure ~completion-styles~.
+
+ There are three possible values to use:
+
+ - helm, use multi match regular helm completion.
+
+ - helm-fuzzy, use fuzzy matching. Note that as usual when
+ entering a space helm switch to multi matching mode.
+
+ - emacs, use regular Emacs completion according to
+ ~completion-styles~. Note that even in this style, helm allows using
+ multi match. Emacs-27 provides a style called ~flex~ that can be used
+ aside ~helm~ style (see ~completion-styles-alist~). When ~flex~ style
+ is not available (Emacs<27) helm provides ~helm-flex~ style which is similar to
+ ~flex~ and helm fuzzy matching.
+
+ For a better experience, if you don’t know what to use, set
+ ~completion-styles~ to ’(flex) if you are using emacs-27 or to
+ ’(helm-flex) if you are using emacs-26 and keep ’emacs as default
+ value for ~helm-completion-style~. Advanced users can also have a
+ look to ~completion-category-overrides~ to set styles according to category.
+
+ Please use custom interface or ~customize-set-variable~ to set this,
+ NOT ~setq~.
+
+- ~helm-completion-styles-alist~ ::
+
+ #+vindex: helm-completion-styles-alist
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ((gud-mode . helm))
+ #+end_src
+
+ Allow configuring ~helm-completion-style~ per mode.
+
+ Each entry is a cons cell like (mode . style) where style must be a
+ suitable value for ~helm-completion-style~.
+ When specifying emacs as style for a mode, ~completion-styles~ can be
+ specified by using a cons cell specifying completion-styles to use
+ with helm emacs style, e.g. (foo-mode . (emacs helm flex)) will set
+ ~completion-styles~ to ’(helm flex) for foo-mode. This affects only
+ completions happening in buffers and not minibuffer completions,
+ i.e. completing-read’s.
+
+- ~helm-mode-handle-completion-in-region~ ::
+
+ #+vindex: helm-mode-handle-completion-in-region
+
+ *Standard Value*: t
+
+ Whether to replace or not ~completion-in-region-function~.
+ This enables support for ~completing-read-multiple~ and ~completion-at-point~
+ when non--nil.
+
+- ~helm-mode-no-completion-in-region-in-modes~ ::
+
+ #+vindex: helm-mode-no-completion-in-region-in-modes
+
+ *Standard Value*: nil
+
+ A list of modes that do not want helm for ~completion-in-region~.
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-mode~ ::
+
+ #+vindex: helm-mode
+
+ *Standard Value*: t
+
+ (helm-mode &optional ARG)
+
+ Toggle generic helm completion.
+
+ If called interactively, toggle ~Helm mode~. If the prefix
+ argument is positive, enable the mode, and if it is zero or
+ negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+ All functions in Emacs that use ~completing-read~,
+ ~read-file-name~, ~completion-in-region~ and friends will use helm
+ interface when this mode is turned on.
+
+ However you can modify this behavior for functions of your choice
+ with ~helm-completing-read-handlers-alist~.
+
+ Called with a positive arg, turn on unconditionally, with a
+ negative arg turn off.
+ You can toggle it with M-x ~helm-mode~.
+
+ About ~ido-mode~:
+ DO NOT enable ~ido-everywhere~ when using ~helm-mode~. Instead of
+ using ~ido-mode~, add the commands where you want to use ido to
+ ~helm-completing-read-handlers-alist~ with ~ido~ as value.
+
+ Note: This mode is incompatible with Emacs23.
+
+*** Hooks in library =helm-mode=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-mode--ido-everywhere-hook~ ::
+
+ #+vindex: helm-mode--ido-everywhere-hook
+
+ *Standard Value*:
+
+- ~helm-mode-hook~ ::
+
+ #+vindex: helm-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm-mode-minibuffer-setup-hook-black-list~ ::
+
+ #+vindex: helm-mode-minibuffer-setup-hook-black-list
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (minibuffer-completion-help)
+ #+end_src
+
+ Incompatible ~minibuffer-setup-hook~ functions go here.
+ A list of symbols. ~helm-mode~ is rejecting all lambda’s, byte-code fns
+ and all functions belonging in this list from ~minibuffer-setup-hook~.
+ This is mainly needed to prevent "*Completions*" buffers to popup.
+
+** Library: helm-multi-match
+
+*** Modes in library ~helm-multi-match~
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-migemo-mode~ ::
+
+ #+findex: helm-migemo-mode
+
+ (helm-migemo-mode &optional ARG)
+
+ Enable migemo in helm.
+ It will be available in the sources handling it,
+ i.e. the sources which have the slot :migemo with non--nil value.
+
+ If called interactively, toggle ~Helm-Migemo mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+*** Commands in library ~helm-multi-match~ (excludes keymaps)
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-migemo-mode~ ::
+
+ #+findex: helm-migemo-mode
+
+ (helm-migemo-mode &optional ARG)
+
+ Enable migemo in helm.
+ It will be available in the sources handling it,
+ i.e. the sources which have the slot :migemo with non--nil value.
+
+ If called interactively, toggle ~Helm-Migemo mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+*** Options in library =helm-multi-match=
+
+**** Migemo
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-migemo-mode-hook~ ::
+
+ #+vindex: helm-migemo-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-migemo-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-migemo-mode~ ::
+
+ #+vindex: helm-migemo-mode
+
+ *Standard Value*: nil
+
+ (helm-migemo-mode &optional ARG)
+
+ Enable migemo in helm.
+ It will be available in the sources handling it,
+ i.e. the sources which have the slot :migemo with non--nil value.
+
+ If called interactively, toggle ~Helm-Migemo mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-mm-matching-method~ ::
+
+ #+vindex: helm-mm-matching-method
+
+ *Standard Value*: multi3
+
+ Matching method for helm match plugin.
+ You can set here different methods to match candidates in helm.
+ Here are the possible value of this symbol and their meaning:
+ - multi1: Respect order, prefix of pattern must match.
+ - multi2: Same but with partial match.
+ - multi3: The best, multiple regexp match, allow negation.
+ - multi3p: Same but prefix must match.
+
+ Default is multi3, you should keep this for a better experience.
+
+ Note that multi1 and multi3p are incompatible with fuzzy matching
+ in file completion and by the way fuzzy matching will be disabled there
+ when these options are used.
+
+*** Hooks in library =helm-multi-match=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-migemo-mode-hook~ ::
+
+ #+vindex: helm-migemo-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-migemo-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+** Library: helm-net
+
+*** Commands in library ~helm-net~ (excludes keymaps)
+
+**** Browse
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-browse-url-chromium~ ::
+
+ #+findex: helm-browse-url-chromium
+
+ (helm-browse-url-chromium URL &optional IGNORE)
+
+ Browse URL with Google Chrome browser.
+
+- ~helm-browse-url-conkeror~ ::
+
+ #+findex: helm-browse-url-conkeror
+
+ (helm-browse-url-conkeror URL &optional IGNORE)
+
+ Browse URL with conkeror browser.
+
+- ~helm-browse-url-firefox~ ::
+
+ #+findex: helm-browse-url-firefox
+
+ (helm-browse-url-firefox URL &optional IGNORE)
+
+ Same as ~browse-url-firefox~ but detach from Emacs.
+
+ So when you quit Emacs you can keep your Firefox session open and
+ not be prompted to kill the Firefox process.
+
+ NOTE: Probably not supported on some systems (e.g., Windows).
+
+- ~helm-browse-url-next~ ::
+
+ #+findex: helm-browse-url-next
+
+ (helm-browse-url-next URL &optional IGNORE)
+
+ Browse URL with next browser.
+
+- ~helm-browse-url-opera~ ::
+
+ #+findex: helm-browse-url-opera
+
+ (helm-browse-url-opera URL &optional IGNORE)
+
+ Browse URL with Opera browser and detach from Emacs.
+
+ So when you quit Emacs you can keep your Opera session open and
+ not be prompted to kill the Opera process.
+
+ NOTE: Probably not supported on some systems (e.g., Windows).
+
+- ~helm-browse-url-uzbl~ ::
+
+ #+findex: helm-browse-url-uzbl
+
+ (helm-browse-url-uzbl URL &optional IGNORE)
+
+ Browse URL with uzbl browser.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c C-c g)}}} (~helm-google-suggest~) ::
+
+ #+findex: helm-google-suggest
+
+ #+kindex: C-x c C-c g
+
+ Preconfigured ~helm~ for Google search with Google suggest.
+
+- {{{kbd(C-x c s)}}} (~helm-surfraw~) ::
+
+ #+findex: helm-surfraw
+
+ #+kindex: C-x c s
+
+ (helm-surfraw PATTERN ENGINE)
+
+ Preconfigured ~helm~ to search PATTERN with search ENGINE.
+
+*** Options in library =helm-net=
+
+**** Function
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-surfraw-default-browser-function~ ::
+
+ #+vindex: helm-surfraw-default-browser-function
+
+ *Standard Value*: nil
+
+ The browse url function you prefer to use with surfraw.
+ When nil, fallback to ~browse-url-browser-function~.
+
+**** Curl
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-net-curl-switches~ ::
+
+ #+vindex: helm-net-curl-switches
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("-s" "-L")
+ #+end_src
+
+ Arguments list passed to curl when using ~helm-net-prefer-curl~.
+
+- ~helm-net-prefer-curl~ ::
+
+ #+vindex: helm-net-prefer-curl
+
+ *Standard Value*: nil
+
+ When non--nil use CURL external program to fetch data.
+ Otherwise ~url-retrieve-synchronously~ is used.
+
+**** Url
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-browse-url-firefox-new-window~ ::
+
+ #+vindex: helm-browse-url-firefox-new-window
+
+ *Standard Value*: -new-tab
+
+ Allow choosing to browse url in new window or new tab.
+ Can be "-new-tab" (default) or "-new-window".
+
+- ~helm-home-url~ ::
+
+ #+vindex: helm-home-url
+
+ *Standard Value*: https://www.google.com
+
+ Default url to use as home url.
+
+- ~helm-surfraw-duckduckgo-url~ ::
+
+ #+vindex: helm-surfraw-duckduckgo-url
+
+ *Standard Value*: https://duckduckgo.com/lite/?q=%s&kp=1
+
+ The Duckduckgo url.
+ This is a format string, don’t forget the ~%s~.
+ If you have personal settings saved on duckduckgo you should have
+ a personal url, see your settings on duckduckgo.
+
+**** Suggest Url
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-search-suggest-action-imdb-url~ ::
+
+ #+vindex: helm-search-suggest-action-imdb-url
+
+ *Standard Value*: http://www.imdb.com/find?s=all&q=%s
+
+ The IMDb search url.
+ This is a format string, don’t forget the ~%s~.
+
+- ~helm-search-suggest-action-wikipedia-url~ ::
+
+ #+vindex: helm-search-suggest-action-wikipedia-url
+
+ *Standard Value*: https://en.wikipedia.org/wiki/Special:Search?search=%s
+
+ The Wikipedia search url.
+ This is a format string, don’t forget the ~%s~.
+
+- ~helm-search-suggest-action-youtube-url~ ::
+
+ #+vindex: helm-search-suggest-action-youtube-url
+
+ *Standard Value*: https://www.youtube.com/results?aq=f&search_query=%s
+
+ The Youtube search url.
+ This is a format string, don’t forget the ~%s~.
+
+**** Suggest Google Url
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-google-suggest-search-url~ ::
+
+ #+vindex: helm-google-suggest-search-url
+
+ *Standard Value*: https://encrypted.google.com/search?ie=utf-8&oe=utf-8&q=%s
+
+ URL used for Google searching.
+ This is a format string, don’t forget the ~%s~.
+
+- ~helm-google-suggest-url~ ::
+
+ #+vindex: helm-google-suggest-url
+
+ *Standard Value*: https://encrypted.google.com/complete/search?output=toolbar&q=%s
+
+ URL used for looking up Google suggestions.
+ This is a format string, don’t forget the ~%s~.
+
+- ~helm-search-suggest-action-google-maps-url~ ::
+
+ #+vindex: helm-search-suggest-action-google-maps-url
+
+ *Standard Value*: https://maps.google.com/maps?f=q&source=s_q&q=%s
+
+ The Google Maps search url.
+ This is a format string, don’t forget the ~%s~.
+
+- ~helm-search-suggest-action-google-news-url~ ::
+
+ #+vindex: helm-search-suggest-action-google-news-url
+
+ *Standard Value*: https://www.google.com/search?safe=off&prmd=nvlifd&source=lnms&tbs=nws:1&q=%s
+
+ The Google News search url.
+ This is a format string, don’t forget the ~%s~.
+
+**** Suggest Google uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-google-suggest-actions~ ::
+
+ #+vindex: helm-google-suggest-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Google Search" . helm-google-suggest-action)
+ ("Wikipedia" lambda
+ (candidate)
+ (helm-search-suggest-perform-additional-action helm-search-suggest-action-wikipedia-url candidate))
+ ("Youtube" lambda
+ (candidate)
+ (helm-search-suggest-perform-additional-action helm-search-suggest-action-youtube-url candidate))
+ ("IMDb" lambda
+ (candidate)
+ (helm-search-suggest-perform-additional-action helm-search-suggest-action-imdb-url candidate))
+ ("Google Maps" lambda
+ (candidate)
+ (helm-search-suggest-perform-additional-action helm-search-suggest-action-google-maps-url candidate))
+ ("Google News" lambda
+ (candidate)
+ (helm-search-suggest-perform-additional-action helm-search-suggest-action-google-news-url candidate)))
+ #+end_src
+
+ List of actions for google suggest sources.
+
+- ~helm-google-suggest-default-browser-function~ ::
+
+ #+vindex: helm-google-suggest-default-browser-function
+
+ *Standard Value*: nil
+
+ The browse url function you prefer to use with Google suggest.
+ When nil, use the first browser function available
+ See ~helm-browse-url-default-browser-alist~.
+
+- ~helm-google-suggest-use-curl-p~ ::
+
+ #+vindex: helm-google-suggest-use-curl-p
+
+ *Standard Value*: nil
+
+ When non--nil use CURL external program to fetch data.
+ Otherwise ~url-retrieve-synchronously~ is used.
+
+** Library: helm-occur
+
+*** Modes in library ~helm-occur~
+
+**** other-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-occur-mode~ ::
+
+ #+findex: helm-occur-mode
+
+ Major mode to provide actions in helm moccur saved buffer.
+
+ Special commands:
+ \{helm-occur-mode-map}
+
+ In addition to any hooks its parent mode ~special-mode~ might have
+ run, this mode runs the hook ~helm-occur-mode-hook~, as the final or
+ penultimate step during initialization.
+
+*** Commands in keymap ~helm-occur-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-o)}}} (~helm-occur-run-goto-line-of~) ::
+
+ #+findex: helm-occur-run-goto-line-of @r{(helm-occur-map)}
+
+ #+kindex: C-c C-o @r{(helm-occur-map)}
+
+ Run goto line new frame action from ~helm-occur~.
+
+- {{{kbd(C-c o)}}} (~helm-occur-run-goto-line-ow~) ::
+
+ #+findex: helm-occur-run-goto-line-ow @r{(helm-occur-map)}
+
+ #+kindex: C-c o @r{(helm-occur-map)}
+
+ Run goto line other window action from ~helm-occur~.
+
+- {{{kbd(C-x C-s)}}} (~helm-occur-run-save-buffer~) ::
+
+ #+findex: helm-occur-run-save-buffer @r{(helm-occur-map)}
+
+ #+kindex: C-x C-s @r{(helm-occur-map)}
+
+ Run moccur save results action from ~helm-moccur~.
+
+*** Commands in keymap ~helm-occur-mode-map~
+
+**** uncategorized File
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-<down>)}}} ::
+- {{{kbd(M-N)}}} (~helm-gm-next-file~) ::
+
+ #+findex: helm-gm-next-file @r{(helm-occur-mode-map)}
+
+ #+kindex: M-<down> @r{(helm-occur-mode-map)}
+ #+kindex: M-N @r{(helm-occur-mode-map)}
+
+- {{{kbd(M-<up>)}}} ::
+- {{{kbd(M-P)}}} (~helm-gm-precedent-file~) ::
+
+ #+findex: helm-gm-precedent-file @r{(helm-occur-mode-map)}
+
+ #+kindex: M-<up> @r{(helm-occur-mode-map)}
+ #+kindex: M-P @r{(helm-occur-mode-map)}
+
+**** uncategorized Occur
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(RET)}}} (~helm-occur-mode-goto-line~) ::
+
+ #+findex: helm-occur-mode-goto-line @r{(helm-occur-mode-map)}
+
+ #+kindex: RET @r{(helm-occur-mode-map)}
+
+- {{{kbd(C-o)}}} (~helm-occur-mode-goto-line-ow~) ::
+
+ #+findex: helm-occur-mode-goto-line-ow @r{(helm-occur-mode-map)}
+
+ #+kindex: C-o @r{(helm-occur-mode-map)}
+
+- {{{kbd(C-<up>)}}} ::
+- {{{kbd(M-p)}}} (~helm-occur-mode-goto-line-ow-backward~) ::
+
+ #+findex: helm-occur-mode-goto-line-ow-backward @r{(helm-occur-mode-map)}
+
+ #+kindex: C-<up> @r{(helm-occur-mode-map)}
+ #+kindex: M-p @r{(helm-occur-mode-map)}
+
+ (helm-occur-mode-goto-line-ow-backward ARG)
+
+- {{{kbd(C-<down>)}}} ::
+- {{{kbd(M-n)}}} (~helm-occur-mode-goto-line-ow-forward~) ::
+
+ #+findex: helm-occur-mode-goto-line-ow-forward @r{(helm-occur-mode-map)}
+
+ #+kindex: C-<down> @r{(helm-occur-mode-map)}
+ #+kindex: M-n @r{(helm-occur-mode-map)}
+
+ (helm-occur-mode-goto-line-ow-forward ARG)
+
+- {{{kbd(C-c b)}}} (~helm-occur-mode-resume-session~) ::
+
+ #+findex: helm-occur-mode-resume-session @r{(helm-occur-mode-map)}
+
+ #+kindex: C-c b @r{(helm-occur-mode-map)}
+
+*** Commands in library ~helm-occur~ (excludes keymaps)
+
+**** Mode
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-occur-mode-mouse-goto-line~ ::
+
+ #+findex: helm-occur-mode-mouse-goto-line
+
+ (helm-occur-mode-mouse-goto-line EVENT)
+
+**** Isearch
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-multi-occur-from-isearch~ ::
+
+ #+findex: helm-multi-occur-from-isearch
+
+ Invoke ~helm-multi-occur~ from isearch.
+
+ With a prefix arg, reverse the behavior of
+ ~helm-moccur-always-search-in-current~.
+ The prefix arg can be set before calling
+ ~helm-multi-occur-from-isearch~ or during the buffer selection.
+
+ To use this bind it to a key in ~isearch-mode-map~.
+
+- ~helm-occur-from-isearch~ ::
+
+ #+findex: helm-occur-from-isearch
+
+ Invoke ~helm-occur~ from isearch.
+
+ To use this bind it to a key in ~isearch-mode-map~.
+
+**** other-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-occur-mode~ ::
+
+ #+findex: helm-occur-mode
+
+ Major mode to provide actions in helm moccur saved buffer.
+
+ Special commands:
+ \{helm-occur-mode-map}
+
+ In addition to any hooks its parent mode ~special-mode~ might have
+ run, this mode runs the hook ~helm-occur-mode-hook~, as the final or
+ penultimate step during initialization.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c M-s o)}}} ::
+- {{{kbd(M-s o)}}} (~helm-occur~) ::
+
+ #+findex: helm-occur
+
+ #+kindex: C-x c M-s o
+ #+kindex: M-s o
+
+ Preconfigured helm for searching lines matching pattern in ~current-buffer~.
+
+ When ~helm-source-occur~ is member of
+ ~helm-sources-using-default-as-input~ which is the default,
+ symbol at point is searched at startup.
+
+ When a region is marked search only in this region by narrowing.
+
+ To search in multiples buffers start from one of the commands listing
+ buffers (i.e. a helm command using ~helm-source-buffers-list~ like
+ ~helm-mini~) and use the multi occur buffers action.
+
+ This is the helm implementation that collect lines matching pattern
+ like vanilla Emacs ~occur~ but have nothing to do with it, the search
+ engine beeing completely different and also much faster.
+
+- ~helm-occur-right~ ::
+
+ #+findex: helm-occur-right
+
+ ~helm-occur~ action for right arrow.
+ This is used when ~helm-occur-use-ioccur-style-keys~ is enabled.
+ If follow is enabled (default) go to next source, otherwise execute
+ persistent action.
+
+- ~helm-occur-run-default-action~ ::
+
+ #+findex: helm-occur-run-default-action
+
+- ~helm-occur-visible-buffers~ ::
+
+ #+findex: helm-occur-visible-buffers
+
+ Run helm-occur on all visible buffers in frame.
+
+*** Options in library =helm-occur=
+
+**** uncategorized uncategorized uncategorized uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-occur-actions~ ::
+
+ #+vindex: helm-occur-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Go to Line" . helm-occur-goto-line)
+ ("Goto line other window (C-u vertically)" . helm-occur-goto-line-ow)
+ ("Goto line new frame" . helm-occur-goto-line-of)
+ ("Save buffer" . helm-occur-save-results))
+ #+end_src
+
+ Actions for helm-occur.
+
+- ~helm-occur-always-search-in-current~ ::
+
+ #+vindex: helm-occur-always-search-in-current
+
+ *Standard Value*: nil
+
+ Helm multi occur always search in current buffer when non--nil.
+
+- ~helm-occur-auto-update-on-resume~ ::
+
+ #+vindex: helm-occur-auto-update-on-resume
+
+ *Standard Value*: nil
+
+ Allow auto updating helm-occur buffer when outdated.
+ noask => Always update without asking
+ nil => Don’t update but signal buffer needs update
+ never => Never update and do not signal buffer needs update
+ Any other non--nil value update after confirmation.
+
+- ~helm-occur-buffer-substring-fn-for-modes~ ::
+
+ #+vindex: helm-occur-buffer-substring-fn-for-modes
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ((mu4e-headers-mode . buffer-substring))
+ #+end_src
+
+ Function to use to display buffer contents for major-mode.
+
+ Can be one of ~buffer-substring~ or ~buffer-substring-no-properties~.
+
+ Note that when using ~buffer-substring~ initialization will be slower.
+
+- ~helm-occur-candidate-number-limit~ ::
+
+ #+vindex: helm-occur-candidate-number-limit
+
+ *Standard Value*: 99999
+
+ Value of ~helm-candidate-number-limit~ for helm-occur.
+
+- ~helm-occur-keep-closest-position~ ::
+
+ #+vindex: helm-occur-keep-closest-position
+
+ *Standard Value*: t
+
+ When non nil select closest candidate from point after update.
+ This happen only in ~helm-source-occur~ which is always related to ~current-buffer~.
+
+- ~helm-occur-truncate-lines~ ::
+
+ #+vindex: helm-occur-truncate-lines
+
+ *Standard Value*: t
+
+ Truncate lines in occur buffer when non nil.
+
+- ~helm-occur-use-ioccur-style-keys~ ::
+
+ #+vindex: helm-occur-use-ioccur-style-keys
+
+ *Standard Value*: nil
+
+ Similar to ~helm-grep-use-ioccur-style-keys~ but for multi occur.
+
+ Note that if you define this variable with ~setq~ your change will
+ have no effect, use customize instead.
+
+*** Hooks in library =helm-occur=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-occur-mode-hook~ ::
+
+ #+vindex: helm-occur-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering helm-moccur mode.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+** Library: helm-regexp
+
+*** Commands in library ~helm-regexp~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c r)}}} (~helm-regexp~) ::
+
+ #+findex: helm-regexp
+
+ #+kindex: C-x c r
+
+ Preconfigured helm to build regexps.
+ ~query-replace-regexp~ can be run from there against found regexp.
+
+** Library: helm-ring
+
+*** Commands in keymap ~helm-kill-ring-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-D)}}} (~helm-kill-ring-delete~) ::
+
+ #+findex: helm-kill-ring-delete @r{(helm-kill-ring-map)}
+
+ #+kindex: M-D @r{(helm-kill-ring-map)}
+
+ Delete marked candidates from ~kill-ring~.
+
+ This is a command for ~helm-kill-ring-map~.
+
+- {{{kbd(C-c C-k)}}} (~helm-kill-ring-kill-selection~) ::
+
+ #+findex: helm-kill-ring-kill-selection @r{(helm-kill-ring-map)}
+
+ #+kindex: C-c C-k @r{(helm-kill-ring-map)}
+
+ Store the real value of candidate in kill-ring.
+ Same as ~helm-kill-selection-and-quit~ called with a prefix arg.
+
+- {{{kbd(C-c d)}}} (~helm-kill-ring-run-persistent-delete~) ::
+
+ #+findex: helm-kill-ring-run-persistent-delete @r{(helm-kill-ring-map)}
+
+ #+kindex: C-c d @r{(helm-kill-ring-map)}
+
+ Delete current candidate without quitting.
+
+- {{{kbd(C-s)}}} (~helm-kill-ring-run-search-from-string~) ::
+
+ #+findex: helm-kill-ring-run-search-from-string @r{(helm-kill-ring-map)}
+
+ #+kindex: C-s @r{(helm-kill-ring-map)}
+
+- {{{kbd(C-])}}} (~helm-kill-ring-toggle-truncated~) ::
+
+ #+findex: helm-kill-ring-toggle-truncated @r{(helm-kill-ring-map)}
+
+ #+kindex: C-] @r{(helm-kill-ring-map)}
+
+ Toggle truncated view of candidates in helm kill-ring browser.
+
+*** Commands in library ~helm-ring~ (excludes keymaps)
+
+**** Ring
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c M-y)}}} (~helm-show-kill-ring~) ::
+
+ #+findex: helm-show-kill-ring
+
+ #+kindex: C-x c M-y
+
+ Preconfigured ~helm~ for ~kill-ring~.
+ It is drop-in replacement of ~yank-pop~.
+
+ First call open the kill-ring browser, next calls move to next line.
+
+**** Mark
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c C-c SPC)}}} (~helm-all-mark-rings~) ::
+
+ #+findex: helm-all-mark-rings
+
+ #+kindex: C-x c C-c SPC
+
+ Preconfigured ~helm~ for ~helm-source-global-mark-ring~ and ~helm-source-mark-ring~.
+
+- ~helm-global-mark-ring~ ::
+
+ #+findex: helm-global-mark-ring
+
+ Preconfigured ~helm~ for ~helm-source-global-mark-ring~.
+
+- ~helm-mark-ring~ ::
+
+ #+findex: helm-mark-ring
+
+ Preconfigured ~helm~ for ~helm-source-mark-ring~.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-execute-kmacro~ ::
+
+ #+findex: helm-execute-kmacro
+
+ Preconfigured helm for keyboard macros.
+ Define your macros with ~f3~ and ~f4~.
+ See (info "(emacs) Keyboard Macros") for detailed infos.
+ This command is useful when used with persistent action.
+
+- {{{kbd(C-x c C-x r i)}}} (~helm-register~) ::
+
+ #+findex: helm-register
+
+ #+kindex: C-x c C-x r i
+
+ Preconfigured ~helm~ for Emacs registers.
+
+*** Options in library =helm-ring=
+
+**** Offset
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-register-max-offset~ ::
+
+ #+vindex: helm-register-max-offset
+
+ *Standard Value*: 160
+
+ Max size of string register entries before truncating.
+
+**** Kill
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-kill-ring-actions~ ::
+
+ #+vindex: helm-kill-ring-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Yank marked" . helm-kill-ring-action-yank)
+ ("Delete marked" . helm-kill-ring-action-delete)
+ ("Search from candidate" . helm-kill-ring-search-from-string))
+ #+end_src
+
+ List of actions for kill ring source.
+
+- ~helm-kill-ring-max-offset~ ::
+
+ #+vindex: helm-kill-ring-max-offset
+
+ *Standard Value*: 400
+
+ Max number of chars displayed per candidate in kill-ring browser.
+ When ~t~, don’t truncate candidate, show all.
+ By default it is approximatively the number of bits contained in five lines
+ of 80 chars each, i.e. 80*5.
+ Note that if you set this to nil multiline will be disabled, i.e. you
+ will not have separators between candidates any more.
+
+- ~helm-kill-ring-separator~ ::
+
+ #+vindex: helm-kill-ring-separator
+
+ *Standard Value*:
+
+ The separator used to separate marked candidates when yanking.
+
+- ~helm-kill-ring-threshold~ ::
+
+ #+vindex: helm-kill-ring-threshold
+
+ *Standard Value*: 3
+
+ Minimum length of a candidate to be listed by ~helm-source-kill-ring~.
+
+** Library: helm-semantic
+
+*** Commands in library ~helm-semantic~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-semantic~ ::
+
+ #+findex: helm-semantic
+
+ (helm-semantic ARG)
+
+ Preconfigured ~helm~ for ~semantic~.
+ If ARG is supplied, pre-select symbol at point instead of current.
+
+- ~helm-semantic-or-imenu~ ::
+
+ #+findex: helm-semantic-or-imenu
+
+ (helm-semantic-or-imenu ARG)
+
+ Preconfigured helm for ~semantic~ or ~imenu~.
+ If ARG is supplied, pre-select symbol at point instead of current
+ semantic tag in scope.
+
+ If ~semantic-mode~ is active in the current buffer, then use
+ semantic for generating tags, otherwise fall back to ~imenu~.
+ Fill in the symbol at point by default.
+
+*** Options in library =helm-semantic=
+
+**** Style
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-semantic-display-style~ ::
+
+ #+vindex: helm-semantic-display-style
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ((python-mode . semantic-format-tag-summarize)
+ (c-mode . semantic-format-tag-concise-prototype-c-mode)
+ (emacs-lisp-mode . semantic-format-tag-abbreviate-emacs-lisp-mode))
+ #+end_src
+
+ Function to present a semantic tag according to ~major-mode~.
+
+ It is an alist where the ~car~ of each element is a ~major-mode~ and
+ the ~cdr~ a ~semantic-format-tag-*~ function.
+
+ If no function is found for current ~major-mode~, fall back to
+ ~semantic-format-tag-summarize~ default function.
+
+ You can have more or less informations depending of the ~semantic-format-tag-*~
+ function you choose.
+
+ All the supported functions are prefixed with "semantic-format-tag-",
+ you have completion on these functions with ~C-M i~ in the customize interface.
+
+- ~helm-semantic-lynx-style-map~ ::
+
+ #+vindex: helm-semantic-lynx-style-map
+
+ *Standard Value*: nil
+
+ Use Arrow keys to jump to occurences.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-semantic-fuzzy-match~ ::
+
+ #+vindex: helm-semantic-fuzzy-match
+
+ *Standard Value*: nil
+
+ Enable fuzzy matching in ~helm-source-semantic~.
+
+** Library: helm-shell
+
+*** Commands in library ~helm-shell~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-shell-prompts~ ::
+
+ #+findex: helm-shell-prompts
+
+ Pre-configured ~helm~ to browse the prompts of the current comint buffer.
+
+- ~helm-shell-prompts-all~ ::
+
+ #+findex: helm-shell-prompts-all
+
+ Pre-configured ~helm~ to browse the prompts of all comint sessions.
+
+** Library: helm-source
+
+** Library: helm-sys
+
+*** Modes in library ~helm-sys~
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-top-poll-mode~ ::
+
+ #+findex: helm-top-poll-mode
+
+ (helm-top-poll-mode &optional ARG)
+
+ Refresh automatically helm top buffer once enabled.
+
+ If called interactively, toggle ~Helm-Top-Poll mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+*** Commands in keymap ~helm-top-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-C)}}} (~helm-top-run-sort-by-com~) ::
+
+ #+findex: helm-top-run-sort-by-com @r{(helm-top-map)}
+
+ #+kindex: M-C @r{(helm-top-map)}
+
+- {{{kbd(M-P)}}} (~helm-top-run-sort-by-cpu~) ::
+
+ #+findex: helm-top-run-sort-by-cpu @r{(helm-top-map)}
+
+ #+kindex: M-P @r{(helm-top-map)}
+
+- {{{kbd(M-M)}}} (~helm-top-run-sort-by-mem~) ::
+
+ #+findex: helm-top-run-sort-by-mem @r{(helm-top-map)}
+
+ #+kindex: M-M @r{(helm-top-map)}
+
+- {{{kbd(M-U)}}} (~helm-top-run-sort-by-user~) ::
+
+ #+findex: helm-top-run-sort-by-user @r{(helm-top-map)}
+
+ #+kindex: M-U @r{(helm-top-map)}
+
+*** Commands in library ~helm-sys~ (excludes keymaps)
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-top-poll-mode~ ::
+
+ #+findex: helm-top-poll-mode
+
+ (helm-top-poll-mode &optional ARG)
+
+ Refresh automatically helm top buffer once enabled.
+
+ If called interactively, toggle ~Helm-Top-Poll mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c p)}}} (~helm-list-emacs-process~) ::
+
+ #+findex: helm-list-emacs-process
+
+ #+kindex: C-x c p
+
+ Preconfigured ~helm~ for Emacs process.
+
+- {{{kbd(C-x c t)}}} (~helm-top~) ::
+
+ #+findex: helm-top
+
+ #+kindex: C-x c t
+
+ Preconfigured ~helm~ for top command.
+
+- ~helm-xrandr-set~ ::
+
+ #+findex: helm-xrandr-set
+
+ Preconfigured helm for xrandr.
+
+*** Options in library =helm-sys=
+
+**** Command
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-top-command~ ::
+
+ #+vindex: helm-top-command
+
+ *Standard Value*: env COLUMNS=%s top -b -n 1
+
+ Top command used to display output of top.
+ A format string where %s will be replaced with ~frame-width~.
+
+ To use ’top’ command, a version supporting batch mode (-b option)
+ is needed. On Mac OSX ’top’ command doesn’t support this, so the
+ ’ps’ command is used instead by default.
+
+ Normally ’top’ command output have 12 columns, but in some
+ versions you may have less than this, so you can either customize
+ top to use 12 columns with the interactives ’f’ and ’W’ commands
+ of top, or modify ~helm-top-sort-columns-alist~ to fit with the
+ number of columns your ’top’ command is using.
+
+ If you modify ’ps’ command be sure that ’pid’ comes in first and
+ "env COLUMNS=%s" is specified at beginning of command. Ensure
+ also that no elements contain spaces (e.g., use start_time and
+ not start). Same as for ’top’: you can customize
+ ~helm-top-sort-columns-alist~ to make sort commands working
+ properly according to your settings.
+
+**** Poll
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-top-poll-delay~ ::
+
+ #+vindex: helm-top-poll-delay
+
+ *Standard Value*: 1.5
+
+ Helm top poll after this delay when ~helm-top-poll-mode~ is enabled.
+ The minimal delay allowed is 1.5, if less than this helm-top will use 1.5.
+
+- ~helm-top-poll-delay-post-command~ ::
+
+ #+vindex: helm-top-poll-delay-post-command
+
+ *Standard Value*: 1.0
+
+ Helm top stop polling during this delay.
+ This delay is added to ~helm-top-poll-delay~ after Emacs stops
+ being idle.
+
+- ~helm-top-poll-mode-hook~ ::
+
+ #+vindex: helm-top-poll-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-top-poll-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm-top-poll-preselection~ ::
+
+ #+vindex: helm-top-poll-preselection
+
+ *Standard Value*: linum
+
+ Stay on same line or follow candidate when ~helm-top-poll~ updates display.
+ Possible values are ’candidate or ’linum.
+ This affects also sorting functions in the same way.
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-top-poll-mode~ ::
+
+ #+vindex: helm-top-poll-mode
+
+ *Standard Value*: nil
+
+ (helm-top-poll-mode &optional ARG)
+
+ Refresh automatically helm top buffer once enabled.
+
+ If called interactively, toggle ~Helm-Top-Poll mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-top-sort-columns-alist~ ::
+
+ #+vindex: helm-top-sort-columns-alist
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ((com . 11)
+ (mem . 9)
+ (cpu . 8)
+ (user . 1))
+ #+end_src
+
+ Allow defining which column to use when sorting output of top/ps command.
+ Only com, mem, cpu and user are sorted, so no need to put something else there,
+ it will have no effect.
+ Note that column numbers are counted from zero, i.e. column 1 is the nth 0 column.
+
+*** Hooks in library =helm-sys=
+
+**** Poll
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-top-initialize-poll-hooks~ ::
+
+ #+vindex: helm-top-initialize-poll-hooks
+
+ *Standard Value*:
+
+- ~helm-top-poll-mode-hook~ ::
+
+ #+vindex: helm-top-poll-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-top-poll-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-top-after-init-hook~ ::
+
+ #+vindex: helm-top-after-init-hook
+
+ *Standard Value*: nil
+
+ Local hook for helm-top.
+
+** Library: helm-tags
+
+*** Commands in keymap ~helm-etags-map~
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-o)}}} (~helm-etags-run-switch-other-frame~) ::
+
+ #+findex: helm-etags-run-switch-other-frame @r{(helm-etags-map)}
+
+ #+kindex: C-c C-o @r{(helm-etags-map)}
+
+ Run switch to other frame action from ~helm-source-etags-select~.
+
+- {{{kbd(C-c o)}}} (~helm-etags-run-switch-other-window~) ::
+
+ #+findex: helm-etags-run-switch-other-window @r{(helm-etags-map)}
+
+ #+kindex: C-c o @r{(helm-etags-map)}
+
+ Run switch to other window action from ~helm-source-etags-select~.
+
+- {{{kbd(M-<down>)}}} (~helm-goto-next-file~) ::
+
+ #+findex: helm-goto-next-file @r{(helm-etags-map)}
+
+ #+kindex: M-<down> @r{(helm-etags-map)}
+
+ Go to previous file in Helm grep/etags buffers.
+
+- {{{kbd(M-<up>)}}} (~helm-goto-precedent-file~) ::
+
+ #+findex: helm-goto-precedent-file @r{(helm-etags-map)}
+
+ #+kindex: M-<up> @r{(helm-etags-map)}
+
+ Go to previous file in Helm grep/etags buffers.
+
+*** Commands in library ~helm-tags~ (excludes keymaps)
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-x c e)}}} (~helm-etags-select~) ::
+
+ #+findex: helm-etags-select
+
+ #+kindex: C-x c e
+
+ (helm-etags-select REINIT)
+
+ Preconfigured helm for etags.
+ If called with a prefix argument REINIT
+ or if any of the tag files have been modified, reinitialize cache.
+
+ This function aggregates three sources of tag files:
+
+ 1) An automatically located file in the parent directories,
+ by ~helm-etags-get-tag-file~.
+ 2) ~tags-file-name~, which is commonly set by ~find-tag~ command.
+ 3) ~tags-table-list~ which is commonly set by ~visit-tags-table~ command.
+
+*** Options in library =helm-tags=
+
+**** File
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-etags-tag-file-name~ ::
+
+ #+vindex: helm-etags-tag-file-name
+
+ *Standard Value*: TAGS
+
+ Etags tag file name.
+
+- ~helm-etags-tag-file-search-limit~ ::
+
+ #+vindex: helm-etags-tag-file-search-limit
+
+ *Standard Value*: 10
+
+ The limit level of directory to search tag file.
+ Don’t search tag file deeply if outside this value.
+
+**** Match
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-etags-fuzzy-match~ ::
+
+ #+vindex: helm-etags-fuzzy-match
+
+ *Standard Value*: nil
+
+ Use fuzzy matching in ~helm-etags-select~.
+
+- ~helm-etags-match-part-only~ ::
+
+ #+vindex: helm-etags-match-part-only
+
+ *Standard Value*: tag
+
+ Allow choosing the tag part of CANDIDATE in ~helm-source-etags-select~.
+ A tag looks like this:
+ filename: (defun foo
+ You can choose matching against the tag part (i.e "(defun foo"),
+ or against the whole candidate (i.e "(filename:5:(defun foo").
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-etags-execute-action-at-once-if-one~ ::
+
+ #+vindex: helm-etags-execute-action-at-once-if-one
+
+ *Standard Value*: t
+
+ Whether to jump straight to the selected tag if there’s only
+ one match.
+
+** Library: helm-types
+
+*** Commands in keymap ~helm-generic-files-map~
+
+**** uncategorized Run Files
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-a)}}} (~helm-ff-run-mail-attach-files~) ::
+
+ #+findex: helm-ff-run-mail-attach-files @r{(helm-generic-files-map)}
+
+ #+kindex: C-c C-a @r{(helm-generic-files-map)}
+
+ Run mail attach files command action from ~helm-source-find-files~.
+
+- {{{kbd(C-x C-q)}}} (~helm-ff-run-marked-files-in-dired~) ::
+
+ #+findex: helm-ff-run-marked-files-in-dired @r{(helm-generic-files-map)}
+
+ #+kindex: C-x C-q @r{(helm-generic-files-map)}
+
+ Execute ~helm-marked-files-in-dired~ interactively.
+
+**** uncategorized Run Switch
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-o)}}} (~helm-ff-run-switch-other-frame~) ::
+
+ #+findex: helm-ff-run-switch-other-frame @r{(helm-generic-files-map)}
+
+ #+kindex: C-c C-o @r{(helm-generic-files-map)}
+
+ Run switch to other frame action from ~helm-source-find-files~.
+
+- {{{kbd(C-c o)}}} (~helm-ff-run-switch-other-window~) ::
+
+ #+findex: helm-ff-run-switch-other-window @r{(helm-generic-files-map)}
+
+ #+kindex: C-c o @r{(helm-generic-files-map)}
+
+ Run switch to other window action from ~helm-source-find-files~.
+ When a prefix arg is provided, split is done vertically.
+
+**** uncategorized Run File Open
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-c C-x)}}} (~helm-ff-run-open-file-externally~) ::
+
+ #+findex: helm-ff-run-open-file-externally @r{(helm-generic-files-map)}
+
+ #+kindex: C-c C-x @r{(helm-generic-files-map)}
+
+ Run open file externally command action from ~helm-source-find-files~.
+
+- {{{kbd(C-c X)}}} (~helm-ff-run-open-file-with-default-tool~) ::
+
+ #+findex: helm-ff-run-open-file-with-default-tool @r{(helm-generic-files-map)}
+
+ #+kindex: C-c X @r{(helm-generic-files-map)}
+
+ Run open file externally command action from ~helm-source-find-files~.
+
+**** uncategorized Run File Ediff
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-=)}}} (~helm-ff-run-ediff-file~) ::
+
+ #+findex: helm-ff-run-ediff-file @r{(helm-generic-files-map)}
+
+ #+kindex: C-= @r{(helm-generic-files-map)}
+
+ Run Ediff file action from ~helm-source-find-files~.
+
+- {{{kbd(C-c =)}}} (~helm-ff-run-ediff-merge-file~) ::
+
+ #+findex: helm-ff-run-ediff-merge-file @r{(helm-generic-files-map)}
+
+ #+kindex: C-c = @r{(helm-generic-files-map)}
+
+ Run Ediff merge file action from ~helm-source-find-files~.
+
+**** uncategorized Run File uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-B)}}} (~helm-ff-run-byte-compile-file~) ::
+
+ #+findex: helm-ff-run-byte-compile-file @r{(helm-generic-files-map)}
+
+ #+kindex: M-B @r{(helm-generic-files-map)}
+
+ Run Byte compile file action from ~helm-source-find-files~.
+
+- {{{kbd(M-C)}}} (~helm-ff-run-copy-file~) ::
+
+ #+findex: helm-ff-run-copy-file @r{(helm-generic-files-map)}
+
+ #+kindex: M-C @r{(helm-generic-files-map)}
+
+ Run Copy file action from ~helm-source-find-files~.
+
+- {{{kbd(M-D)}}} (~helm-ff-run-delete-file~) ::
+
+ #+findex: helm-ff-run-delete-file @r{(helm-generic-files-map)}
+
+ #+kindex: M-D @r{(helm-generic-files-map)}
+
+ Run Delete file action from ~helm-source-find-files~.
+
+- {{{kbd(C-c r)}}} (~helm-ff-run-find-file-as-root~) ::
+
+ #+findex: helm-ff-run-find-file-as-root @r{(helm-generic-files-map)}
+
+ #+kindex: C-c r @r{(helm-generic-files-map)}
+
+- {{{kbd(M-H)}}} (~helm-ff-run-hardlink-file~) ::
+
+ #+findex: helm-ff-run-hardlink-file @r{(helm-generic-files-map)}
+
+ #+kindex: M-H @r{(helm-generic-files-map)}
+
+ Run Hardlink file action from ~helm-source-find-files~.
+
+- {{{kbd(M-L)}}} (~helm-ff-run-load-file~) ::
+
+ #+findex: helm-ff-run-load-file @r{(helm-generic-files-map)}
+
+ #+kindex: M-L @r{(helm-generic-files-map)}
+
+ Run Load file action from ~helm-source-find-files~.
+
+- {{{kbd(M-R)}}} (~helm-ff-run-rename-file~) ::
+
+ #+findex: helm-ff-run-rename-file @r{(helm-generic-files-map)}
+
+ #+kindex: M-R @r{(helm-generic-files-map)}
+
+ Run Rename file action from ~helm-source-find-files~.
+
+- {{{kbd(M-S)}}} (~helm-ff-run-symlink-file~) ::
+
+ #+findex: helm-ff-run-symlink-file @r{(helm-generic-files-map)}
+
+ #+kindex: M-S @r{(helm-generic-files-map)}
+
+ Run Symlink file action from ~helm-source-find-files~.
+
+**** uncategorized Run uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(C-s)}}} ::
+- {{{kbd(M-g s)}}} (~helm-ff-run-grep~) ::
+
+ #+findex: helm-ff-run-grep @r{(helm-generic-files-map)}
+
+ #+kindex: C-s @r{(helm-generic-files-map)}
+ #+kindex: M-g s @r{(helm-generic-files-map)}
+
+ Run Grep action from ~helm-source-find-files~.
+
+- {{{kbd(C-c @)}}} (~helm-ff-run-insert-org-link~) ::
+
+ #+findex: helm-ff-run-insert-org-link @r{(helm-generic-files-map)}
+
+ #+kindex: C-c @ @r{(helm-generic-files-map)}
+
+- {{{kbd(M-g p)}}} (~helm-ff-run-pdfgrep~) ::
+
+ #+findex: helm-ff-run-pdfgrep @r{(helm-generic-files-map)}
+
+ #+kindex: M-g p @r{(helm-generic-files-map)}
+
+ Run Pdfgrep action from ~helm-source-find-files~.
+
+- {{{kbd(C-])}}} (~helm-ff-run-toggle-basename~) ::
+
+ #+findex: helm-ff-run-toggle-basename @r{(helm-generic-files-map)}
+
+ #+kindex: C-] @r{(helm-generic-files-map)}
+
+- {{{kbd(M-g z)}}} (~helm-ff-run-zgrep~) ::
+
+ #+findex: helm-ff-run-zgrep @r{(helm-generic-files-map)}
+
+ #+kindex: M-g z @r{(helm-generic-files-map)}
+
+ Run Grep action from ~helm-source-find-files~.
+
+**** uncategorized uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- {{{kbd(M-i)}}} (~helm-ff-properties-persistent~) ::
+
+ #+findex: helm-ff-properties-persistent @r{(helm-generic-files-map)}
+
+ #+kindex: M-i @r{(helm-generic-files-map)}
+
+ Show properties without quitting helm.
+
+*** Options in library =helm-types=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-type-bookmark-actions~ ::
+
+ #+vindex: helm-type-bookmark-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Jump to bookmark" . helm-bookmark-jump)
+ ("Jump to BM other window" . helm-bookmark-jump-other-window)
+ ("Jump to BM other frame" . helm-bookmark-jump-other-frame)
+ ("Bookmark edit annotation" . bookmark-edit-annotation)
+ ("Bookmark show annotation" . bookmark-show-annotation)
+ ("Delete bookmark(s)" . helm-delete-marked-bookmarks)
+ ("Edit Bookmark" . helm-bookmark-edit-bookmark)
+ ("Rename bookmark" . helm-bookmark-rename)
+ ("Relocate bookmark" . bookmark-relocate))
+ #+end_src
+
+ Default actions for type bookmarks.
+
+- ~helm-type-buffer-actions~ ::
+
+ #+vindex: helm-type-buffer-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Switch to buffer(s)" . helm-buffer-switch-buffers)
+ ("Switch to buffer(s) other window ~C-c o~" . helm-buffer-switch-buffers-other-window)
+ ("Switch to buffer other frame ~C-c C-o~" . switch-to-buffer-other-frame)
+ ("Switch to buffer other tab ~C-c C-t~" . helm-buffers-switch-to-buffer-other-tab)
+ ("Switch to buffer at line number" . helm-switch-to-buffer-at-linum)
+ ("Browse project ~C-x C-d~" . helm-buffers-browse-project)
+ ("Query replace regexp ~C-M-%~" . helm-buffer-query-replace-regexp)
+ ("Query replace ~M-%~" . helm-buffer-query-replace)
+ ("View buffer" . view-buffer)
+ ("Display buffer" . display-buffer)
+ ("Rename buffer ~M-R~" . helm-buffers-rename-buffer)
+ ("Grep buffer(s) ~M-g s~ (C-u grep all buffers)" . helm-zgrep-buffers)
+ ("Multi occur buffer(s) ~C-s (C-u search also in current)~" . helm-multi-occur-as-action)
+ ("Revert buffer(s) ~M-G~" . helm-revert-marked-buffers)
+ ("Insert buffer" . insert-buffer)
+ ("Kill buffer(s) ~M-D~" . helm-kill-marked-buffers)
+ ("Diff with file ~C-=~" . diff-buffer-with-file)
+ ("Ediff Marked buffers ~C-c =~" . helm-ediff-marked-buffers)
+ ("Ediff Merge marked buffers ~M-=~" .
+ #[257 "\300\301\"\207"
+ [helm-ediff-marked-buffers t]
+ 4 "\n\n(fn CANDIDATE)"]))
+ #+end_src
+
+ Default actions for type buffers.
+
+- ~helm-type-command-actions~ ::
+
+ #+vindex: helm-type-command-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Execute command" . helm-M-x-execute-command)
+ ("Describe function" . helm-describe-function)
+ ("Find function" . xref-find-definitions)
+ ("Info lookup" . helm-info-lookup-symbol)
+ ("Debug on entry" . debug-on-entry)
+ ("Cancel debug on entry" . cancel-debug-on-entry)
+ ("Trace function" . trace-function)
+ ("Trace function (background)" . trace-function-background)
+ ("Untrace function" . untrace-function))
+ #+end_src
+
+ Default actions for type command.
+
+- ~helm-type-file-actions~ ::
+
+ #+vindex: helm-type-file-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Find file" . helm-find-file-or-marked)
+ ("Find file as root" . helm-find-file-as-root)
+ ("Find file other window" . helm-find-files-other-window)
+ ("Find file other frame" . find-file-other-frame)
+ ("Open dired in file's directory" . helm-open-dired)
+ ("Attach file(s) to mail buffer ~C-c C-a~" . helm-ff-mail-attach-files)
+ ("Marked files in dired" . helm-marked-files-in-dired)
+ ("Grep File(s) ~C-u recurse~" . helm-find-files-grep)
+ ("Zgrep File(s) ~C-u Recurse~" . helm-ff-zgrep)
+ ("Pdfgrep File(s)" . helm-ff-pdfgrep)
+ ("Insert as org link" . helm-files-insert-as-org-link)
+ ("Checksum File" . helm-ff-checksum)
+ ("Ediff File" . helm-find-files-ediff-files)
+ ("Ediff Merge File" . helm-find-files-ediff-merge-files)
+ ("View file" . view-file)
+ ("Insert file" . insert-file)
+ ("Add marked files to file-cache" . helm-ff-cache-add-file)
+ ("Delete file(s)" . helm-ff-delete-files)
+ ("Copy file(s) ~M-C, C-u to follow~" . helm-find-files-copy)
+ ("Rename file(s) ~M-R, C-u to follow~" . helm-find-files-rename)
+ ("Symlink files(s) ~M-S, C-u to follow~" . helm-find-files-symlink)
+ ("Relsymlink file(s) ~C-u to follow~" . helm-find-files-relsymlink)
+ ("Hardlink file(s) ~M-H, C-u to follow~" . helm-find-files-hardlink)
+ ("Open file externally (C-u to choose)" . helm-open-file-externally)
+ ("Open file with default tool" . helm-open-file-with-default-tool)
+ ("Find file in hex dump" . hexl-find-file))
+ #+end_src
+
+ Default actions for type files.
+
+- ~helm-type-function-actions~ ::
+
+ #+vindex: helm-type-function-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Describe function" . helm-describe-function)
+ ("Find function" . xref-find-definitions)
+ ("Info lookup" . helm-info-lookup-symbol)
+ ("Debug on entry" . debug-on-entry)
+ ("Cancel debug on entry" . cancel-debug-on-entry)
+ ("Trace function" . trace-function)
+ ("Trace function (background)" . trace-function-background)
+ ("Untrace function" . untrace-function))
+ #+end_src
+
+ Default actions for type functions.
+
+- ~helm-type-timers-actions~ ::
+
+ #+vindex: helm-type-timers-actions
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (("Cancel Timer" lambda
+ (_timer)
+ (let
+ ((mkd
+ (helm-marked-candidates)))
+ (cl-loop for timer in mkd do
+ (cancel-timer timer))))
+ ("Describe Function" lambda
+ (tm)
+ (describe-function
+ (timer--function tm)))
+ ("Find Function" lambda
+ (tm)
+ (helm-aif
+ (timer--function tm)
+ (if
+ (or
+ (byte-code-function-p it)
+ (helm-subr-native-elisp-p it))
+ (message "Can't find anonymous function ~%s~" it)
+ (find-function it)))))
+ #+end_src
+
+ Default actions for type timers.
+
+** Library: helm-utils
+
+*** Modes in library ~helm-utils~
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-popup-tip-mode~ ::
+
+ #+findex: helm-popup-tip-mode
+
+ (helm-popup-tip-mode &optional ARG)
+
+ Show help-echo informations in a popup tip at end of line.
+
+ If called interactively, toggle ~Helm-Popup-Tip mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+*** Commands in library ~helm-utils~ (excludes keymaps)
+
+**** All
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-display-all-sources~ ::
+
+ #+findex: helm-display-all-sources
+
+ Display all sources previously hidden by ~helm-set-source-filter~.
+
+- ~helm-show-all-candidates-in-source~ ::
+
+ #+findex: helm-show-all-candidates-in-source
+
+ (helm-show-all-candidates-in-source ARG)
+
+ Toggle all or only candidate-number-limit cands in current source.
+ With a numeric prefix arg show only the ARG number of candidates.
+ The prefix arg has no effect when toggling to only
+ candidate-number-limit.
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-popup-tip-mode~ ::
+
+ #+findex: helm-popup-tip-mode
+
+ (helm-popup-tip-mode &optional ARG)
+
+ Show help-echo informations in a popup tip at end of line.
+
+ If called interactively, toggle ~Helm-Popup-Tip mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-quit-and-find-file~ ::
+
+ #+findex: helm-quit-and-find-file
+
+ Drop into ~helm-find-files~ from ~helm~.
+ If current selection is a buffer or a file, ~helm-find-files~
+ from its directory.
+
+*** Options in library =helm-utils=
+
+**** Window
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-window-prefer-horizontal-split~ ::
+
+ #+vindex: helm-window-prefer-horizontal-split
+
+ *Standard Value*: nil
+
+ Maybe switch to other window vertically when non nil.
+
+ Possible values are t, nil and ~decide~.
+
+ When t switch vertically.
+ When nil switch horizontally.
+ When ~decide~ try to guess if it is possible to switch vertically
+ according to the setting of ~split-width-threshold~ and the size of
+ the window from where splitting is done.
+
+ Note that when using ~decide~ and ~split-width-threshold~ is nil, the
+ behavior is the same as with a nil value.
+
+**** Resize
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-resize-on-pa-text-height~ ::
+
+ #+vindex: helm-resize-on-pa-text-height
+
+ *Standard Value*: 12
+
+ The size of the helm-window when resizing on persistent action.
+
+**** Buffers
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-buffers-to-resize-on-pa~ ::
+
+ #+vindex: helm-buffers-to-resize-on-pa
+
+ *Standard Value*: nil
+
+ A list of helm buffers where the helm-window should be reduced on persistent actions.
+
+**** Function
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-html-decode-entities-function~ ::
+
+ #+vindex: helm-html-decode-entities-function
+
+ *Standard Value*: helm-html-decode-entities-string
+
+ Function used to decode HTML entities in HTML bookmarks.
+ Helm comes by default with ~helm-html-decode-entities-string~, if you need something
+ more sophisticated you can use ~w3m-decode-entities-string~ if available.
+
+ In Emacs itself org-entities seem broken and ~xml-substitute-numeric-entities~
+ supports only numeric entities.
+
+- ~helm-window-show-buffers-function~ ::
+
+ #+vindex: helm-window-show-buffers-function
+
+ *Standard Value*: helm-window-default-split-fn
+
+ The default function to use when opening several buffers at once.
+ It is typically used to rearrange windows.
+
+**** Highlight
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-highlight-matches-around-point-max-lines~ ::
+
+ #+vindex: helm-highlight-matches-around-point-max-lines
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (15 . 15)
+ #+end_src
+
+ Number of lines around point where matched items are highlighted.
+
+ Possible value are:
+ - A cons cell (x . y)
+ Match x lines before point and y lines after point.
+ - An integer
+ Positive means this number lines after point.
+ Negative means this number lines before point.
+ A zero value means highlight only inside matched lines.
+ - The symbol never
+ Means do not highlight matched items.
+
+- ~helm-highlight-number-lines-around-point~ ::
+
+ #+vindex: helm-highlight-number-lines-around-point
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (15 . 15)
+ #+end_src
+
+ Number of lines around point where matched items are highlighted.
+
+ Possible value are:
+ - A cons cell (x . y)
+ Match x lines before point and y lines after point.
+ - An integer
+ Positive means this number lines after point.
+ Negative means this number lines before point.
+ A zero value means highlight only inside matched lines.
+ - The symbol never
+ Means do not highlight matched items.
+
+**** Popup
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-popup-tip-mode-hook~ ::
+
+ #+vindex: helm-popup-tip-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-popup-tip-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+- ~helm-sources-using-help-echo-popup~ ::
+
+ #+vindex: helm-sources-using-help-echo-popup
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ ("Ack-Grep" "AG" "RG" "Gid" "Git-Grep")
+ #+end_src
+
+ Show the buffer name or the filename in a popup at selection.
+
+**** minor-mode-p
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-popup-tip-mode~ ::
+
+ #+vindex: helm-popup-tip-mode
+
+ *Standard Value*: nil
+
+ (helm-popup-tip-mode &optional ARG)
+
+ Show help-echo informations in a popup tip at end of line.
+
+ If called interactively, toggle ~Helm-Popup-Tip mode~. If the
+ prefix argument is positive, enable the mode, and if it is zero
+ or negative, disable the mode.
+
+ If called from Lisp, toggle the mode if ARG is ~toggle~. Enable
+ the mode if ARG is nil, omitted, or is a positive number.
+ Disable the mode if ARG is a negative number.
+
+ The mode's hook is called both when the mode is enabled and when
+ it is disabled.
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-default-kbsize~ ::
+
+ #+vindex: helm-default-kbsize
+
+ *Standard Value*: 1024.0
+
+ Default Kbsize to use for showing files size.
+ It is a float, usually 1024.0 but could be 1000.0 on some systems.
+
+- ~helm-su-or-sudo~ ::
+
+ #+vindex: helm-su-or-sudo
+
+ *Standard Value*: sudo
+
+ What command to use for root access.
+
+*** Hooks in library =helm-utils=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-find-many-files-after-hook~ ::
+
+ #+vindex: helm-find-many-files-after-hook
+
+ *Standard Value*: nil
+
+ Hook that runs at end of ~helm-find-many-files~.
+
+- ~helm-goto-line-before-hook~ ::
+
+ #+vindex: helm-goto-line-before-hook
+
+ *Standard Value*:
+
+ #+begin_src emacs-lisp
+ (helm-save-current-pos-to-mark-ring)
+ #+end_src
+
+ Run before jumping to line.
+ This hook runs when jumping from ~helm-goto-line~, ~helm-etags-default-action~,
+ and ~helm-imenu-default-action~.
+ This allows you to retrieve a previous position after using the different helm
+ tools for searching (etags, grep, gid, (m)occur etc...).
+ By default positions are added to ~mark-ring~.
+ You can also add to register by using (or adding)
+ ~helm-save-pos-to-register-before-jump~ instead. In this case
+ last position is added to the register ~helm-save-pos-before-jump-register~.
+
+- ~helm-persistent-autoresize-hook~ ::
+
+ #+vindex: helm-persistent-autoresize-hook
+
+ *Standard Value*:
+
+- ~helm-popup-tip-mode-hook~ ::
+
+ #+vindex: helm-popup-tip-mode-hook
+
+ *Standard Value*: nil
+
+ Hook run after entering or leaving ~helm-popup-tip-mode~.
+ No problems result if this variable is not bound.
+ ~add-hook~ automatically binds it. (This is true for all hook variables.)
+
+** Library: helm-x-files
+
+*** Options in library =helm-x-files=
+
+**** uncategorized
+:PROPERTIES:
+:UNNUMBERED: notoc
+:END:
+
+- ~helm-session-fuzzy-match~ ::
+
+ #+vindex: helm-session-fuzzy-match
+
+ *Standard Value*: nil
+
+ Enable fuzzy matching in ~helm-source-session~ when non--nil.
+
+* Main Index
+:PROPERTIES:
+:INDEX: cp
+:DESCRIPTION: An index of Helm's concepts and features.
+:END:
+
+* Key Index
+:PROPERTIES:
+:DESCRIPTION: Key bindings and where they are described.
+:INDEX: ky
+:END:
+
+* Command and Function Index
+:PROPERTIES:
+:DESCRIPTION: Command names and some internal functions.
+:INDEX: fn
+:END:
+
+* Variable Index
+:PROPERTIES:
+:DESCRIPTION: Variables mentioned in the manual.
+:INDEX: vr
+:END:
+
+This is not a complete index of variables and faces, only the ones
+that are mentioned in the manual. For a more complete list, use
+{{{kbd(M-x org-customize)}}} and then click yourself through the tree.
+
+* Export Setup :noexport:
+
+#+setupfile: doc-setup.org
+#+options: H:4
+
+#+export_file_name: helm.texi
+
+#+texinfo_dir_category: Emacs Add-ons
+#+texinfo_dir_title: Helm Manual: (helm)
+#+texinfo_dir_desc: Helm Manual
+
+#+STARTUP: showeverything
+#+STARTUP: inlineimages
+#+EXCLUDE_TAGS: TOC_3
+
+# (info (org-texinfo-export-to-info))
+
+* Footnotes
+
+[fn:xxx1] [[https://github.com/jwiegley/emacs-async][emacs-async]]
+
+[fn:xxx2] [[https://github.com/auto-complete/popup-el][popup-el]]
+
+[fn:xxx3] https://github.com/raxod502/straight.el
+
+[fn:xxx4] https://github.com/emacs-helm/helm/releases
+
+[fn:xxxx45] Above steps assume that you have installed =emacs-async=
+ is in a standard location. If this is not the case, you need to tell
+ =make= program where it is available using =EMACSLOADPATH=[fn:xxx5].
+
+ #+begin_src sh
+ git clone https://github.com/emacs-helm/helm
+ cd helm
+ EMACSLOADPATH="/path/to/emacs-async:" make
+ make
+ sudo make install
+ #+end_src
+
+ If you want to install =helm= in a path other than =/usr/local/=, pass
+ that target path through a =PREFIX= variable.
+
+ # *Note*: make install will NOT work on Windows system, but you can move
+ # your helm directory to your ~load-path~ e.g. /site-lisp and run =make=
+ # there.
+
+ # *Note*: make install will NOT work on Windows system, but you can move
+ # your helm directory to your ~load-path~ e.g. /site-lisp and run =make=
+ # there.
+
+[fn:xxx5] Don't forget the final =:= to use an absolute path (like
+=/home/you/foo/bar:=) instead of an abbreviated path like
+(=~/foo/bar:=), specify =EMACSLOADPATH=.
+
+[fn:xxx6] https://melpa.org
+
+[fn:xxx7] Helm uses async package to compile itself from Melpa. Ensure
+that ~async-bytecomp-package-mode~ is enabled by default. If this
+isn't so, add helm to ~async-bytecomp-allowed-packages~.
+
+[fn:xxx8] https://raw.githubusercontent.com/thierryvolpiatto/emacs-config/main/init-helm.el
+
+[fn:xxx9] [[https://github.com/emacs-helm/helm/issues/495][Different way of invoking commands]]
+
+[fn:xxx10] [[https://groups.google.com/g/emacs-helm/c/zaBbg2tFAuM][Finding files]]
+
+[fn:xxx11] [[https://github.com/emacs-helm/helm/issues/222][Lack of tab completion]]
+
+[fn:xxx12][[https://github.com/emacs-helm/helm-ls-git][ helm-ls-git]]
+
+[fn:xxx13] [[https://github.com/emacs-helm/helm-ls-hg][helm-ls-hg]]
+
+[fn:xxx14][[http://melpa.org/#/helm][ MELPA]]
+
+[fn:xxx15] [[http://stable.melpa.org/#/helm][MELPA Stable]]
+
+[fn:xxx16] https://github.com/emacs-helm/helm/tags
+
+[fn:xxx17] [[http://melpa.org/#/helm][Melpa ]]
+
+[fn:xxx18] helm-core have a new macro foo and helm use now
+this macro, ~list-packages~ will try to install and compile first helm
+and then helm-core resulting in an error like =void function foo...=.
+
+# These footnotes are from `helm-manual.org'
+
+[fn:1] Behavior may change depending context in some source e.g. ~helm-find-files~.
+
+[fn:2] Delete from point to end or all depending on the value of
+~helm-delete-minibuffer-contents-from-point~.
+
+[fn:3] https://github.com/coldnew/linum-relative
+
+[fn:4] Note that the key bindings are always available even if line
+numbers are not displayed. They are just useless in this case. \ No newline at end of file
diff --git a/doc/ox-texinfo+.el b/doc/ox-texinfo+.el
new file mode 100644
index 00000000..c8f4f6d4
--- /dev/null
+++ b/doc/ox-texinfo+.el
@@ -0,0 +1,20 @@
+(require 'ox-texinfo)
+
+(defun org-texinfo-keyword+ (keyword contents info)
+ (let* ((v (org-element-property :value keyword))
+ (k (org-element-property :key keyword))
+ (c (org-texinfo-keyword keyword contents info)))
+ (if c c
+ (when (string-match "\\(?:\\`\\(?1:.+\\)INDEX\\'\\)" k)
+ (format "@%sindex %s" (downcase (match-string 1 k)) v)))))
+
+(defun org-texinfo-export-to-texinfo+ ()
+ (interactive)
+ (let ((outfile (org-export-output-file-name ".texi"))
+ (org-export-coding-system org-texinfo-coding-system))
+ (org-export-to-file 'my-texinfo outfile)))
+
+(org-export-define-derived-backend 'my-texinfo 'texinfo
+ :translate-alist '((keyword . org-texinfo-keyword+)))
+
+(provide 'ox-texinfo+)
diff --git a/emacs-helm.sh b/emacs-helm.sh
index 51206585..c6514abd 100755
--- a/emacs-helm.sh
+++ b/emacs-helm.sh
@@ -1,7 +1,7 @@
#!/usr/bin/env sh
-## Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+## Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
diff --git a/helm-adaptive.el b/helm-adaptive.el
index 56383a3c..b3a272da 100644
--- a/helm-adaptive.el
+++ b/helm-adaptive.el
@@ -3,7 +3,7 @@
;; Original Author: Tamas Patrovics
;; Copyright (C) 2007 Tamas Patrovics
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -271,10 +271,4 @@ atoms."
(provide 'helm-adaptive)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-adaptive.el ends here
diff --git a/helm-bookmark.el b/helm-bookmark.el
index 6954f256..aae92d22 100644
--- a/helm-bookmark.el
+++ b/helm-bookmark.el
@@ -1,6 +1,6 @@
;;; helm-bookmark.el --- Helm for Emacs regular Bookmarks. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -159,7 +159,7 @@
"Toggle bookmark location visibility."
(interactive)
(with-helm-alive-p
- (helm-attrset 'toggle-filename
+ (helm-set-attr 'toggle-filename
'(helm-bookmark-toggle-filename-1 . never-split))
(helm-execute-persistent-action 'toggle-filename)))
(put 'helm-bookmark-toggle-filename 'helm-only t)
@@ -464,9 +464,9 @@ If `browse-url-browser-function' is set to something else than
(defclass helm-bookmark-override-inheritor (helm-source) ())
-(defmethod helm--setup-source ((source helm-bookmark-override-inheritor))
+(cl-defmethod helm--setup-source ((source helm-bookmark-override-inheritor))
;; Ensure `helm-source-in-buffer' method is called.
- (call-next-method)
+ (cl-call-next-method)
(setf (slot-value source 'action)
(helm-append-at-nth
(cl-loop for (name . action) in helm-type-bookmark-actions
@@ -737,10 +737,4 @@ if external addressbook-bookmark package is installed."
(provide 'helm-bookmark)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-bookmark.el ends here
diff --git a/helm-buffers.el b/helm-buffers.el
index 0467cf4d..ad5443a8 100644
--- a/helm-buffers.el
+++ b/helm-buffers.el
@@ -1,6 +1,6 @@
;;; helm-buffers.el --- helm support for buffers. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -29,6 +29,8 @@
(declare-function helm-comp-read "helm-mode")
(declare-function helm-browse-project "helm-files")
+(defvar dired-buffers)
+
(defgroup helm-buffers nil
"Buffers related Applications and libraries for Helm."
@@ -178,6 +180,12 @@ you want to keep the recentest order when narrowing candidates."
"Face used for modified buffers."
:group 'helm-buffers-faces)
+(defface helm-no-file-buffer-modified
+ `((t ,@(and (>= emacs-major-version 27) '(:extend t))
+ :foreground "orange" :background "black"))
+ "Face used for modified buffers."
+ :group 'helm-buffers-faces)
+
(defface helm-buffer-size
`((((background dark))
,@(and (>= emacs-major-version 27) '(:extend t))
@@ -227,6 +235,8 @@ their buffers like this:
(setq helm-buffers-tick-counter (buffer-modified-tick))
+See bug#1917.
+
Note that this variable is buffer-local.")
(make-variable-buffer-local 'helm-buffers-tick-counter)
@@ -273,21 +283,21 @@ Note that this variable is buffer-local.")
(defun helm-buffers-list--init ()
(require 'dired)
- ;; Issue #51 Create the list before `helm-buffer' creation.
+ ;; Bug#51 Create the list before `helm-buffer' creation.
;; We were using a global cache in the past and 'candidates was
;; bound to this cache, this was a problem when using more than one
;; source with a different 'buffer-list fn as the same cache was
- ;; reused in each source (issue #1907), now 'candidates attr is set
+ ;; reused in each source (Bug#1907), now 'candidates attr is set
;; directly so that each list of candidates is local to source.
- (helm-attrset 'candidates (funcall (helm-attr 'buffer-list)))
+ (helm-set-attr 'candidates (funcall (helm-get-attr 'buffer-list)))
(let ((result (cl-loop with allbufs = (memq 'helm-shadow-boring-buffers
(helm-attr
'filtered-candidate-transformer
helm-source-buffers-list))
for b in (if allbufs
- (helm-attr 'candidates)
+ (helm-get-attr 'candidates)
(helm-skip-boring-buffers
- (helm-attr 'candidates)
+ (helm-get-attr 'candidates)
helm-source-buffers-list))
maximize (length b) into len-buf
maximize (length (helm-buffer--format-mode-name b))
@@ -497,13 +507,13 @@ The list is reordered with `helm-buffer-list-reorder-fn'."
(helm-buffer--show-details
name name-prefix file-name size mode dir
'helm-buffer-file 'helm-buffer-process nil details 'filebuf))
- ;; A non-file, modified buffer
+ ;; A non-file, modified buffer See bug#1917
((with-current-buffer name
(and helm-buffers-tick-counter
(/= helm-buffers-tick-counter (buffer-modified-tick))))
(helm-buffer--show-details
name (and proc name-prefix) dir size mode dir
- 'helm-buffer-modified 'helm-buffer-process proc details 'nofile-mod))
+ 'helm-no-file-buffer-modified 'helm-buffer-process proc details 'nofile-mod))
;; Any non--file buffer.=>italic
(t
(helm-buffer--show-details
@@ -579,11 +589,11 @@ buffers)."
(let* ((buf (helm-get-selection))
(preselect (helm-buffer--get-preselection buf)))
(setq helm-buffer-details-flag (not helm-buffer-details-flag))
- (helm-update (lambda ()
- (helm-awhile (re-search-forward preselect nil t)
- (helm-mark-current-line)
- (when (equal buf (helm-get-selection))
- (cl-return t))))))))
+ (helm-force-update (lambda ()
+ (helm-awhile (re-search-forward preselect nil t)
+ (helm-mark-current-line)
+ (when (equal buf (helm-get-selection))
+ (cl-return t))))))))
(put 'helm-toggle-buffers-details 'helm-only t)
(defun helm-buffers--pattern-sans-filters (&optional separator)
@@ -625,7 +635,8 @@ buffers)."
(helm-mark-current-line)
(helm-display-mode-line src t)
(when helm-marked-candidates
- (message "%s candidates marked" (length helm-marked-candidates))))))
+ (message "%s candidates marked" (length helm-marked-candidates))
+ (set-window-margins (selected-window) 1)))))
(defun helm-buffers-mark-similar-buffers ()
"Mark All buffers that have same property `type' than current.
@@ -791,7 +802,7 @@ If REGEXP-FLAG is given use `query-replace-regexp'."
"Toggle diff buffer without quitting helm."
(interactive)
(with-helm-alive-p
- (helm-attrset 'diff-action 'helm-buffer-toggle-diff)
+ (helm-set-attr 'diff-action 'helm-buffer-toggle-diff)
(helm-execute-persistent-action 'diff-action)))
(put 'helm-buffer-diff-persistent 'helm-only t)
@@ -810,13 +821,13 @@ If REGEXP-FLAG is given use `query-replace-regexp'."
(helm-get-selection))))
(cl-loop for buf in marked do (helm-revert-buffer buf))
(when helm-marked-candidates (helm-unmark-all))
- (helm-update preselect))))
+ (helm-force-update preselect))))
(defun helm-buffer-revert-persistent ()
"Revert buffer without quitting helm."
(interactive)
(with-helm-alive-p
- (helm-attrset 'revert-action '(helm-buffer-revert-and-update . never-split))
+ (helm-set-attr 'revert-action '(helm-buffer-revert-and-update . never-split))
(helm-execute-persistent-action 'revert-action)))
(put 'helm-buffer-revert-persistent 'helm-only t)
@@ -830,7 +841,7 @@ If REGEXP-FLAG is given use `query-replace-regexp'."
(with-current-buffer (get-buffer buf)
(when (buffer-file-name) (save-buffer))))
(when helm-marked-candidates (helm-unmark-all))
- (helm-update (regexp-quote preselect)))))
+ (helm-force-update (regexp-quote preselect)))))
(defun helm-buffer-save-some-buffers (_candidate)
(helm-buffers-mark-similar-buffers-1 'mod)
@@ -840,7 +851,7 @@ If REGEXP-FLAG is given use `query-replace-regexp'."
"Save unsaved file buffers without quitting Helm."
(interactive)
(with-helm-alive-p
- (helm-attrset 'save-some-action '(helm-buffer-save-some-buffers . never-split))
+ (helm-set-attr 'save-some-action '(helm-buffer-save-some-buffers . never-split))
(helm-execute-persistent-action 'save-some-action)))
(put 'helm-buffer-run-save-some-buffers 'helm-only t)
@@ -848,7 +859,7 @@ If REGEXP-FLAG is given use `query-replace-regexp'."
"Save buffer without quitting Helm."
(interactive)
(with-helm-alive-p
- (helm-attrset 'save-action '(helm-buffer-save-and-update . never-split))
+ (helm-set-attr 'save-action '(helm-buffer-save-and-update . never-split))
(helm-execute-persistent-action 'save-action)))
(put 'helm-buffer-save-persistent 'helm-only t)
@@ -883,7 +894,7 @@ If REGEXP-FLAG is given use `query-replace-regexp'."
"Kill buffer without quitting Helm."
(interactive)
(with-helm-alive-p
- (helm-attrset 'kill-action '(helm-buffers-persistent-kill . never-split))
+ (helm-set-attr 'kill-action '(helm-buffers-persistent-kill . never-split))
(helm-execute-persistent-action 'kill-action)))
(put 'helm-buffer-run-kill-persistent 'helm-only t)
@@ -945,12 +956,18 @@ If REGEXP-FLAG is given use `query-replace-regexp'."
(helm-exit-and-execute-action 'switch-to-buffer-other-frame)))
(put 'helm-buffer-switch-other-frame 'helm-only t)
+(defun helm-buffers-switch-to-buffer-other-tab (_candidate)
+ (when (fboundp 'switch-to-buffer-other-tab)
+ (let ((bufs (helm-marked-candidates)))
+ (cl-loop for buf in bufs
+ do (switch-to-buffer-other-tab buf)))))
+
(defun helm-buffers-switch-to-buffer-new-tab ()
"Run switch to buffer in other tab action from `helm-source-buffers-list'."
(interactive)
(cl-assert (fboundp 'tab-bar-mode) nil "Tab-bar-mode not available")
(with-helm-alive-p
- (helm-exit-and-execute-action 'switch-to-buffer-other-tab)))
+ (helm-exit-and-execute-action 'helm-buffers-switch-to-buffer-other-tab)))
(put 'helm-buffers-switch-to-buffer-new-tab 'helm-only t)
(defun helm-buffer-switch-buffers (_candidate)
@@ -1095,15 +1112,15 @@ Can be used by any source that list buffers."
(defun helm-buffers-toggle-show-hidden-buffers ()
(interactive)
(with-helm-alive-p
- (let ((filter-attrs (helm-attr 'filtered-candidate-transformer
+ (let ((filter-attrs (helm-get-attr 'filtered-candidate-transformer
helm-source-buffers-list)))
(if (memq 'helm-shadow-boring-buffers filter-attrs)
- (helm-attrset 'filtered-candidate-transformer
+ (helm-set-attr 'filtered-candidate-transformer
(cons 'helm-skip-boring-buffers
(remove 'helm-shadow-boring-buffers
filter-attrs))
helm-source-buffers-list)
- (helm-attrset 'filtered-candidate-transformer
+ (helm-set-attr 'filtered-candidate-transformer
(cons 'helm-shadow-boring-buffers
(remove 'helm-skip-boring-buffers
filter-attrs))
@@ -1176,10 +1193,4 @@ displayed with the `file-name-shadow' face if available."
(provide 'helm-buffers)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-buffers.el ends here
diff --git a/helm-color.el b/helm-color.el
index aee871dd..5e91e64d 100644
--- a/helm-color.el
+++ b/helm-color.el
@@ -1,6 +1,6 @@
;;; helm-color.el --- colors and faces -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -21,6 +21,8 @@
(require 'helm-help)
(require 'helm-elisp)
+(declare-function list-colors-display "facemenu")
+
;;; Customize Face
;;
;;
@@ -59,6 +61,7 @@
;;
;;
(defun helm-colors-init ()
+ (require 'facemenu)
(unless (helm-candidate-buffer)
(save-selected-window
(list-colors-display)
@@ -161,10 +164,4 @@
(provide 'helm-color)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-color.el ends here
diff --git a/helm-comint.el b/helm-comint.el
index 7e7f10b2..6f85249b 100644
--- a/helm-comint.el
+++ b/helm-comint.el
@@ -1,6 +1,6 @@
;;; helm-comint.el --- Comint prompt navigation for helm. -*- lexical-binding: t -*-
-;; Copyright (C) 2019 Pierre Neidhardt <mail@ambrevar.xyz>
+;; Copyright (C) 2020 Pierre Neidhardt <mail@ambrevar.xyz>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -227,10 +227,4 @@ See `helm-comint-prompts-list'."
(provide 'helm-comint)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-comint.el ends here
diff --git a/helm-command.el b/helm-command.el
index 9ed4590a..c500779f 100644
--- a/helm-command.el
+++ b/helm-command.el
@@ -1,6 +1,6 @@
;;; helm-command.el --- Helm execute-exended-command. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -38,6 +38,10 @@
:group 'helm-command
:type 'boolean)
+(defcustom helm-M-x-fuzzy-match t
+ "Helm-M-x fuzzy matching when non nil."
+ :group 'helm-command
+ :type 'boolean)
;;; Faces
;;
@@ -111,25 +115,25 @@ algorithm."
for cand in candidates
for local-key = (car (rassq cand local-map))
for key = (substitute-command-keys (format "\\[%s]" cand))
- for sym = (intern cand)
+ for sym = (intern (if (consp cand) (car cand) cand))
for disp = (if (or (eq sym major-mode)
(and (memq sym minor-mode-list)
(boundp sym)
(buffer-local-value sym helm-current-buffer)))
(propertize cand 'face 'helm-command-active-mode)
cand)
- unless (get (intern (if (consp cand) (car cand) cand)) 'helm-only)
+ unless (or (get sym 'helm-only) (get sym 'no-helm-mx))
collect
(cons (cond ((and (string-match "^M-x" key) local-key)
- (format "%s (%s)"
+ (format "%s %s"
disp (propertize
- local-key
- 'face 'helm-M-x-key)))
+ " " 'display
+ (propertize local-key 'face 'helm-M-x-key))))
((string-match "^M-x" key) disp)
- (t (format "%s (%s)"
+ (t (format "%s %s"
disp (propertize
- key
- 'face 'helm-M-x-key))))
+ " " 'display
+ (propertize key 'face 'helm-M-x-key)))))
cand)
into ls
finally return
@@ -200,9 +204,8 @@ algorithm."
(remove-hook 'helm-move-selection-after-hook
'helm-M-x--move-selection-after-hook))
-(defclass helm-M-x-class (helm-source-sync helm-type-command)
- ((match-dynamic :initform t)
- (requires-pattern :initform 0)
+(defclass helm-M-x-class (helm-source-in-buffer helm-type-command)
+ ((requires-pattern :initform 0)
(must-match :initform t)
(filtered-candidate-transformer :initform 'helm-M-x-transformer-no-sort)
(persistent-help :initform "Describe this command")
@@ -213,9 +216,9 @@ algorithm."
(defun helm-M-x-read-extended-command (collection &optional predicate history)
"Read or execute action on command name in COLLECTION or HISTORY.
-When `helm-M-x-use-completion-styles' is used, several actions as
-of `helm-type-command' are used and executed from here, otherwise
-this function returns the command as a symbol.
+When `helm-M-x-use-completion-styles' is used, Emacs
+`completion-styles' mechanism is used, otherwise standard helm
+completion and helm fuzzy matching are used together.
Helm completion is not provided when executing or defining kbd
macros.
@@ -225,23 +228,29 @@ suitable for `try-completion'. Arg PREDICATE is a function that
default to `commandp' see also `try-completion'. Arg HISTORY
default to `extended-command-history'."
(let* ((helm--mode-line-display-prefarg t)
- (minibuffer-completion-confirm t)
(pred (or predicate #'commandp))
- (metadata (unless (assq 'flex completion-styles-alist)
- '(metadata (display-sort-function
- .
- (lambda (candidates)
- (sort candidates #'helm-generic-sort-fn))))))
+ (helm-fuzzy-sort-fn (lambda (candidates _source)
+ ;; Sort on real candidate otherwise
+ ;; "symbol (<binding>)" is used when sorting.
+ (helm-fuzzy-matching-default-sort-fn-1 candidates t)))
(sources `(,(helm-make-source "Emacs Commands history" 'helm-M-x-class
- :candidates (helm-dynamic-completion
- ;; A list of strings.
- (or history extended-command-history)
- (lambda (str) (funcall pred (intern-soft str)))
- nil 'nosort t))
+ :data (lambda ()
+ (helm-comp-read-get-candidates
+ ;; History should be quoted to
+ ;; force `helm-comp-read-get-candidates'
+ ;; to use predicate against
+ ;; symbol and not string.
+ (or history 'extended-command-history)
+ ;; Ensure using empty string to
+ ;; not defeat helm matching fns [1]
+ pred nil nil ""))
+ :fuzzy-match helm-M-x-fuzzy-match)
,(helm-make-source "Emacs Commands" 'helm-M-x-class
- :candidates (helm-dynamic-completion
- collection pred
- nil metadata t))))
+ :data (lambda ()
+ (helm-comp-read-get-candidates
+ ;; [1] Same comment as above.
+ collection pred nil nil ""))
+ :fuzzy-match helm-M-x-fuzzy-match)))
(prompt (concat (cond
((eq helm-M-x-prefix-argument '-) "- ")
((and (consp helm-M-x-prefix-argument)
@@ -253,7 +262,7 @@ default to `extended-command-history'."
(format "%d " helm-M-x-prefix-argument)))
"M-x ")))
(setq helm-M-x--timer (run-at-time 1 0.1 'helm-M-x--notify-prefix-arg))
- ;; Fix Issue #2250, add `helm-move-selection-after-hook' which
+ ;; Fix Bug#2250, add `helm-move-selection-after-hook' which
;; reset prefix arg to nil only for this helm session.
(add-hook 'helm-move-selection-after-hook
'helm-M-x--move-selection-after-hook)
@@ -301,7 +310,7 @@ Save COMMAND to `extended-command-history'."
(when command
;; Avoid having `this-command' set to *exit-minibuffer.
(setq this-command command
- ;; Handle C-x z (repeat) Issue #322
+ ;; Handle C-x z (repeat) Bug#322
real-this-command command)
;; If helm-M-x is called with regular emacs completion (kmacro)
;; use the value of arg otherwise use helm-current-prefix-arg.
@@ -351,10 +360,4 @@ You can get help on each command by persistent action."
(provide 'helm-command)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-command.el ends here
diff --git a/helm-config.el b/helm-config.el
index 27b02e83..d9343b6b 100644
--- a/helm-config.el
+++ b/helm-config.el
@@ -1,6 +1,6 @@
;;; helm-config.el --- Applications library for `helm.el' -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -31,10 +31,4 @@
(provide 'helm-config)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-config.el ends here
diff --git a/helm-core-pkg.el b/helm-core-pkg.el
index 404bcfa4..698758ee 100644
--- a/helm-core-pkg.el
+++ b/helm-core-pkg.el
@@ -1,6 +1,6 @@
;;; helm-core-pkg.el --- define helm-core for package.el
-(define-package "helm-core" "3.6.5"
+(define-package "helm-core" "3.8.0"
"Development files for Helm"
'((emacs "25.1")
(async "1.9.4"))
diff --git a/helm-dabbrev.el b/helm-dabbrev.el
index 07096333..4cd36c89 100644
--- a/helm-dabbrev.el
+++ b/helm-dabbrev.el
@@ -1,6 +1,6 @@
;;; helm-dabbrev.el --- Helm implementation of dabbrev. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -393,10 +393,4 @@ finally removed."
(provide 'helm-dabbrev)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-dabbrev.el ends here
diff --git a/helm-easymenu.el b/helm-easymenu.el
index f0b26c32..41565559 100644
--- a/helm-easymenu.el
+++ b/helm-easymenu.el
@@ -1,6 +1,6 @@
;;; helm-easymenu.el --- Helm easymenu definitions. -*- lexical-binding: t -*-
-;; Copyright (C) 2015 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2015 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -82,10 +82,4 @@
(provide 'helm-easymenu)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-easymenu.el ends here
diff --git a/helm-elisp-package.el b/helm-elisp-package.el
index 07001079..c1237461 100644
--- a/helm-elisp-package.el
+++ b/helm-elisp-package.el
@@ -1,6 +1,6 @@
;;; helm-elisp-package.el --- helm interface for package.el -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
diff --git a/helm-elisp.el b/helm-elisp.el
index ce7e8844..7bcf5f77 100644
--- a/helm-elisp.el
+++ b/helm-elisp.el
@@ -1,6 +1,6 @@
;;; helm-elisp.el --- Elisp symbols completion for helm. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -397,7 +397,7 @@ the same time to variable and a function."
for annot = (cl-typecase sym
(command " (Com)")
(class " (Class)")
- (generic " (Gen)")
+ (cl-generic " (Gen)")
(fbound " (Fun)")
(bound " (Var)")
(face " (Face)"))
@@ -625,6 +625,7 @@ double quote."
:fuzzy-match helm-apropos-fuzzy-match
:filtered-candidate-transformer (and (null helm-apropos-fuzzy-match)
'helm-apropos-default-sort-fn)
+ :display-to-real 'helm-symbolify
:nomark t
:persistent-action (lambda (candidate)
(helm-elisp--persistent-help
@@ -638,12 +639,13 @@ double quote."
(helm-apropos-init (lambda (x)
(and (fboundp x)
(not (commandp x))
- (not (generic-p x))
+ (not (cl-generic-p x))
(not (class-p x))))
default))
:fuzzy-match helm-apropos-fuzzy-match
:filtered-candidate-transformer (and (null helm-apropos-fuzzy-match)
'helm-apropos-default-sort-fn)
+ :display-to-real 'helm-symbolify
:persistent-action (lambda (candidate)
(helm-elisp--persistent-help
candidate 'helm-describe-function))
@@ -673,7 +675,7 @@ double quote."
(helm-build-in-buffer-source "Generic functions"
:init (lambda ()
(helm-apropos-init (lambda (x)
- (generic-p x))
+ (cl-generic-p x))
default))
:fuzzy-match helm-apropos-fuzzy-match
:filtered-candidate-transformer (and (null helm-apropos-fuzzy-match)
@@ -693,7 +695,7 @@ double quote."
(cond ((class-p sym)
(setq fn #'helm-describe-function
src-name "Describe class"))
- ((generic-p sym)
+ ((cl-generic-p sym)
(setq fn #'helm-describe-function
src-name "Describe generic function"))
((fboundp sym)
@@ -968,10 +970,4 @@ a string, i.e. the `symbol-name' of any existing symbol."
(provide 'helm-elisp)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-elisp.el ends here
diff --git a/helm-epa.el b/helm-epa.el
new file mode 100644
index 00000000..69ec62dd
--- /dev/null
+++ b/helm-epa.el
@@ -0,0 +1,254 @@
+;;; helm-epa.el --- helm interface for epa/epg
+
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thievol@posteo.net>
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+;;; Code:
+
+(require 'helm)
+
+(eval-when-compile (require 'epg))
+(defvar epa-protocol)
+(defvar epa-last-coding-system-specified)
+(defvar epg-key-validity-alist)
+(defvar mail-header-separator)
+(declare-function epg-list-keys "epg")
+(declare-function epg-make-context "epg")
+(declare-function epg-key-sub-key-list "epg")
+(declare-function epg-sub-key-id "epg")
+(declare-function epg-key-user-id-list "epg")
+(declare-function epg-user-id-string "epg")
+(declare-function epg-user-id-validity "epg")
+(declare-function epa-sign-region "epa")
+(declare-function epa--read-signature-type "epa")
+(declare-function epa-display-error "epa")
+(declare-function epg-export-keys-to-string "epg")
+(declare-function epg-context-armor "epg")
+(declare-function epg-context-set-armor "epg")
+(declare-function epg-delete-keys "epg")
+(declare-function helm-read-file-name "helm-mode")
+
+(defvar helm-epa--list-only-secrets nil
+ "[INTERNAL] Used to pass MODE argument to `epg-list-keys'.")
+
+(defcustom helm-epa-actions '(("Show key" . epa--show-key)
+ ("encrypt file with key" . helm-epa-encrypt-file)
+ ("Copy keys to kill ring" . helm-epa-kill-keys-armor)
+ ("Delete keys" . helm-epa-delete-keys))
+ "Actions for `helm-epa-list-keys'."
+ :type '(alist :key-type string :value-type symbol)
+ :group 'helm-misc)
+
+(defclass helm-epa (helm-source-sync)
+ ((init :initform (lambda ()
+ (require 'epg)
+ (require 'epa)))
+ (candidates :initform 'helm-epa-get-key-list)
+ (keymap :initform helm-comp-read-map)
+ (mode-line :initform helm-comp-read-mode-line))
+ "Allow building helm sources for GPG keys.")
+
+(defun helm-epa-get-key-list (&optional keys)
+ "Build candidate list for `helm-epa-list-keys'."
+ (cl-loop with all-keys = (or keys (epg-list-keys (epg-make-context epa-protocol)
+ nil helm-epa--list-only-secrets))
+ for key in all-keys
+ for sublist = (car (epg-key-sub-key-list key))
+ for subkey-id = (epg-sub-key-id sublist)
+ for uid-list = (epg-key-user-id-list key)
+ for uid = (epg-user-id-string (car uid-list))
+ for validity = (epg-user-id-validity (car uid-list))
+ collect (cons (format " %s %s %s"
+ (helm-aif (rassq validity epg-key-validity-alist)
+ (string (car it))
+ "?")
+ (propertize
+ subkey-id
+ 'face (cl-case validity
+ (none 'epa-validity-medium)
+ ((revoked expired)
+ 'epa-validity-disabled)
+ (t 'epa-validity-high)))
+ (propertize
+ uid 'face 'font-lock-warning-face))
+ key)))
+
+(defun helm-epa--select-keys (prompt keys)
+ "A helm replacement for `epa--select-keys'."
+ (let ((result (helm :sources (helm-make-source "Epa select keys" 'helm-epa
+ :candidates (lambda ()
+ (helm-epa-get-key-list keys)))
+ :prompt (and prompt (helm-epa--format-prompt prompt))
+ :buffer "*helm epa*")))
+ (unless (equal result "")
+ result)))
+
+(defun helm-epa--format-prompt (prompt)
+ (let ((split (split-string prompt "\n")))
+ (if (cdr split)
+ (format "%s\n(%s): "
+ (replace-regexp-in-string "\\.[\t ]*\\'" "" (car split))
+ (replace-regexp-in-string "\\.[\t ]*\\'" "" (cadr split)))
+ (format "%s: " (replace-regexp-in-string "\\.[\t ]*\\'" "" (car split))))))
+
+(defun helm-epa--read-signature-type ()
+ "A helm replacement for `epa--read-signature-type'."
+ (let ((answer (helm-read-answer "Signature type:
+(n - Create a normal signature)
+(c - Create a cleartext signature)
+(d - Create a detached signature)"
+ '("n" "c" "d"))))
+ (helm-acase answer
+ ("n" 'normal)
+ ("c" 'clear)
+ ("d" 'detached))))
+
+(defun helm-epa-collect-keys-from-candidates (candidates)
+ (cl-loop for c in candidates
+ collect (epg-sub-key-id
+ (car (epg-key-sub-key-list c)))))
+
+(defun helm-epa-collect-id-from-candidates (candidates)
+ (cl-loop for c in candidates
+ collect (epg-user-id-string
+ (car (epg-key-user-id-list c)))))
+
+(defun helm-epa-success-message (str keys ids)
+ (message str
+ (mapconcat (lambda (pair)
+ (concat (car pair) " " (cdr pair)))
+ (cl-loop for k in keys
+ for i in ids
+ collect (cons k i))
+ "\n")))
+
+;;;###autoload
+(define-minor-mode helm-epa-mode
+ "Enable helm completion on gpg keys in epa functions."
+ :group 'helm-misc
+ :global t
+ (require 'epa)
+ (if helm-epa-mode
+ (progn
+ (advice-add 'epa--select-keys :override #'helm-epa--select-keys)
+ (advice-add 'epa--read-signature-type :override #'helm-epa--read-signature-type))
+ (advice-remove 'epa-select-keys #'helm-epa--select-keys)
+ (advice-remove 'epa--read-signature-type #'helm-epa--read-signature-type)))
+
+(defun helm-epa-action-transformer (actions _candidate)
+ "Helm epa action transformer function."
+ (cond ((with-helm-current-buffer
+ (derived-mode-p 'message-mode 'mail-mode))
+ (helm-append-at-nth
+ actions '(("Sign mail with key" . helm-epa-mail-sign)
+ ("Encrypt mail with key" . helm-epa-mail-encrypt))
+ 3))
+ (t actions)))
+
+(defun helm-epa-delete-keys (_candidate)
+ "Delete gpg marked keys from helm-epa."
+ (let ((context (epg-make-context epa-protocol))
+ (keys (helm-marked-candidates)))
+ (message "Deleting gpg keys..")
+ (condition-case error
+ (epg-delete-keys context keys)
+ (error
+ (epa-display-error context)
+ (signal (car error) (cdr error))))
+ (message "Deleting gpg keys done")))
+
+(defun helm-epa-encrypt-file (candidate)
+ "Select a file to encrypt with key CANDIDATE."
+ (let* ((file (helm-read-file-name "Encrypt file: "))
+ (cands (helm-marked-candidates))
+ (keys (helm-epa-collect-keys-from-candidates cands))
+ (ids (helm-epa-collect-id-from-candidates cands)))
+ (epa-encrypt-file file cands)
+ (helm-epa-success-message "File encrypted with key(s):\n %s"
+ keys ids)))
+
+(defun helm-epa-kill-keys-armor (_candidate)
+ "Copy marked keys to kill ring."
+ (let ((keys (helm-marked-candidates))
+ (context (epg-make-context epa-protocol)))
+ (with-no-warnings
+ (setf (epg-context-armor context) t))
+ (condition-case error
+ (kill-new (epg-export-keys-to-string context keys))
+ (error
+ (epa-display-error context)
+ (signal (car error) (cdr error))))))
+
+(defun helm-epa-mail-sign (candidate)
+ "Sign email with key CANDIDATE."
+ (let ((key (epg-sub-key-id (car (epg-key-sub-key-list candidate))))
+ (id (epg-user-id-string (car (epg-key-user-id-list candidate))))
+ start end mode)
+ (save-excursion
+ (goto-char (point-min))
+ (if (search-forward mail-header-separator nil t)
+ (forward-line))
+ (setq epa-last-coding-system-specified
+ (or coding-system-for-write
+ (select-safe-coding-system (point) (point-max))))
+ (let ((verbose current-prefix-arg))
+ (setq start (point)
+ end (point-max)
+ mode (if verbose
+ (epa--read-signature-type)
+ 'clear))))
+ ;; TODO Make non-interactive functions to replace epa-sign-region
+ ;; and epa-encrypt-region and inline them.
+ (with-no-warnings
+ (epa-sign-region start end candidate mode))
+ (message "Mail signed with key `%s %s'" key id)))
+
+(defun helm-epa-mail-encrypt (candidate)
+ "Encrypt email with key CANDIDATE."
+ (let ((cands (helm-marked-candidates))
+ start end)
+ (save-excursion
+ (goto-char (point-min))
+ (when (search-forward mail-header-separator nil t)
+ (forward-line))
+ (setq start (point)
+ end (point-max))
+ (setq epa-last-coding-system-specified
+ (or coding-system-for-write
+ (select-safe-coding-system start end))))
+ ;; Don't let some read-only text stop us from encrypting.
+ (let ((inhibit-read-only t)
+ (keys (helm-epa-collect-keys-from-candidates cands))
+ (ids (helm-epa-collect-id-from-candidates cands)))
+ (with-no-warnings
+ (epa-encrypt-region start end cands nil nil))
+ (helm-epa-success-message "Mail encrypted with key(s):\n %s"
+ keys ids))))
+
+;;;###autoload
+(defun helm-epa-list-keys ()
+ "List all gpg keys.
+This is the helm interface for `epa-list-keys'."
+ (interactive)
+ (helm :sources
+ (helm-make-source "Epg list keys" 'helm-epa
+ :action-transformer 'helm-epa-action-transformer
+ :action 'helm-epa-actions)
+ :buffer "*helm epg list keys*"))
+
+(provide 'helm-epa)
+
+;;; helm-epa.el ends here
diff --git a/helm-eshell.el b/helm-eshell.el
index 6c4e9756..359f5f50 100644
--- a/helm-eshell.el
+++ b/helm-eshell.el
@@ -1,6 +1,6 @@
;;; helm-eshell.el --- pcomplete and eshell completion for helm. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -92,7 +92,7 @@ at point."
(lambda (x)
(cond ((string-match "\\`~/" helm-ec-target)
;; Strip out the first escape char added by
- ;; `comint-quote-filename' before "~" (Issue #1803).
+ ;; `comint-quote-filename' before "~" (Bug#1803).
(substring (comint-quote-filename (abbreviate-file-name x)) 1))
((string-match "\\`/" helm-ec-target)
(comint-quote-filename x))
@@ -154,15 +154,18 @@ at point."
with comps = (all-completions pcomplete-stub table)
unless comps return (prog1 nil
;; Don't add final space when
- ;; there is no completion (issue #1990).
+ ;; there is no completion (Bug#1990).
(setq helm-eshell--quit-flag t)
(message "No completions of %s" pcomplete-stub))
for i in comps
- ;; Transform the related names to abs names.
+ ;; Transform the relative names to abs names.
for file-cand = (and exp-entry
(if (file-remote-p i) i
(expand-file-name
- i (file-name-directory entry))))
+ i (file-name-directory
+ (if (directory-name-p pcomplete-stub)
+ entry
+ (directory-file-name entry))))))
;; Compare them to avoid dups.
for file-entry-p = (and (stringp exp-entry)
(stringp file-cand)
@@ -204,7 +207,11 @@ at point."
(lambda ()
(with-helm-current-buffer
(cl-loop for c from 0 to (ring-length eshell-history-ring)
- collect (eshell-get-history c)))))
+ for elm = (eshell-get-history c)
+ unless (and (member elm lst)
+ eshell-hist-ignoredups)
+ collect elm into lst
+ finally return lst))))
(nomark :initform t)
(multiline :initform t)
(keymap :initform helm-eshell-history-map)
@@ -219,7 +226,7 @@ at point."
(if (and (stringp last)
(not (string= last ""))
(not users-comp)
- ;; Fix completion on "../" see #1832.
+ ;; Fix completion on "../" see Bug#1832.
(or (file-exists-p last)
(helm-aand
(file-name-directory last)
@@ -318,7 +325,7 @@ at point."
;; global to pass it to `helm-quit-hook', this
;; space is added when point is just after
;; previous completion and there is no
- ;; more completion, see issue #1832.
+ ;; more completion, see Bug#1832.
(unless (or helm-eshell--quit-flag
(looking-back "/\\'" (1- (point))))
(prog1 t (insert " ")))
@@ -492,10 +499,4 @@ See `helm-eshell-prompts-list'."
(provide 'helm-eshell)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-eshell ends here
diff --git a/helm-eval.el b/helm-eval.el
index 382c663f..8b07d65f 100644
--- a/helm-eval.el
+++ b/helm-eval.el
@@ -1,6 +1,6 @@
;;; helm-eval.el --- eval expressions from helm. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -148,9 +148,13 @@ Should take one arg: the string to display."
(helm-build-dummy-source "Calculation Result"
:filtered-candidate-transformer (lambda (_candidates _source)
(list
- (condition-case nil
- (calc-eval helm-pattern)
- (error "error"))))
+ (condition-case err
+ (let ((result (calc-eval helm-pattern)))
+ (if (listp result)
+ (error "At pos %s: %s"
+ (car result) (cadr result))
+ result))
+ (error (cdr err)))))
:nohighlight t
:action '(("Copy result to kill-ring" . (lambda (candidate)
(kill-new candidate)
@@ -195,10 +199,4 @@ Should take one arg: the string to display."
(provide 'helm-eval)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-eval.el ends here
diff --git a/helm-external.el b/helm-external.el
index fb671867..7dad6f41 100644
--- a/helm-external.el
+++ b/helm-external.el
@@ -1,6 +1,6 @@
;;; helm-external.el --- Run Externals commands within Emacs with helm completion. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -208,10 +208,4 @@ You can set your own list of commands with
(provide 'helm-external)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-external ends here
diff --git a/helm-fd.el b/helm-fd.el
index 2e377ed0..3d620efd 100644
--- a/helm-fd.el
+++ b/helm-fd.el
@@ -1,6 +1,6 @@
;;; helm-fd.el --- helm interface for fd command line tool. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -17,10 +17,13 @@
;;; Code:
+(require 'helm)
+(require 'helm-types)
+
(defvar helm-fd-executable "fd"
"The fd shell command executable.")
-(defcustom helm-fd-switches '("--hidden" "--type" "f" "--type" "d" "--color" "always")
+(defcustom helm-fd-switches '("--no-ignore" "--hidden" "--type" "f" "--type" "d" "--color" "always")
"A list of options to pass to fd shell command."
:type '(repeat string)
:group 'helm-files)
@@ -74,9 +77,13 @@
"Initialize fd process in an helm async source."
(let* (process-connection-type
(cmd (append helm-fd-switches (split-string helm-pattern " ")))
- (proc (apply #'start-process "fd" nil "fd" cmd))
- (start-time (float-time)))
+ (proc (apply #'start-process "fd" nil helm-fd-executable cmd))
+ (start-time (float-time))
+ (fd-version (replace-regexp-in-string
+ "\n" ""
+ (shell-command-to-string (concat helm-fd-executable " --version")))))
(helm-log "Fd command:\nfd %s" (mapconcat 'identity cmd " "))
+ (helm-log "VERSION: %s" fd-version)
(prog1
proc
(set-process-sentinel
@@ -88,7 +95,8 @@
(:eval (format "L%s" (helm-candidate-number-at-point))) " "
(:eval (propertize
(format
- "[fd process finished in %.2fs - (%s results)] "
+ "[%s process finished in %.2fs - (%s results)] "
+ ,fd-version
,(- (float-time) start-time)
(helm-get-candidate-number))
'face 'helm-fd-finish))))
@@ -115,10 +123,4 @@
(provide 'helm-fd)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-fd.el ends here
diff --git a/helm-files.el b/helm-files.el
index fc89a4b9..9f375771 100644
--- a/helm-files.el
+++ b/helm-files.el
@@ -1,6 +1,6 @@
;;; helm-files.el --- helm file browser and related. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -33,6 +33,7 @@
(require 'dired-aux)
(require 'dired-x)
(require 'image-dired))
+(require 'filenotify)
(declare-function find-library-name "find-func.el" (library))
(declare-function w32-shell-execute "ext:w32fns.c" (operation document &optional parameters show-flag))
@@ -83,19 +84,18 @@
(declare-function tramp-buffer-name "tramp")
(declare-function tramp-make-tramp-file-name "tramp")
(declare-function tramp-cleanup-connection "tramp-cmds")
+(declare-function dired-async-processes "ext:dired-async.el")
(defvar term-char-mode-point-at-process-mark)
(defvar term-char-mode-buffer-read-only)
(defvar recentf-list)
(defvar helm-mm-matching-method)
-(defvar helm-ff-cache-mode)
-(defvar helm-ff-keep-cached-candidates)
(defvar dired-async-mode)
(defvar org-directory)
(defvar eshell-current-command)
(defvar eshell-debug-command)
(defvar eshell-current-command)
-
+(defvar tramp-archive-enabled)
(defgroup helm-files nil
@@ -285,7 +285,7 @@ variable."
:type 'boolean)
(defcustom helm-ff-allow-non-existing-file-at-point nil
- "Use file-at-point as initial input in `helm-find-files' even if it doesn't exists."
+ "Use non existing file-at-point as initial input in `helm-find-files'."
:group 'helm-files
:type 'boolean)
@@ -446,7 +446,11 @@ the directory (i.e. filenames)."
(const :tag "size" size)))
(defcustom helm-ff-rotate-image-program "exiftran"
- "External program used to rotate images."
+ "External program used to rotate images.
+When nil and `helm-ff-display-image-native' is enabled, fallback to
+`image-rotate' without modification of exif data i.e. rotation is not
+persistent otherwise an error is returned when not using
+`helm-ff-display-image-native' i.e. using image-dired."
:group 'helm-files
:type '(choice
(const :tag "Mogrify" "mogrify")
@@ -490,6 +494,17 @@ currently transfered in an help-echo in mode-line, if you use
"Percentage unicode sign to use in Rsync reporter."
:type 'string
:group 'helm-files)
+
+(defcustom helm-trash-default-directory nil
+ "The default trash directory.
+You probably don't need to set this when using a Linux system using
+standard settings.
+Should be the directory file name i.e. don't add final slash.
+When nil helm will compute a default value according to freedesktop
+specs.
+It is generally \"~/.local/share/Trash\"."
+ :type 'string
+ :group 'helm-files)
;;; Faces
;;
@@ -682,6 +697,8 @@ currently transfered in an help-echo in mode-line, if you use
;; Next 2 have no effect if candidate is not an image file.
(define-key map (kbd "M-l") 'helm-ff-rotate-left-persistent)
(define-key map (kbd "M-r") 'helm-ff-rotate-right-persistent)
+ (define-key map (kbd "M-+") 'helm-ff-increase-image-size-persistent)
+ (define-key map (kbd "M--") 'helm-ff-decrease-image-size-persistent)
(define-key map (kbd "C-l") 'helm-find-files-up-one-level)
(define-key map (kbd "C-_") 'helm-ff-undo)
(define-key map (kbd "C-r") 'helm-find-files-down-last-level)
@@ -691,6 +708,8 @@ currently transfered in an help-echo in mode-line, if you use
(define-key map (kbd "S-<f1>") 'helm-ff-sort-alpha)
(define-key map (kbd "S-<f2>") 'helm-ff-sort-by-newest)
(define-key map (kbd "S-<f3>") 'helm-ff-sort-by-size)
+ (define-key map (kbd "S-<f4>") 'helm-ff-toggle-dirs-only)
+ (define-key map (kbd "S-<f5>") 'helm-ff-toggle-files-only)
(helm-define-key-with-subkeys map (kbd "DEL") ?\d 'helm-ff-delete-char-backward
'((C-backspace . helm-ff-run-toggle-auto-update)
([C-c DEL] . helm-ff-run-toggle-auto-update))
@@ -749,6 +768,26 @@ with \"/\", otherwise this command deletes char backward.
When nil always delete char backward."
:group 'helm-files
:type 'boolean)
+
+(defcustom helm-ff-display-image-native nil
+ "Use native `image-mode' when non nil.
+
+You should use this only with Emacs>= 27 and `image-auto-resize'
+enabled to have images resized properly. When this is enabled,
+you have new commands to zoom in/out images. See
+`image-transform-resize' and `image-auto-resize'. Otherwise,
+when nil `image-dired' is used, using imagemagick as backend.
+NOTE: If you see image-mode is eating too much memory, you better have
+to set this to nil (default)."
+ :group 'helm-files
+ :type 'boolean)
+
+(defcustom helm-ff-reset-filters-on-update t
+ "Reset filter variables when changing directory.
+When filtering directories/files only, switch back to a \"show all\" view
+when moving out of directory when non nil."
+ :type 'boolean
+ :group 'helm-files)
;; Internal.
(defvar helm-find-files-doc-header " (\\<helm-find-files-map>\\[helm-find-files-up-one-level]: Go up one level)"
@@ -776,13 +815,26 @@ Don't set it directly, use instead `helm-ff-auto-update-initial-value'.")
(defvar helm-ff--move-to-first-real-candidate t)
(defvar helm-find-files--toggle-bookmark nil)
(defvar helm-ff--tramp-methods nil)
-(defvar helm-ff--directory-files-hash (make-hash-table :test 'equal))
+(defvar helm-ff--directory-files-length (make-hash-table :test 'equal)
+ "Used to count number of candidates in directory.
+candidate-number-limit is set to this value if this value is bigger
+than `helm-candidate-number-limit'.")
+(defvar helm-ff--list-directory-cache (make-hash-table :test 'equal)
+ "Cache for `helm-find-files' candidates.")
+(defvar helm-ff--file-notify-watchers (make-hash-table :test 'equal)
+ "File-notify watchers for `helm-find-files' are stored here.")
(defvar helm-ff-history-buffer-name "*helm-find-files history*")
(defvar helm-rsync-command-history nil)
(defvar helm-rsync--last-progress-bar-alist nil
"Used to store last valid rsync progress bar.")
(defvar helm-rsync-process-buffer "*helm-rsync*")
(defvar helm-rsync-progress-str-alist nil)
+(defvar helm-ff--trash-directory-regexp "\\.?Trash[/0-9]+files/?\\'")
+(defvar helm-ff--show-directories-only nil)
+(defvar helm-ff--show-files-only nil)
+(defvar helm-ff--trashed-files nil
+ "[INTERNAL] Files already trashed are stored here during file deletion.
+This is used only as a let binding.")
;;; Helm-find-files
;;
@@ -875,6 +927,10 @@ Should not be used among other sources.")
(match-on-real :initform t)
(filtered-candidate-transformer
:initform '(helm-ff-fct
+ ;; These next two have to be called after
+ ;; `helm-ff-fct' as they use only cons cell candidates.
+ helm-ff-directories-only
+ helm-ff-files-only
helm-ff-sort-candidates))
(persistent-action-if :initform 'helm-find-files-persistent-action-if)
(persistent-help :initform "Hit1 Expand Candidate, Hit2 or (C-u) Find file")
@@ -1076,7 +1132,10 @@ ACTION can be `rsync' or any action supported by `helm-dired-action'."
(unless (equal it "")
(push (cons proc it) helm-rsync--last-progress-bar-alist))
(format " [%s]" (propertize
- (assoc-default proc helm-rsync--last-progress-bar-alist)
+ (or (assoc-default proc helm-rsync--last-progress-bar-alist)
+ ;; Avoid (wrong-type-argument stringp
+ ;; nil) when process is not ready.
+ "")
'face 'helm-ff-rsync-progress)))))
(defun helm-rsync-mode-line (proc)
@@ -1261,7 +1320,13 @@ windows layout."
(let ((files (helm-marked-candidates :with-wildcard t))
(parg helm-current-prefix-arg))
(cl-loop for fname in files
- do (byte-compile-file fname parg))))
+ do (condition-case _err
+ (with-no-warnings
+ (byte-compile-file fname parg))
+ (wrong-number-of-arguments
+ ;; Emacs-28 accepts only one arg.
+ (byte-compile-file fname)
+ (when parg (load fname)))))))
(defun helm-find-files-load-files (_candidate)
"Load elisp files from `helm-find-files'."
@@ -1391,7 +1456,7 @@ this working."
"Command: "
(cl-loop for (a c) in (eshell-read-aliases-list)
;; Positional arguments may be double
- ;; quoted (Issue #1881).
+ ;; quoted (Bug#1881).
when (string-match "[\"]?.*\\(\\$1\\|\\$\\*\\)[\"]?\\s-*&?\\'" c)
collect (propertize a 'help-echo c) into ls
finally return (sort ls 'string<))
@@ -1681,6 +1746,47 @@ prefix arg shell buffer doesn't exists, create it and switch to it."
(message "Sorting alphabetically"))
(put 'helm-ff-sort-alpha 'helm-only t)
+(defun helm-ff-directories-only (candidates _source)
+ (if helm-ff--show-directories-only
+ (cl-loop for (d . r) in candidates
+ when (file-directory-p r)
+ ;; We can use this as long as this filtering function
+ ;; is called after `helm-ff-fct' otherwise candidates
+ ;; may not be cons cell at first call [1].
+ collect (cons d r))
+ candidates))
+
+(defun helm-ff-files-only (candidates _source)
+ (if helm-ff--show-files-only
+ (cl-loop for (d . r) in candidates
+ unless (file-directory-p r)
+ ;; Same comment as in [1] above.
+ collect (cons d r))
+ candidates))
+
+(defun helm-ff-toggle-dirs-only ()
+ "Show only directories in helm-find-files."
+ (interactive)
+ (with-helm-alive-p
+ (setq helm-ff--show-directories-only (not helm-ff--show-directories-only))
+ (setq helm-ff--show-files-only nil)
+ (helm-update (helm-get-selection nil t))))
+(put 'helm-ff-toggle-dirs-only 'helm-only t)
+
+(defun helm-ff-toggle-files-only ()
+ "Show only files in helm-find-files."
+ (interactive)
+ (with-helm-alive-p
+ (setq helm-ff--show-files-only (not helm-ff--show-files-only))
+ (setq helm-ff--show-directories-only nil)
+ (helm-update (helm-get-selection nil t))))
+(put 'helm-ff-toggle-files-only 'helm-only t)
+
+(defun helm-ff-after-persistent-show-all ()
+ (when helm-ff-reset-filters-on-update
+ (setq helm-ff--show-directories-only nil
+ helm-ff--show-files-only nil)))
+
(defun helm-ff-serial-rename-action (method)
"Rename all marked files in `helm-ff-default-directory' with METHOD.
See `helm-ff-serial-rename-1'."
@@ -1916,8 +2022,6 @@ This doesn't replace inside the files, only modify filenames."
(rename-file old new)
(cl-incf count)))
finally (message "%d Files renamed" count))))
- (unless helm-ff-cache-mode
- (helm-ff-refresh-cache))
;; This fix the emacs bug where "Emacs-Lisp:" is sent
;; in minibuffer (not the echo area).
(sit-for 0.1)
@@ -1993,7 +2097,7 @@ This doesn't replace inside the files, only modify filenames."
(defun helm-ff-run-toggle-auto-update ()
(interactive)
(with-helm-alive-p
- (helm-attrset 'toggle-auto-update '(helm-ff-toggle-auto-update . never-split))
+ (helm-set-attr 'toggle-auto-update '(helm-ff-toggle-auto-update . never-split))
(helm-execute-persistent-action 'toggle-auto-update)))
(put 'helm-ff-run-toggle-auto-update 'helm-only t)
@@ -2436,7 +2540,7 @@ Emacs and even the whole system as it eats all memory."
finally return (or result (expand-file-name "/"))))
(defun helm-reduce-file-name-2 (fname level)
- ;; This version comes from issue #2004 (UNC paths) and should fix
+ ;; This version comes from Bug#2004 (UNC paths) and should fix
;; it. It works with local files and remote files as well but not
;; with ftp, see helm-reduce-file-name-1.
(while (> level 0)
@@ -2472,6 +2576,7 @@ Emacs and even the whole system as it eats all memory."
If prefix numeric arg is given go ARG level up."
(interactive "p")
(with-helm-alive-p
+ (helm-ff-after-persistent-show-all)
(let ((src (helm-get-current-source)))
(when (and (helm-file-completion-source-p src)
(not (helm-ff--invalid-tramp-name-p)))
@@ -2484,10 +2589,10 @@ If prefix numeric arg is given go ARG level up."
(let ((cur-cand (helm-get-selection nil nil src))
(new-pattern (helm-reduce-file-name helm-pattern arg)))
;; Ensure visibility on all candidates for preselection.
- (helm-attrset 'candidate-number-limit
+ (helm-set-attr 'candidate-number-limit
(if helm-ff-up-one-level-preselect
(max (gethash new-pattern
- helm-ff--directory-files-hash
+ helm-ff--directory-files-length
helm-ff-candidate-number-limit)
helm-ff-candidate-number-limit)
helm-ff-candidate-number-limit))
@@ -2555,7 +2660,7 @@ hitting C-j on \"..\"."
(helm-aif (and (helm-file-completion-source-p src)
(not (helm-empty-source-p))
;; Prevent dired commands moving to first real
- ;; (Issue #910).
+ ;; (Bug#910).
(or (memq (intern-soft name)
helm-ff-goto-first-real-dired-exceptions)
(not (string-match "\\`[Dd]ired-" name)))
@@ -2616,12 +2721,12 @@ when `helm-pattern' is equal to \"~/\"."
;; but not when renaming, copying etc...,
;; so for this use
;; `helm-ff-move-to-first-real-candidate'
- ;; instead of `helm-next-line' (Issue #910).
+ ;; instead of `helm-next-line' (Bug#910).
(helm-ff-move-to-first-real-candidate))
(helm-get-selection nil nil src))))
(when (and (or (and helm-ff-auto-update-flag
(null helm-ff--deleting-char-backward)
- ;; Issue #295
+ ;; Bug#295
;; File predicates are returning t
;; with paths like //home/foo.
;; So check it is not the case by regexp
@@ -2629,7 +2734,7 @@ when `helm-pattern' is equal to \"~/\"."
;; entering a tramp method e.g /sudo::.
(not (string-match "\\`//" helm-pattern))
(not (eq last-command 'helm-yank-text-at-point)))
- ;; Fix issue #542.
+ ;; Fix Bug#542.
(string= helm-pattern "~/")
;; Only one remaining directory, expand it.
(and (= candnum 1)
@@ -2653,8 +2758,11 @@ when `helm-pattern' is equal to \"~/\"."
;; is not one of "." or ".." [1]
;; and only one candidate is remaining [2],
;; assume candidate is a new directory to expand, and do it.
- (helm-set-pattern (file-name-as-directory
- (substring-no-properties cur-cand)))
+ (progn
+ (helm-set-pattern (file-name-as-directory
+ (substring-no-properties cur-cand)))
+ ;; Reset flags to show all when changing dir.
+ (helm-ff-after-persistent-show-all))
;; The candidate is one of "." or ".."
;; that mean we have entered the last letter of the directory name
;; in prompt, so expansion is already done, just add the "/" at end
@@ -2708,11 +2816,14 @@ avoid errors when called outside helm for debugging purpose."
(if (file-directory-p sub)
sub (replace-regexp-in-string "/\\'" "" sub))))
(t (helm-ff--expand-substitued-pattern pattern)))))
- ;; `file-directory-p' returns t on "/home/me/." (issue #1844).
+ ;; `file-directory-p' returns t on "/home/me/." (Bug#1844).
(if (and (file-directory-p input)
(not (string-match-p "[^.]\\.\\'" input)))
- (setq helm-ff-default-directory
- (setq input (file-name-as-directory input)))
+ (progn
+ (setq helm-ff-default-directory
+ (setq input (file-name-as-directory input)))
+ ;; When changing directory ensure to show all.
+ (helm-ff-after-persistent-show-all))
(setq helm-ff-default-directory (file-name-as-directory
(file-name-directory input))))
(if spattern input (helm-ff--maybe-set-pattern-and-update input))))
@@ -2727,7 +2838,7 @@ avoid errors when called outside helm for debugging purpose."
(defun helm-ff--expand-file-name-no-dot (name &optional directory)
"Prevent expanding \"/home/user/.\" to \"/home/user\"."
- ;; Issue #1844 - If user enter "~/." to type an hidden filename
+ ;; Bug#1844 - If user enter "~/." to type an hidden filename
;; don't expand to /home/him e.g.
;; (expand-file-name "~/.") =>"/home/thierry"
;; (helm-ff--expand-substitued-pattern "~/.") =>"/home/thierry/."
@@ -2741,11 +2852,11 @@ avoid errors when called outside helm for debugging purpose."
(getenv "SystemDrive")))
(subst (helm-substitute-in-filename pattern))
;; On Windows use a simple call to `expand-file-name' to
- ;; avoid Issue #2004.
+ ;; avoid Bug#2004.
(expand-fn (if directory
#'expand-file-name
#'helm-ff--expand-file-name-no-dot)))
- ;; Fix issue #2223 with tilde in directory names e.g. "~/tmp/~test/".
+ ;; Fix Bug#2223 with tilde in directory names e.g. "~/tmp/~test/".
(funcall expand-fn (if (string-match-p "\\`~[^/]" subst)
pattern subst)
;; directory is nil on Nix.
@@ -2770,7 +2881,7 @@ and should be used carefully elsewhere, or not at all, using
(insert fname)
(goto-char (point-min))
(when (memq system-type '(windows-nt ms-dos))
- (skip-chars-forward "/")) ;; Avoid infloop in UNC paths Issue #424
+ (skip-chars-forward "/")) ;; Avoid infloop in UNC paths Bug#424
(if (re-search-forward "~.*/?\\|//\\|/[[:alpha:]]:/" nil t)
(let ((match (match-string 0)))
(goto-char (if (or (string= match "//")
@@ -2940,7 +3051,7 @@ debugging purpose."
(when (string-match "\\`/\\(-\\):" pattern)
(setq pattern (replace-match tramp-default-method t t pattern 1)))
;; In some rare cases tramp can return a nil input,
- ;; so be sure pattern is a string for safety (Issue #476).
+ ;; so be sure pattern is a string for safety (Bug#476).
(unless pattern (setq pattern ""))
(cond ((string-match helm-ff-url-regexp pattern) pattern)
((string-match "\\`\\$" pattern)
@@ -2948,7 +3059,7 @@ debugging purpose."
((string= pattern "") "")
((string-match "\\`[.]\\{1,2\\}/\\'" pattern)
(expand-file-name pattern))
- ;; Directories ending by a dot (issue #1940)
+ ;; Directories ending by a dot (Bug#1940)
((string-match "[^/][.]/\\'" pattern)
(expand-file-name pattern))
((string-match ".*\\(~?/?[.]\\{1\\}/\\)\\'" pattern)
@@ -3005,7 +3116,7 @@ debugging purpose."
;; connection and may send a file-error.
(setq helm--ignore-errors (file-remote-p path))
(set-text-properties 0 (length path) nil path)
- ;; Issue #118 allow creation of newdir+newfile.
+ ;; Bug#118 allow creation of newdir+newfile.
(unless (or
;; A tramp file name not completed.
(string= path "@@TRAMP@@")
@@ -3070,12 +3181,14 @@ debugging purpose."
invalid-basedir
(and (not (file-exists-p path)) (string-match "/$" path))
(and helm--url-regexp (string-match helm--url-regexp path)))
- ;; Do NOT filter boring files here (issue #2330).
+ ;; Do NOT filter boring files here (Bug#2330).
(list (helm-ff-filter-candidate-one-by-one path nil t)))
((string= path "") (helm-ff-directory-files "/"))
;; Check here if directory is accessible (not working on Windows).
((and (file-directory-p path) (not (file-readable-p path)))
- (list (cons (format "file-error: Opening directory permission denied `%s'" path)
+ ;; Prefix error message with @@@@ for safety
+ ;; (some files may match file-error See bug#2400)
+ (list (cons (format "@@@@file-error: Opening directory permission denied `%s'" path)
path)))
;; A fast expansion of PATH is made only if `helm-ff-auto-update-flag'
;; is enabled.
@@ -3102,7 +3215,7 @@ debugging purpose."
;; disabled, whe don't want PATH to be added on top
;; if it is a directory.
dir-p)
- ;; Do NOT filter boring files here (issue #2330).
+ ;; Do NOT filter boring files here (Bug#2330).
(list (helm-ff-filter-candidate-one-by-one path nil t)))
(helm-ff-directory-files basedir))))))
@@ -3201,7 +3314,18 @@ later in the transformer."
(add-text-properties (point-min) (point-max) '(helm-ff-file t))
(split-string (buffer-string) "\n" t)))))
-(defvar helm-ff--list-directory-cache (make-hash-table :test 'equal))
+(defcustom helm-ff-use-notify t
+ "Watch directories visited with `helm-find-files' when non nil.
+If your system have no file notification package available turn this
+to nil to avoid error messages when using `helm-find-files'."
+ :type 'boolean
+ :group 'helm-files
+ :set (lambda (var val)
+ (set-default var val)
+ (unless (symbol-value var)
+ (cl-loop for dir being the hash-keys of helm-ff--file-notify-watchers
+ do (remhash dir helm-ff--list-directory-cache)))))
+
(defun helm-ff-directory-files (directory &optional force-update)
"List contents of DIRECTORY.
Argument FULL mean absolute path.
@@ -3225,202 +3349,48 @@ in cache."
;; `helm-find-files-get-candidates' by `file-readable-p'.
(file-error
(prog1
- (list (format "%s:%s"
- (car err)
- (mapconcat 'identity (cdr err) " ")))
+ ;; Prefix error message with @@@@ for safety
+ ;; (some files may match file-error See bug#2400)
+ (list (format "@@@@%s:%s"
+ (car err)
+ (mapconcat 'identity (cdr err) " ")))
(setq file-error t)))))
(dot (concat directory "."))
(dot2 (concat directory ".."))
(candidates (append (and (not file-error) (list dot dot2)) ls)))
- (puthash directory (+ (length ls) 2) helm-ff--directory-files-hash)
- (puthash directory
- (cl-loop for f in candidates
- for ff = (helm-ff-filter-candidate-one-by-one f)
- when ff collect ff)
- helm-ff--list-directory-cache))))
-
-(defun helm-ff-refresh-cache ()
- "Refresh `helm-ff--list-directory-cache'."
- (maphash (lambda (k _v)
- (unless (file-remote-p k)
- (helm-ff-directory-files k t)))
- helm-ff--list-directory-cache))
-
-;;; `helm-ff-cache-mode'
-;; A mode to auto refresh helm-find-files cache.
-;;
-(defvar helm-ff--refresh-cache-timer nil)
-(defvar helm-ff--cache-mode-lighter-face 'helm-ff-cache-stopped)
-(defvar helm-ff--refresh-cache-done nil)
-
-(defcustom helm-ff-cache-mode-post-delay 0.5
- "Wait this delay seconds before restarting when emacs stops beeing idle.
-
-Minimum value accepted is 0.3s."
- :type 'float
- :group 'helm-files)
-
-(defcustom helm-ff-refresh-cache-delay 0.5
- "`helm-ff-cache-mode' timer starts after this many seconds.
-
-Minimum value accepted is 0.3s."
- :type 'float
- :group 'helm-files)
-
-(defcustom helm-ff-cache-mode-max-idle-time 6
- "`helm-ff-cache-mode' timer stops updating after this many seconds."
- :type 'integer
- :group 'helm-files)
-
-(defcustom helm-ff-cache-mode-lighter-sleep nil
- "String used when `helm-ff-cache-mode' is inactive.
-When this is set to a valid string, it is used as lighter in `helm-ff-cache-mode'."
- :type 'string
- :group 'helm-files)
-
-(defcustom helm-ff-cache-mode-lighter-updating nil
- "String used when `helm-ff-cache-mode' is updating cache.
-When this is set to a valid string, it is used as lighter in `helm-ff-cache-mode'."
- :type 'string
- :group 'helm-files)
-
-(defvar helm-ff-cache-mode-lighter helm-ff-cache-mode-lighter-sleep
- "Default string for `helm-ff-cache-mode' lighter.")
-
-(defun helm-ff--cache-mode-refresh (&optional no-update delay)
- (when helm-ff--refresh-cache-timer
- (cancel-timer helm-ff--refresh-cache-timer))
- (if (or helm-alive-p (input-pending-p) no-update)
- (setq helm-ff-cache-mode-lighter helm-ff-cache-mode-lighter-sleep)
- (helm-ff--cache-mode-refresh-1))
- ;; When `helm-ff-keep-cached-candidates' becomes nil don't restart
- ;; timer and set mode to nil to disable it.
- (if helm-ff-keep-cached-candidates
- (setq helm-ff--refresh-cache-timer
- (run-with-idle-timer
- (helm-aif (current-idle-time)
- (time-add
- it (seconds-to-time (helm-ff--refresh-cache-delay)))
- (or delay helm-ff-refresh-cache-delay))
- nil
- #'helm-ff--cache-mode-refresh))
- (setq helm-ff-cache-mode nil)))
-
-(defun helm-ff--cache-mode-refresh-1 ()
- (if (and helm-ff-keep-cached-candidates
- (> (hash-table-count helm-ff--list-directory-cache) 0)
- ;; Stop updating when Emacs is idle more than
- ;; helm-ff-cache-mode-max-idle-time.
- (time-less-p (current-idle-time)
- (seconds-to-time (helm-ff--cache-mode-max-idle-time)))
- (null helm-ff--refresh-cache-done))
- (progn
- (setq helm-ff-cache-mode-lighter helm-ff-cache-mode-lighter-updating)
- (while-no-input
- (helm-ff-refresh-cache)
- (setq helm-ff--refresh-cache-done t)))
- (setq helm-ff-cache-mode-lighter helm-ff-cache-mode-lighter-sleep))
- (force-mode-line-update))
-
-(defun helm-ff--cache-mode-reset-timer ()
- ;; The goal is to run a timer all the x seconds when Emacs is idle.
- ;; When Emacs is idle during say 20s (current-idle-time)
- ;; the idle timer will run in
- ;; 20+<helm-ff-refresh-cache-delay>+<helm-ff--cache-mode-post-delay>
- ;; s. Say for example it is 20+1.5.
- ;; This is fine when Emacs stays idle, because the next timer
- ;; will run at 21.5+1.5 etc... so the display will be updated
- ;; at every 1.5 seconds.
- ;; But as soon as emacs looses its idleness
- ;; i.e. (current-idle-time)==nil, the next update
- ;; will occur at say 21+1.5 s, so we have to reinitialize
- ;; the timer at 0+1.5. To do this we run the timer fn with 'noupdate
- ;; and an explicit delay in post-command-hook and in focus-in-hook.
- (helm-ff--cache-mode-refresh
- 'no-update (+ (helm-ff--refresh-cache-delay)
- (helm-ff--cache-mode-post-delay)))
- (setq helm-ff--refresh-cache-done nil))
-
-(defun helm-ff--refresh-cache-delay ()
- "Prevent user using less than 0.5s for `helm-ff-refresh-cache-delay'."
- (max 0.3 helm-ff-refresh-cache-delay))
-
-(defun helm-ff--cache-mode-post-delay ()
- "Prevent user using less than 0.5s for `helm-ff-cache-mode-post-delay'."
- (max 0.3 helm-ff-cache-mode-post-delay))
-
-(defun helm-ff--cache-mode-max-idle-time ()
- "Prevent user using too small value for `helm-ff-cache-mode-max-idle-time'."
- (max (+ helm-ff-cache-mode-post-delay
- helm-ff-refresh-cache-delay
- 1)
- helm-ff-cache-mode-max-idle-time))
-
-(defun helm-ff-cache-mode-add-hooks ()
- (add-hook 'post-command-hook 'helm-ff--cache-mode-reset-timer)
- (add-hook 'focus-in-hook 'helm-ff--cache-mode-reset-timer))
-
-(defun helm-ff-cache-mode-remove-hooks ()
- (remove-hook 'post-command-hook 'helm-ff--cache-mode-reset-timer)
- (remove-hook 'focus-in-hook 'helm-ff--cache-mode-reset-timer))
-
-;;;###autoload
-(define-minor-mode helm-ff-cache-mode
- "Auto refresh `helm-find-files' cache when emacs is idle.
-
-You probably don't want to start this mode directly. Instead you
-should customize `helm-ff-keep-cached-candidates' to a non nil
-value to enable it.
-
-With `helm-ff-keep-cached-candidates' set to a nil value the mode
-will disable itself.
-
-When Emacs is idle, refresh the cache all the
-`helm-ff-refresh-cache-delay' seconds then stop when done or after
-`helm-ff-cache-mode-max-idle-time' if emacs is still idle."
- :group 'helm-files
- :global t
- :lighter (:eval helm-ff-cache-mode-lighter)
- (unless (or helm-ff-keep-cached-candidates
- (null helm-ff-cache-mode))
- ;; When helm-ff-keep-cached-candidates have been set to nil with
- ;; setq, the mode will start but with no effect and die by itself
- ;; i.e. the timer will not restart on itself and mode will be set
- ;; to nil.
- (display-warning
- '(helm-ff-cached-mode)
- "`helm-ff-keep-cached-candidates' should be set to a non nil value"))
- (if helm-ff-cache-mode
- (helm-ff-cache-mode-add-hooks)
- (helm-ff-cache-mode-remove-hooks)
- (and helm-ff--refresh-cache-timer
- (cancel-timer helm-ff--refresh-cache-timer))
- (setq helm-ff--refresh-cache-timer nil)))
-
-(defcustom helm-ff-keep-cached-candidates 'all
- "When non nil do not delete the HFF cache after each session.
-
-Possible values are:
-- `all' or `t' (default): Keep all.
-- `remote': Keep only remote.
-- `local': Keep only locals.
-- `nil': Delete all.
-
-Starts `helm-ff-cache-mode' when non nil.
-
-Please use customize interface or `customize-set-variable' to
-configure this i.e. NOT `setq'."
- :type '(choice
- (const :tag "Keep all" 'all)
- (const :tag "Keep only remote" 'remote)
- (const :tag "Keep only locals" 'local)
- (const :tag "Delete all" nil))
- :group 'helm-files
- :set (lambda (var val)
- (set var val)
- (if val
- (helm-ff-cache-mode 1)
- (helm-ff-cache-mode -1))))
+ (puthash directory (+ (length ls) 2) helm-ff--directory-files-length)
+ (prog1
+ (puthash directory
+ (cl-loop for f in candidates
+ when (helm-ff-filter-candidate-one-by-one f)
+ collect it)
+ helm-ff--list-directory-cache)
+ ;; Put an inotify watcher to check directory modifications.
+ (unless (or (null helm-ff-use-notify)
+ (gethash directory helm-ff--file-notify-watchers))
+ (condition-case-unless-debug err
+ (puthash directory
+ (file-notify-add-watch
+ directory
+ '(change attribute-change)
+ (helm-ff--inotify-make-callback directory))
+ helm-ff--file-notify-watchers)
+ (file-notify-error (user-error "Error: %S %S" (car err) (cdr err)))))))))
+
+(defun helm-ff--inotify-make-callback (directory)
+ "Return a callback for `file-notify-add-watch'."
+ (lambda (event)
+ (let ((desc (cadr event)))
+ ;; `attribute-changed' means permissions have changed, not
+ ;; file modifications like file changes, visit
+ ;; etc... AFAIU the desc for this is `changed' and for our
+ ;; use case we don't care of this.
+ (when (memq desc '(created deleted renamed attribute-changed))
+ ;; When DIRECTORY is modified remove it from cache.
+ (remhash directory helm-ff--list-directory-cache)
+ ;; Remove watch as well in case of rename or delete.
+ (file-notify-rm-watch (gethash directory helm-ff--file-notify-watchers))
+ (remhash directory helm-ff--file-notify-watchers)))))
(defun helm-ff-handle-backslash (fname)
;; Allow creation of filenames containing a backslash.
@@ -3457,14 +3427,14 @@ If PATTERN is a valid directory name, return PATTERN unchanged."
((or (and dir-p tramp-p (string-match ":\\'" pattern))
(string= pattern "")
(and dir-p (<= (length bn) 2))
- ;; Fix Issue #541 when BD have a subdir similar
+ ;; Fix Bug#541 when BD have a subdir similar
;; to BN, don't switch to match plugin
;; which will match both.
(and dir-p (string-match (regexp-quote bn) bd)))
;; Use full PATTERN on e.g "/ssh:host:".
(regexp-quote pattern))
;; Prefixing BN with a space call multi-match completion.
- ;; This allow showing all files/dirs matching BN (Issue #518).
+ ;; This allow showing all files/dirs matching BN (Bug#518).
;; FIXME: some multi-match methods may not work here.
(dir-p (concat (regexp-quote bd) " " (regexp-quote bn)))
((or (not (helm-ff-fuzzy-matching-p))
@@ -3526,7 +3496,7 @@ Note that only existing directories are saved here."
(defun helm-ff-valid-symlink-p (file)
(helm-aif (condition-case-unless-debug nil
;; `file-truename' send error
- ;; on cyclic symlinks (Issue #692).
+ ;; on cyclic symlinks (Bug#692).
(file-truename file)
(error nil))
(file-exists-p it)))
@@ -3583,7 +3553,8 @@ Note that only existing directories are saved here."
(format "Size: %s\n" size)
(when (string= type "directory")
(format "Size used in directory: %s\n"
- (helm-directory-size candidate nil t)))
+ (helm-directory-size
+ candidate current-prefix-arg t)))
(format "Modified: %s\n" modif)
(format "Accessed: %s\n" access)
(and (stringp trash)
@@ -3596,7 +3567,7 @@ Note that only existing directories are saved here."
"Show properties without quitting helm."
(interactive)
(with-helm-alive-p
- (helm-attrset 'properties-action '(helm-ff-properties . never-split))
+ (helm-set-attr 'properties-action '(helm-ff-properties . never-split))
(helm-execute-persistent-action 'properties-action)))
(put 'helm-ff-properties-persistent 'helm-only t)
@@ -3604,7 +3575,7 @@ Note that only existing directories are saved here."
"Delete current candidate without quitting."
(interactive)
(with-helm-alive-p
- (helm-attrset 'quick-delete '(helm-ff-quick-delete . never-split))
+ (helm-set-attr 'quick-delete '(helm-ff-quick-delete . never-split))
(helm-execute-persistent-action 'quick-delete)))
(put 'helm-ff-persistent-delete 'helm-only t)
@@ -3650,7 +3621,7 @@ in `helm-find-files-persistent-action-if'."
"Execute `helm-ff-kill-buffer-fname' without quitting."
(interactive)
(with-helm-alive-p
- (helm-attrset 'kill-buffer-fname 'helm-ff-kill-buffer-fname)
+ (helm-set-attr 'kill-buffer-fname 'helm-ff-kill-buffer-fname)
(helm-execute-persistent-action 'kill-buffer-fname)))
(put 'helm-ff-run-kill-buffer-persistent 'helm-only t)
@@ -3665,7 +3636,7 @@ in `helm-find-files-persistent-action-if'."
(defun helm-ff-run-preview-file-externally ()
(interactive)
(with-helm-alive-p
- (helm-attrset 'open-file-externally '(helm-ff-persistent-open-file-externally . never-split))
+ (helm-set-attr 'open-file-externally '(helm-ff-persistent-open-file-externally . never-split))
(helm-execute-persistent-action 'open-file-externally)))
(put 'helm-ff-run-preview-file-externally 'helm-only t)
@@ -3786,7 +3757,7 @@ If SKIP-BORING-CHECK is non nil don't filter boring files."
(backup (backup-file-name-p disp)))
;; We want to filter boring files only on the files coming
;; from the output of helm-ff-directory-files not on single
- ;; candidate (issue #2330).
+ ;; candidate (Bug#2330).
(unless (and (not skip-boring-check)
(or (helm-ff-boring-file-p basename)
(helm-ff-git-ignored-p file)))
@@ -3835,10 +3806,21 @@ If SKIP-BORING-CHECK is non nil don't filter boring files."
;; Highlight local files showing everything, symlinks, exe,
;; dirs etc...
- (let* ((attr (file-attributes file))
+ (let* ((attr (condition-case err
+ (file-attributes file)
+ (file-error
+ ;; Possible error not happening during listing
+ ;; but when calling file-attributes see error
+ ;; with sshfs bug#2405
+ (message "%s:%s" (car err) (cdr err)) nil)))
(type (car attr))
x-bit)
- (cond ((string-match "file-error" file) file)
+ (cond (;; Not a file but the message error printed in
+ ;; helm-buffer. Such a message should not have a
+ ;; subdir so matching on bol should suffice, but to
+ ;; be sure use @@@@ as prefix in file-error message
+ ;; to be safe bug#2400.
+ (string-match "\\`@@@@file-error:" file) file)
(;; A dead symlink.
(and (stringp type)
(not (helm-ff-valid-symlink-p file))
@@ -3908,7 +3890,8 @@ If SKIP-BORING-CHECK is non nil don't filter boring files."
(setq actions (helm-append-at-nth
actions '(("Checksum File" . helm-ff-checksum)) 4)))
(cond ((and (file-exists-p candidate)
- (string-match "Trash/files/?\\'" (helm-basedir candidate))
+ (string-match helm-ff--trash-directory-regexp
+ (helm-basedir (expand-file-name candidate)))
(not (member (helm-basename candidate) '("." "..")))
(executable-find "trash"))
(helm-append-at-nth
@@ -3949,6 +3932,8 @@ If SKIP-BORING-CHECK is non nil don't filter boring files."
actions '(("Browse url file" . browse-url-of-file)) 2))
(t actions))))
+;;; Trashing files
+;;
(defun helm-ff-trash-action (fn names &rest args)
"Execute a trash action FN on marked files.
@@ -3957,10 +3942,20 @@ E.g. '(\"delete\" \"deleting\")
ARGS are other arguments to be passed to FN."
(let ((mkd (helm-marked-candidates))
- errors)
+ errors aborted)
(with-helm-display-marked-candidates
helm-marked-buffer-name
- (helm-ff--count-and-collect-dups (mapcar 'helm-basename mkd))
+ (if (and args (string= (car names) "restore"))
+ (cl-loop for f in mkd
+ for bd = (helm-basename f)
+ for assoc = (assoc bd (car args))
+ when assoc
+ collect (concat (truncate-string-to-width
+ (car assoc) 40 nil nil t)
+ " -> "
+ (truncate-string-to-width
+ (helm-basedir (cdr assoc)) 40 nil nil t)))
+ (helm-ff--count-and-collect-dups (mapcar 'helm-basename mkd)))
(if (y-or-n-p (format "%s %s files from trash? "
(capitalize (car names))
(length mkd)))
@@ -3970,22 +3965,29 @@ ARGS are other arguments to be passed to FN."
(condition-case err
(apply fn f args)
(error (push (format "%s" (cadr err)) errors)
- nil)))
- (if errors
- (display-warning 'helm
- (with-temp-buffer
- (insert (format-time-string "%Y-%m-%d %H:%M:%S\n"
- (current-time)))
- (insert (format
- "Failed to %s %s/%s files from trash\n"
- (car names) (length errors) (length mkd)))
- (insert (mapconcat 'identity errors "\n") "\n ")
- (buffer-string))
- :error
- "*helm restore warnings*")
- (message "%s %s files from trash done"
- (capitalize (cadr names)) (length mkd))))
- (message "Restoring files from trash aborted")))))
+ nil))))
+ (message "%s files from trash aborted" (capitalize (cadr names)))
+ (setq aborted t)))
+ ;; Handle errors from outside the
+ ;; with-helm-display-marked-candidates block otherwise warning is
+ ;; never displayed.
+ (if errors
+ (progn
+ (display-warning 'helm
+ (with-temp-buffer
+ (insert (format-time-string "%Y-%m-%d %H:%M:%S\n"
+ (current-time)))
+ (insert (format
+ "Failed to %s %s/%s files from trash\n"
+ (car names) (length errors) (length mkd)))
+ (insert (mapconcat 'identity errors "\n") "\n ")
+ (buffer-string))
+ :error
+ "*helm restore warnings*")
+ (message "%s files from trash aborted" (capitalize (cadr names))))
+ (unless aborted
+ (message "%s %s files from trash done"
+ (capitalize (cadr names)) (length mkd))))))
(defun helm-ff-trash-rm (_candidate)
"Delete marked-files from a Trash directory.
@@ -4016,16 +4018,14 @@ Trash/info directory."
The Trash directory should be a directory compliant with
<http://freedesktop.org/wiki/Specifications/trash-spec> and each
-file should have its '*.trashinfo' correspondent file in
+file should have its '*.trashinfo' corresponding file in
Trash/info directory."
(let* ((default-directory (file-name-as-directory
helm-ff-default-directory))
(trashed-files (helm-ff-trash-list)))
(helm-ff-trash-action 'helm-restore-file-from-trash-1
'("restore" "restoring")
- trashed-files)
- (unless helm-ff-cache-mode
- (helm-ff-refresh-cache))))
+ trashed-files)))
(defun helm-restore-file-from-trash-1 (file trashed-files)
"Restore FILE from a trash directory.
@@ -4052,28 +4052,48 @@ with `helm-ff-trash-list'."
(defun helm-ff-trash-file-p (file)
"Return t when FILE is a trashed file."
(and (file-exists-p file)
- (string-match "Trash/files/?\\'" (helm-basedir file))
+ (string-match helm-ff--trash-directory-regexp (helm-basedir file))
(not (member (helm-basename file) '("." "..")))))
(defun helm-ff--get-dest-file-from-trash (trashed-files file)
(assoc-default (helm-basename file) trashed-files))
-(defun helm-ff-trash-list ()
- "Return an alist of trashed files basename and dest name."
- (cl-loop for f in (directory-files
- (expand-file-name
- ;; helm-ff-default-directory is actually the
- ;; trash directory.
- "info" (helm-basedir (directory-file-name helm-ff-default-directory)))
- t directory-files-no-dot-files-regexp)
- collect (cons (helm-basename (replace-regexp-in-string "\\.trashinfo\\'" "" f))
- (with-temp-buffer
- (save-excursion
- (insert-file-contents f))
- (when (re-search-forward "^path=" nil t)
- (helm-url-unhex-string
- (buffer-substring-no-properties
- (point) (point-at-eol))))))))
+(defun helm-ff-trash-list (&optional trash-dir)
+ "Return an alist of trashed files basename and dest name.
+Assume the trash system in use is freedesktop compatible, see
+<http://freedesktop.org/wiki/Specifications/trash-spec>
+This function is intended to be used from a trash directory i.e. it
+use `helm-ff-default-directory', but it may be used elsewhere by
+specifying the trash directory with TRASH-DIR arg."
+ (unless (fboundp 'system-move-file-to-trash)
+ ;; Files owned by root are trashed in /root/.local/share/Trash.
+ ;; Files owned by user and trashed by root are trashed in
+ ;; /home/.Trash.
+ ;; Files owned by user and trashed by user are trashed in
+ ;; ~/.local/share/Trash.
+ (cl-loop for f in (directory-files
+ (expand-file-name
+ ;; helm-ff-default-directory is actually the
+ ;; trash directory.
+ "info" (helm-basedir (directory-file-name
+ (or trash-dir helm-ff-default-directory))))
+ t directory-files-no-dot-files-regexp)
+ collect (cons (helm-basename (replace-regexp-in-string "\\.trashinfo\\'" "" f))
+ (with-temp-buffer
+ (save-excursion
+ (insert-file-contents f))
+ (when (re-search-forward "^path=" nil t)
+ (let ((path (helm-url-unhex-string
+ (buffer-substring-no-properties
+ (point) (point-at-eol)))))
+ (if (string-match "\\`/" path)
+ ;; path is absolute
+ path
+ ;; When path is relative, assume the
+ ;; trash directory is located at
+ ;; /home/.Trash and path is the
+ ;; relative name of file from /home.
+ (expand-file-name path "/home")))))))))
(defun helm-ff-goto-linum (candidate)
"Find file CANDIDATE and maybe jump to line number found in fname at point.
@@ -4117,29 +4137,47 @@ E.g. \"foo:12\"."
"application/octet-stream")))))))
(defvar image-dired-display-image-buffer)
-(defun helm-ff-rotate-current-image-1 (file num-arg)
- "Rotate current image at NUM-ARG degrees."
+(defun helm-ff-rotate-current-image-1 (file angle)
+ "Rotate current image at ANGLE degrees."
+ (cl-assert (and (file-exists-p file)
+ (string-match (image-file-name-regexp) file))
+ nil "Can't rotate non image file")
(setq file (file-truename file)) ; For symlinked images.
- ;; When FILE is not an image-file, do nothing.
- (when (and (file-exists-p file)
- (string-match (image-file-name-regexp) file))
- (setq num-arg (if (string= helm-ff-rotate-image-program "exiftran")
- (cl-case num-arg
- (90 "-9") ; 90 clockwise
- (270 "-2")) ; 270 clockwise == -90
- (number-to-string num-arg)))
- (if (executable-find helm-ff-rotate-image-program)
- (let ((default-directory (file-name-directory file))
- (basename (helm-basename file)))
- (apply #'process-file helm-ff-rotate-image-program nil nil nil
- (append helm-ff-rotate-image-switch
- (list num-arg basename)))
- (when (buffer-live-p image-dired-display-image-buffer)
- (kill-buffer image-dired-display-image-buffer))
- (image-dired-display-image basename)
- (message nil)
- (display-buffer (get-buffer image-dired-display-image-buffer)))
- (error "%s not found" helm-ff-rotate-image-program))))
+ (let ((default-directory (file-name-directory file))
+ (basename (helm-basename file))
+ ;; convert ANGLE to a suitable value for exiftran.
+ (num-arg (if (string= helm-ff-rotate-image-program "exiftran")
+ (cl-case angle
+ (90 "-9") ; 90 clockwise
+ (270 "-2")) ; 270 clockwise == -90
+ (number-to-string angle)))
+ rotation-failed)
+ ;; Try to rotate image with exiftran even with helm-ff-display-image-native.
+ (if (and helm-ff-rotate-image-program
+ (executable-find helm-ff-rotate-image-program))
+ (apply #'process-file helm-ff-rotate-image-program nil nil nil
+ (append helm-ff-rotate-image-switch
+ (list num-arg basename)))
+ (setq rotation-failed t))
+ ;; Display image in image-mode.
+ (if helm-ff-display-image-native
+ (if rotation-failed
+ ;; When rotation fails fallback to `image-rotate' with no
+ ;; transformation of file.
+ (with-selected-window (helm-persistent-action-display-window)
+ (condition-case _err
+ (with-no-warnings (image-rotate angle))
+ (wrong-number-of-arguments (image-rotate))))
+ (helm-ff--display-image-native file))
+ ;; Use image-dired to display image.
+ (when rotation-failed
+ (error "%s not found" (or helm-ff-rotate-image-program
+ "`helm-ff-rotate-image-program'")))
+ (when (buffer-live-p image-dired-display-image-buffer)
+ (kill-buffer image-dired-display-image-buffer))
+ (image-dired-display-image basename)
+ (message nil)
+ (display-buffer (get-buffer image-dired-display-image-buffer)))))
(defun helm-ff-rotate-image-left (candidate)
"Rotate image file CANDIDATE left.
@@ -4155,7 +4193,7 @@ This affects directly file CANDIDATE."
"Rotate image left without quitting helm."
(interactive)
(with-helm-alive-p
- (helm-attrset 'image-action1 'helm-ff-rotate-image-left)
+ (helm-set-attr 'image-action1 'helm-ff-rotate-image-left)
(helm-execute-persistent-action 'image-action1)))
(put 'helm-ff-rotate-left-persistent 'helm-only t)
@@ -4163,10 +4201,51 @@ This affects directly file CANDIDATE."
"Rotate image right without quitting helm."
(interactive)
(with-helm-alive-p
- (helm-attrset 'image-action2 'helm-ff-rotate-image-right)
+ (helm-set-attr 'image-action2 'helm-ff-rotate-image-right)
(helm-execute-persistent-action 'image-action2)))
(put 'helm-ff-rotate-right-persistent 'helm-only t)
+(defun helm-ff-resize-image-1 (arg)
+ ;; `image-decrease-size' and `image-increase-size' are not usable
+ ;; because they run directly `image--change-size' in a timer without
+ ;; taking care of the selected-window.
+ (cl-assert (and (fboundp 'image--change-size)
+ helm-ff-display-image-native)
+ nil "Resizing image not available")
+ (if (> arg 0)
+ (run-with-idle-timer
+ 0.3 nil
+ (lambda ()
+ (with-selected-window (helm-persistent-action-display-window)
+ (image--change-size 1.2))))
+ (run-with-idle-timer
+ 0.3 nil
+ (lambda ()
+ (with-selected-window (helm-persistent-action-display-window)
+ (image--change-size 0.8))))))
+
+(defun helm-ff-increase-image-size (_candidate)
+ (helm-ff-resize-image-1 1))
+
+(defun helm-ff-decrease-image-size (_candidate)
+ (helm-ff-resize-image-1 -1))
+
+(defun helm-ff-increase-image-size-persistent ()
+ "Increase image size without quitting helm."
+ (interactive)
+ (with-helm-alive-p
+ (helm-set-attr 'image-action3 'helm-ff-increase-image-size)
+ (helm-execute-persistent-action 'image-action3)))
+(put 'helm-ff-increase-image-size-persistent 'helm-only t)
+
+(defun helm-ff-decrease-image-size-persistent ()
+ "Decrease image size without quitting helm."
+ (interactive)
+ (with-helm-alive-p
+ (helm-set-attr 'image-action4 'helm-ff-decrease-image-size)
+ (helm-execute-persistent-action 'image-action4)))
+(put 'helm-ff-decrease-image-size-persistent 'helm-only t)
+
(defun helm-ff-exif-data (candidate)
"Extract exif data from file CANDIDATE using `helm-ff-exif-data-program'."
(if (and helm-ff-exif-data-program
@@ -4178,6 +4257,10 @@ This affects directly file CANDIDATE."
(format "No program %s found to extract exif"
helm-ff-exif-data-program)))
+(defvar helm-ff-image-native-buffer "*image-native-display*")
+
+(defvar helm-ff-sound-file-extensions '("wav" "au"))
+
(cl-defun helm-find-files-persistent-action-if (candidate)
"Open subtree CANDIDATE without quitting helm.
If CANDIDATE is not a directory expand CANDIDATE filename.
@@ -4189,6 +4272,8 @@ file."
(let* ((follow (or (helm-follow-mode-p)
helm--temp-follow-flag))
(image-cand (string-match-p (image-file-name-regexp) candidate))
+ (sound-cand (member (file-name-extension candidate)
+ helm-ff-sound-file-extensions))
(selection (helm-get-selection))
(insert-in-minibuffer (lambda (fname)
(with-selected-window (or (active-minibuffer-window)
@@ -4198,12 +4283,14 @@ file."
(set-text-properties 0 (length fname)
nil fname)
(insert fname))))))
- (helm-attrset 'candidate-number-limit helm-ff-candidate-number-limit)
+ (helm-set-attr 'candidate-number-limit helm-ff-candidate-number-limit)
(unless image-cand
(when follow
(helm-follow-mode -1)
(cl-return-from helm-find-files-persistent-action-if
- (message "Helm-follow-mode allowed only on images, disabling"))))
+ (prog1
+ #'ignore
+ (message "Helm-follow-mode allowed only on images, disabling")))))
(cond ((and (helm-ff--invalid-tramp-name-p)
(string-match helm-tramp-file-name-regexp candidate))
(cons (lambda (_candidate)
@@ -4217,6 +4304,7 @@ file."
;; unless a prefix arg is given.
(and (file-directory-p candidate) (file-symlink-p candidate))
(cons (lambda (_candidate)
+ (helm-ff-after-persistent-show-all)
(funcall insert-in-minibuffer
(file-name-as-directory
(if current-prefix-arg
@@ -4226,6 +4314,7 @@ file."
;; A directory, open it.
((file-directory-p candidate)
(cons (lambda (_candidate)
+ (helm-ff-after-persistent-show-all)
(when (string= (helm-basename candidate) "..")
(setq helm-ff-last-expanded helm-ff-default-directory))
(funcall insert-in-minibuffer (file-name-as-directory
@@ -4245,42 +4334,44 @@ file."
(funcall insert-in-minibuffer selection)
(helm-check-minibuffer-input)) ; Force update.
'never-split))
- ;; An image file and it is the second hit on C-j,
- ;; show the file in `image-dired'.
+ (sound-cand (lambda (candidate) (play-sound-file candidate)))
+ ;; An image file and it is the second hit on C-j, display it.
(image-cand
- (lambda (_candidate)
- (require 'image-dired)
- (let* ((win (get-buffer-window
- image-dired-display-image-buffer 'visible))
- (fname (and win
- (with-selected-window win
- (get-text-property (point-min)
- 'original-file-name))))
- (remove-buf-only (and win
- fname
- (with-helm-buffer
- (file-equal-p candidate fname)))))
- (when remove-buf-only
- (with-helm-window
- (if (and helm-persistent-action-display-window
- (window-dedicated-p (next-window win 1)))
- (delete-window helm-persistent-action-display-window)
- (set-window-buffer win helm-current-buffer))))
- (when (buffer-live-p (get-buffer image-dired-display-image-buffer))
- (kill-buffer image-dired-display-image-buffer))
- (unless remove-buf-only
- ;; Fix emacs bug never fixed upstream.
- (unless (file-directory-p image-dired-dir)
- (make-directory image-dired-dir))
- (switch-to-buffer image-dired-display-image-buffer)
- (message "Resizing image...")
- (cl-letf (((symbol-function 'message) #'ignore))
- (image-dired-display-image candidate))
- (message "Resizing image done")
- (with-current-buffer image-dired-display-image-buffer
- (let ((exif-data (helm-ff-exif-data candidate)))
- (setq default-directory helm-ff-default-directory)
- (image-dired-update-property 'help-echo exif-data)))))))
+ (if helm-ff-display-image-native
+ #'helm-ff--display-or-kill-image-native
+ (lambda (_candidate)
+ (require 'image-dired)
+ (let* ((win (get-buffer-window
+ image-dired-display-image-buffer 'visible))
+ (fname (and win
+ (with-selected-window win
+ (get-text-property (point-min)
+ 'original-file-name))))
+ (remove-buf-only (and win
+ fname
+ (with-helm-buffer
+ (file-equal-p candidate fname)))))
+ (when remove-buf-only
+ (with-helm-window
+ (if (and helm-persistent-action-display-window
+ (window-dedicated-p (next-window win 1)))
+ (delete-window helm-persistent-action-display-window)
+ (set-window-buffer win helm-current-buffer))))
+ (when (buffer-live-p (get-buffer image-dired-display-image-buffer))
+ (kill-buffer image-dired-display-image-buffer))
+ (unless remove-buf-only
+ ;; Fix emacs bug never fixed upstream.
+ (unless (file-directory-p image-dired-dir)
+ (make-directory image-dired-dir))
+ (switch-to-buffer image-dired-display-image-buffer)
+ (message "Resizing image...")
+ (cl-letf (((symbol-function 'message) #'ignore))
+ (image-dired-display-image candidate))
+ (message "Resizing image done")
+ (with-current-buffer image-dired-display-image-buffer
+ (let ((exif-data (helm-ff-exif-data candidate)))
+ (setq default-directory helm-ff-default-directory)
+ (image-dired-update-property 'help-echo exif-data))))))))
;; Allow browsing archive on avfs fs.
;; Assume volume is already mounted with mountavfs.
((helm-aand helm-ff-avfs-directory
@@ -4316,9 +4407,33 @@ file."
;; On second hit we open file.
;; On Third hit we kill it's buffer maybe.
(t
- (lambda (_candidate)
+ (lambda (candidate)
(funcall helm-ff-kill-or-find-buffer-fname-fn candidate))))))
+(defun helm-ff--display-or-kill-image-native (candidate)
+ ;; Display images in same buffer
+ ;; `helm-ff-image-native-buffer'.
+ (if (and (buffer-live-p (get-buffer helm-ff-image-native-buffer))
+ (file-equal-p (buffer-file-name
+ (get-buffer helm-ff-image-native-buffer))
+ candidate)
+ ;; Allow redisplaying
+ ;; `helm-ff-image-native-buffer' when it
+ ;; already exists and display same image as candidate.
+ (get-buffer-window helm-ff-image-native-buffer 'visible))
+ (progn
+ (set-window-buffer
+ helm-persistent-action-display-window helm-current-buffer)
+ (kill-buffer helm-ff-image-native-buffer))
+ (helm-ff--display-image-native candidate)))
+
+(defun helm-ff--display-image-native (candidate)
+ (and (buffer-live-p (get-buffer helm-ff-image-native-buffer))
+ (kill-buffer helm-ff-image-native-buffer))
+ (cl-letf (((symbol-function 'message) #'ignore))
+ (find-file candidate))
+ (with-current-buffer (get-file-buffer candidate)
+ (rename-buffer helm-ff-image-native-buffer)))
;;; Recursive dirs completion
;;
@@ -4493,7 +4608,7 @@ Use it for non-interactive calls of `helm-find-files'."
;; [FIXME] When `helm-find-files-1' is used directly from lisp
;; and FNAME is an abbreviated path, for some reasons
;; `helm-update' is called many times before resolving
- ;; the abbreviated path (Issue #1939) so be sure to pass a
+ ;; the abbreviated path (Bug#1939) so be sure to pass a
;; full path to helm-find-files-1.
(unless (string-match-p helm-ff-url-regexp fname)
(setq fname (expand-file-name (substitute-in-file-name fname))))
@@ -4511,8 +4626,8 @@ Use it for non-interactive calls of `helm-find-files'."
(unless helm-source-find-files
(setq helm-source-find-files (helm-make-source
"Find Files" 'helm-source-ffiles)))
- (when (helm-attr 'follow helm-source-find-files)
- (helm-attrset 'follow -1 helm-source-find-files))
+ (when (helm-get-attr 'follow helm-source-find-files)
+ (helm-set-attr 'follow -1 helm-source-find-files))
(helm-ff-setup-update-hook)
(add-hook 'helm-resume-after-hook 'helm-ff--update-resume-after-hook)
(unwind-protect
@@ -4534,7 +4649,7 @@ When NOHOOK is non-nil run inconditionally, otherwise only when
source is `helm-source-find-files'."
(when (or nohook (string= "Find Files"
(assoc-default 'name (car sources))))
- (helm-attrset 'resume `(lambda ()
+ (helm-set-attr 'resume `(lambda ()
(helm-ff-setup-update-hook)
(setq helm-ff-default-directory
,helm-ff-default-directory
@@ -4555,41 +4670,15 @@ source is `helm-source-find-files'."
helm-ff-auto-expand-to-home-or-root))
(add-hook 'helm-after-update-hook hook)))
-(defun helm-ff--cleanup-cache ()
- "Remove entries from cache according to `helm-ff-keep-cached-candidates'."
- (cl-ecase helm-ff-keep-cached-candidates
- ((all t)
- (maphash (lambda (k _v)
- ;; Keep all but non existing files but don't call
- ;; `file-exists-p' on remote files to avoid triggering
- ;; a tramp connection [1].
- (when (and (not (file-remote-p k))
- (not (file-exists-p k)))
- (remhash k helm-ff--list-directory-cache)))
- helm-ff--list-directory-cache))
- (local
- (maphash (lambda (k _v)
- ;; Same comment as [1].
- (when (or (file-remote-p k)
- (not (file-exists-p k)))
- (remhash k helm-ff--list-directory-cache)))
- helm-ff--list-directory-cache))
- (remote
- (maphash (lambda (k _v)
- (unless (file-remote-p k)
- (remhash k helm-ff--list-directory-cache)))
- helm-ff--list-directory-cache))
- ((nil)
- (clrhash helm-ff--list-directory-cache))))
-
(defun helm-find-files-cleanup ()
- (helm-ff--cleanup-cache)
(mapc (lambda (hook)
(remove-hook 'helm-after-update-hook hook))
'(helm-ff-auto-expand-to-home-or-root
helm-ff-update-when-only-one-matched
helm-ff-move-to-first-real-candidate
- helm-ff-clean-initial-input)))
+ helm-ff-clean-initial-input))
+ (setq helm-ff--show-directories-only nil
+ helm-ff--show-files-only nil))
(defun helm-ff-bookmark ()
(helm :sources 'helm-source-bookmark-helm-find-files
@@ -4609,27 +4698,30 @@ source is `helm-source-find-files'."
("" nil)
(t it))))
(unless (eq major-mode 'image-mode)
- (or (and input (or (and (file-remote-p input) input)
- (expand-file-name input)))
- (helm-find-files-input
- (if (and helm-ff-allow-non-existing-file-at-point
- guesser
- (not (string-match ffap-url-regexp guesser)))
- ;; Keep the ability of jumping to numbered lines even
- ;; when allowing non existing filenames at point.
- (helm-aand guesser
- (thing-at-point 'filename)
- (replace-regexp-in-string
- ":[0-9]+\\'" "" it))
- guesser)
- (thing-at-point 'filename))))))
+ (if input
+ (if (or (file-remote-p input)
+ (string-match helm-ff-url-regexp input))
+ input
+ (expand-file-name input))
+ (helm-find-files-input
+ (if (and helm-ff-allow-non-existing-file-at-point
+ guesser
+ (not (string-match ffap-url-regexp guesser)))
+ ;; Keep the ability of jumping to numbered lines even
+ ;; when allowing non existing filenames at point.
+ (helm-aand guesser
+ (thing-at-point 'filename)
+ (replace-regexp-in-string
+ ":[0-9]+\\'" "" it))
+ guesser)
+ (thing-at-point 'filename))))))
(defun helm-ffap-guesser ()
"Same as `ffap-guesser' but without gopher and machine support."
(require 'ffap)
;; Avoid "Stack overflow in regexp matcher" error
;; in evil `ffap-guesser' by removing crap `ffap-gopher-at-point'
- ;; (bug fixed in emacs-26 #25391) .
+ ;; (bug fixed in emacs-26 http://debbugs.gnu.org/cgi/bugreport.cgi?bug=25391) .
;; `ffap-machine-at-point' have been removed too as it was anyway
;; disabled with `ffap-machine-p-known' bound to 'reject.
;; `ffap-file-at-point' can be neutralized with
@@ -4749,13 +4841,13 @@ Find inside `require' and `declare-function' sexp."
when (eq (car (file-attributes cd)) t)
return cd)))
-(cl-defun helm-dired-action (candidate
+(cl-defun helm-dired-action (destination
&key action follow (files (dired-get-marked-files)))
- "Execute ACTION on FILES to CANDIDATE.
+ "Execute ACTION on FILES to DESTINATION.
Where ACTION is a symbol that can be one of:
'copy, 'rename, 'symlink,'relsymlink, 'hardlink or 'backup.
Argument FOLLOW when non-nil specifies to follow FILES to
-destination for the actions copy and rename."
+DESTINATION for the actions copy and rename."
(require 'dired-async)
(require 'dired-x) ; For dired-keep-marker-relsymlink
(when (get-buffer dired-log-buffer) (kill-buffer dired-log-buffer))
@@ -4778,51 +4870,55 @@ destination for the actions copy and rename."
(hardlink dired-keep-marker-hardlink)))
(dirflag (and (= (length files) 1)
(file-directory-p (car files))
- (not (file-directory-p candidate))))
+ (not (file-directory-p destination))))
(dired-async-state (if (and (boundp 'dired-async-mode)
dired-async-mode)
1 -1)))
(and follow (fboundp 'dired-async-mode) (dired-async-mode -1))
- (when (and (cdr files) (not (file-directory-p candidate)))
- (error "%s: target `%s' is not a directory" action candidate))
+ (when (and (cdr files) (not (file-directory-p destination)))
+ (error "%s: target `%s' is not a directory" action destination))
(unwind-protect
(dired-create-files
fn (symbol-name action) files
- ;; CANDIDATE is the destination.
- (if (file-directory-p candidate)
- ;; When CANDIDATE is a directory, build file-name in this directory.
- ;; Else we use CANDIDATE.
+ (if (file-directory-p destination)
+ ;; When DESTINATION is a directory, build file-name in this directory.
+ ;; Else we use DESTINATION.
(lambda (from)
- (expand-file-name (file-name-nondirectory from) candidate))
- (lambda (_from) candidate))
+ (expand-file-name (file-name-nondirectory from) destination))
+ (lambda (_from) destination))
marker)
(and (fboundp 'dired-async-mode)
(dired-async-mode dired-async-state)))
(push (file-name-as-directory
- (if (file-directory-p candidate)
- (expand-file-name candidate)
- (file-name-directory candidate)))
+ (if (file-directory-p destination)
+ (expand-file-name destination)
+ (file-name-directory destination)))
helm-ff-history)
;; If follow is non--nil we should not be in async mode.
(when (and follow
(not (memq action '(symlink relsymlink hardlink)))
(not (get-buffer dired-log-buffer)))
- (let ((target (directory-file-name candidate)))
+ (let ((target (directory-file-name destination)))
(unwind-protect
(progn
(setq helm-ff-cand-to-mark
- (helm-get-dest-fnames-from-list files candidate dirflag))
+ (helm-get-dest-fnames-from-list files destination dirflag))
(with-helm-after-update-hook (helm-ff-maybe-mark-candidates))
- ;; Refresh directory even if helm-ff-cache-mode is
- ;; enabled, it will not have the time to update
- ;; destination directory.
- (helm-ff-directory-files candidate t)
- (if (and dirflag (eq action 'rename))
- (helm-find-files-1 (file-name-directory target)
- (if helm-ff-transformer-show-only-basename
- (helm-basename target) target))
- (helm-find-files-1 (file-name-as-directory
- (expand-file-name candidate)))))
+ ;; Wait for the notify callback ends before calling HFF.
+ (run-at-time
+ 0.1 nil
+ (lambda ()
+ (if (and dirflag (eq action 'rename))
+ (helm-find-files-1 (file-name-directory target)
+ (if helm-ff-transformer-show-only-basename
+ (helm-basename target) target))
+ (helm-find-files-1 (if (file-directory-p destination)
+ (file-name-as-directory
+ (expand-file-name destination))
+ (expand-file-name (helm-basedir destination)))
+ (if helm-ff-transformer-show-only-basename
+ (helm-basename (car files))
+ (car files)))))))
(setq helm-ff-cand-to-mark nil))))))
(defun helm-get-dest-fnames-from-list (flist dest-cand rename-dir-flag)
@@ -4889,16 +4985,41 @@ Return non-nil when FILE needs to be trashed."
(or (and remote helm-trash-remote-files)
(null remote))))))
+(defun helm-trash-directory ()
+ "Try to find a trash directory.
+Return the files subdirectory of trash directory.
+When `helm-trash-default-directory' is set use it as trash directory."
+ (let ((xdg-data-dir
+ (or helm-trash-default-directory
+ (directory-file-name
+ (expand-file-name "Trash"
+ (or (getenv "XDG_DATA_HOME")
+ "~/.local/share"))))))
+ (expand-file-name "files" xdg-data-dir)))
+
+(defun helm-ff-file-already-trashed (file &optional trash-alist)
+ "Return FILE when it is already in trash.
+
+Optional arg TRASH-ALIST should be an alist as what
+`helm-ff-trash-list' returns."
+ (unless (fboundp 'system-move-file-to-trash)
+ (let ((trash-files-dir (helm-trash-directory)))
+ (cl-loop for (_bn . fn) in (or trash-alist
+ (helm-ff-trash-list trash-files-dir))
+ thereis (file-equal-p file fn)))))
+
(defun helm-ff-quick-delete (_candidate)
"Delete file CANDIDATE without quitting.
When a prefix arg is given, meaning of
`delete-by-moving-to-trash' is the opposite."
(with-helm-window
- (let ((marked (helm-marked-candidates)))
+ (let* ((marked (helm-marked-candidates))
+ (trash (helm-ff--delete-by-moving-to-trash (car marked)))
+ (helm-ff--trashed-files
+ (and trash (helm-ff-trash-list (helm-trash-directory)))))
(unwind-protect
- (cl-loop with trash = (helm-ff--delete-by-moving-to-trash (car marked))
- for c in marked do
+ (cl-loop for c in marked do
(progn (helm-preselect
(concat "^" (regexp-quote
(if (and helm-ff-transformer-show-only-basename
@@ -4908,9 +5029,16 @@ When a prefix arg is given, meaning of
(format "Really %s file `%s'? "
(if trash "Trash" "Delete")
(abbreviate-file-name c)))
- (helm-delete-file
- c helm-ff-signal-error-on-dot-files 'synchro trash)
- (helm-delete-current-selection)
+ (helm-acase (helm-delete-file
+ c helm-ff-signal-error-on-dot-files 'synchro trash)
+ (skip
+ ;; This happens only when trying to
+ ;; trash a file already trashed.
+ (helm-delete-visible-mark (helm-this-visible-mark))
+ (if (helm-end-of-source-p)
+ (helm-previous-line)
+ (helm-next-line)))
+ (t (helm-delete-current-selection)))
(message nil)
(helm--remove-marked-and-update-mode-line c))))
(setq helm-marked-candidates nil
@@ -4949,9 +5077,18 @@ is nil."
(helm--reading-passwd-or-string t)
(file-attrs (file-attributes file))
(trash (or trash (helm-ff--delete-by-moving-to-trash file)))
- (delete-by-moving-to-trash trash))
- (cond ((and (eq (nth 0 file-attrs) t)
- (directory-files file t dired-re-no-dot))
+ (delete-by-moving-to-trash trash)
+ (already-trashed
+ (and trash (helm-ff-file-already-trashed
+ file helm-ff--trashed-files))))
+ (cond (already-trashed
+ ;; We use message here to avoid exiting loop when
+ ;; deleting more than one file.
+ (message "User error: `%s' is already trashed" file)
+ (sit-for 1.5)
+ (cl-return 'skip))
+ ((and (eq (nth 0 file-attrs) t)
+ (directory-files file t directory-files-no-dot-files-regexp))
;; Synchro means persistent deletion from HFF.
(if synchro
(when (or helm-ff-allow-recursive-deletes
@@ -4993,6 +5130,8 @@ When a prefix arg is given, meaning of
(let* ((files (helm-marked-candidates :with-wildcard t))
(len 0)
(trash (helm-ff--delete-by-moving-to-trash (car files)))
+ (helm-ff--trashed-files
+ (and trash (helm-ff-trash-list (helm-trash-directory))))
(prmt (if trash "Trash" "Delete"))
(old--allow-recursive-deletes helm-ff-allow-recursive-deletes))
(with-helm-display-marked-candidates
@@ -5011,8 +5150,6 @@ When a prefix arg is given, meaning of
(sleep-for 1))
(cl-incf len))))
(setq helm-ff-allow-recursive-deletes old--allow-recursive-deletes)))
- (unless helm-ff-cache-mode
- (helm-ff-refresh-cache))
(message "%s File(s) %s" len (if trash "trashed" "deleted"))))))
;;; Delete files async
@@ -5053,6 +5190,15 @@ When a prefix arg is given, meaning of
(sit-for 3)
(force-mode-line-update)))
+(defun helm-delete-async-kill-process ()
+ "Kill async process created by helm delete files async."
+ (interactive)
+ (let* ((processes (dired-async-processes))
+ (proc (car (last processes))))
+ (and proc (delete-process proc))
+ (unless (> (length processes) 1)
+ (helm-ff--delete-async-modeline-mode -1))))
+
(defun helm-delete-marked-files-async (_ignore)
"Same as `helm-delete-marked-files' but async.
@@ -5086,8 +5232,6 @@ directories are always deleted with no warnings."
(let ((last-nonmenu-event t))
(when (y-or-n-p (format "Kill buffer %s, too? " buf))
(kill-buffer buf)))))
- (unless helm-ff-cache-mode
- (helm-ff-refresh-cache))
(run-with-timer
0.1 nil
(lambda ()
@@ -5098,7 +5242,13 @@ directories are always deleted with no warnings."
result (length files))))))
;; Workaround emacs-26 bug with tramp see
;; https://github.com/jwiegley/emacs-async/issues/80.
- (async-quiet-switch "-q"))
+ (async-quiet-switch "-q")
+ (trash-alist (and trash (helm-ff-trash-list (helm-trash-directory))))
+ (already-trashed
+ (and trash
+ (cl-loop for f in files
+ when (helm-ff-file-already-trashed f trash-alist)
+ collect f))))
(setq helm-ff--trash-flag trash)
(with-helm-display-marked-candidates
helm-marked-buffer-name
@@ -5107,6 +5257,7 @@ directories are always deleted with no warnings."
(message "(No deletions performed)")
(async-start
`(lambda ()
+ (require 'cl-lib)
;; `delete-by-moving-to-trash' have to be set globally,
;; using the TRASH argument of delete-file or
;; delete-directory is not enough.
@@ -5114,7 +5265,11 @@ directories are always deleted with no warnings."
(let ((result 0))
(dolist (file ',files result)
(condition-case err
- (cond ((eq (nth 0 (file-attributes file)) t)
+ (cond ((and ,trash
+ (cl-loop for f in ',already-trashed
+ thereis (file-equal-p f file)))
+ (error (format "`%s' is already trashed" file)))
+ ((eq (nth 0 (file-attributes file)) t)
(delete-directory file 'recursive ,trash)
(setq result (1+ result)))
(t (delete-file file ,trash)
@@ -5415,7 +5570,7 @@ Use FD as backend."
(defun helm-browse-project-ag (_candidate)
"A `helm-grep' AG action for `helm-browse-project'."
- (let ((dir (with-helm-buffer (helm-attr 'root-dir))))
+ (let ((dir (with-helm-buffer (helm-get-attr 'root-dir))))
(helm-grep-ag dir helm-current-prefix-arg)))
(defun helm-browse-project-run-ag ()
@@ -5448,7 +5603,7 @@ Use FD as backend."
"Class to define a source in `helm-browse-project' handling non
VC handled directories.")
-(defmethod helm--setup-source :after ((source helm-browse-project-override-inheritor))
+(cl-defmethod helm--setup-source :after ((source helm-browse-project-override-inheritor))
(let ((actions (slot-value source 'action)))
(setf (slot-value source 'action)
(helm-append-at-nth
@@ -5601,7 +5756,9 @@ Don't call it from programs, use `helm-find-files-1' instead.
This is the starting point for nearly all actions you can do on
files."
(interactive "P")
- (let* ((hist (and arg helm-ff-history (helm-find-files-history nil)))
+ (let* (tramp-archive-enabled ; Disable tramp-archive which is
+ ; kicking in unexpectedly.
+ (hist (and arg helm-ff-history (helm-find-files-history nil)))
(smart-input (or hist (helm-find-files-initial-input)))
(default-input (expand-file-name (helm-current-directory)))
(input (cond ((and (null hist)
@@ -5617,7 +5774,7 @@ files."
((and (not (string= smart-input ""))
smart-input))
(t default-input)))
- (input-as-presel (null (nth 0 (file-attributes input))))
+ (input-as-presel (null (file-directory-p input)))
(presel (helm-aif (or hist
(and input-as-presel input)
(buffer-file-name (current-buffer))
@@ -5650,7 +5807,7 @@ files."
"Allow deleting tramp connection or marked tramp connections at once.
This replace `tramp-cleanup-connection' which is partially broken
-in Emacs < to 25.1.50.1 (See Emacs Bug#24432).
+in Emacs < to 25.1.50.1 (See Emacs bug http://debbugs.gnu.org/cgi/bugreport.cgi?bug=24432).
It allows additionally to delete more than one connection at
once."
@@ -5679,10 +5836,4 @@ once."
(provide 'helm-files)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-files.el ends here
diff --git a/helm-find.el b/helm-find.el
index 67b0d40a..748d7021 100644
--- a/helm-find.el
+++ b/helm-find.el
@@ -1,6 +1,6 @@
;;; helm-find.el --- helm interface for find command. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -167,10 +167,4 @@ are passed to \"find\" literally."
(provide 'helm-find)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-find.el ends here
diff --git a/helm-font.el b/helm-font.el
index 3475fbfa..96338a1b 100644
--- a/helm-font.el
+++ b/helm-font.el
@@ -1,6 +1,6 @@
;;; helm-font --- Font and ucs selection for Helm -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -259,28 +259,28 @@ name."
(defun helm-ucs-persistent-forward ()
(interactive)
(with-helm-alive-p
- (helm-attrset 'action-forward 'helm-ucs-forward-char)
+ (helm-set-attr 'action-forward 'helm-ucs-forward-char)
(helm-execute-persistent-action 'action-forward)))
(put 'helm-ucs-persistent-forward 'helm-only t)
(defun helm-ucs-persistent-backward ()
(interactive)
(with-helm-alive-p
- (helm-attrset 'action-back 'helm-ucs-backward-char)
+ (helm-set-attr 'action-back 'helm-ucs-backward-char)
(helm-execute-persistent-action 'action-back)))
(put 'helm-ucs-persistent-backward 'helm-only t)
(defun helm-ucs-persistent-delete ()
(interactive)
(with-helm-alive-p
- (helm-attrset 'action-delete 'helm-ucs-delete-backward)
+ (helm-set-attr 'action-delete 'helm-ucs-delete-backward)
(helm-execute-persistent-action 'action-delete)))
(put 'helm-ucs-persistent-delete 'helm-only t)
(defun helm-ucs-persistent-insert-space ()
(interactive)
(with-helm-alive-p
- (helm-attrset 'action-insert-space 'helm-ucs-insert-space)
+ (helm-set-attr 'action-insert-space 'helm-ucs-insert-space)
(helm-execute-persistent-action 'action-insert-space)))
(defvar helm-source-ucs-recent
@@ -330,10 +330,4 @@ Called with a prefix arg force reloading cache."
(provide 'helm-font)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-font.el ends here
diff --git a/helm-for-files.el b/helm-for-files.el
index fd090f95..a0c0f61e 100644
--- a/helm-for-files.el
+++ b/helm-for-files.el
@@ -1,6 +1,6 @@
;;; helm-for-files.el --- helm-for-files and related. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -128,7 +128,7 @@ Be aware that a nil value will make tramp display very slow."
(migemo :initform t)
(persistent-action :initform 'helm-ff-kill-or-find-buffer-fname)))
-(defmethod helm--setup-source :after ((source helm-recentf-source))
+(cl-defmethod helm--setup-source :after ((source helm-recentf-source))
(setf (slot-value source 'action)
(append (symbol-value (helm-actions-from-type-file))
'(("Delete file(s) from recentf" .
@@ -174,7 +174,7 @@ Colorize only symlinks, directories and files."
;; Call file-attributes only if:
;; - file is not remote
;; - helm-for-files--tramp-not-fancy is nil and file is remote AND
- ;; connected. (Issue #1679)
+ ;; connected. (Bug#1679)
for type = (and (or (null isremote)
(and (null helm-for-files-tramp-not-fancy)
(file-remote-p i nil t)))
@@ -300,10 +300,4 @@ searching for is already found."
(provide 'helm-for-files)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-for-files.el ends here
diff --git a/helm-global-bindings.el b/helm-global-bindings.el
index 458bd148..1f4dd044 100644
--- a/helm-global-bindings.el
+++ b/helm-global-bindings.el
@@ -1,6 +1,6 @@
;;; helm-global-bindings.el --- Bind global helm commands -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -119,10 +119,4 @@
(provide 'helm-global-bindings)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-global-bindings.el ends here
diff --git a/helm-grep.el b/helm-grep.el
index 71d31ff8..3547ee35 100644
--- a/helm-grep.el
+++ b/helm-grep.el
@@ -1,6 +1,6 @@
;;; helm-grep.el --- Helm Incremental Grep. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -434,7 +434,7 @@ It is intended to use as a let-bound variable, DON'T set this globaly.")
;; When user mark files and use recursion with grep
;; backend enabled, the loop collect on each marked
;; candidate its `file-name-directory' and we endup with
- ;; duplicates (Issue #1714). FIXME: For now as a quick fix
+ ;; duplicates (Bug#1714). FIXME: For now as a quick fix
;; I just remove dups here but I should handle this inside
;; the cond above.
(setq files (helm-fast-remove-dups files :test 'equal))
@@ -818,7 +818,7 @@ If N is positive go forward otherwise go backward."
(setq default-directory (or helm-ff-default-directory
(helm-default-directory)
default-directory))
- (setq-local helm-grep-mode-use-pcre (helm-attr 'pcre src))
+ (setq-local helm-grep-mode-use-pcre (helm-get-attr 'pcre src))
(setq buffer-read-only t)
(let ((inhibit-read-only t)
(map (make-sparse-keymap)))
@@ -954,7 +954,7 @@ Special commands:
"Return a list of known ack-grep types."
(with-temp-buffer
;; "--help-types" works with both 1.96 and 2.1+, while
- ;; "--help types" works only with 1.96 Issue #422.
+ ;; "--help types" works only with 1.96 Bug#422.
;; `helm-grep-command' should return the ack executable
;; when this function is used in the right context
;; i.e After checking is we are using ack-grep with
@@ -1075,8 +1075,8 @@ of grep."
(defvar helm-source-grep nil)
-(defmethod helm--setup-source ((source helm-grep-class))
- (call-next-method)
+(cl-defmethod helm--setup-source ((source helm-grep-class))
+ (cl-call-next-method)
(helm-aif (and helm-follow-mode-persistent
(if (eq (slot-value source 'backend) 'git)
helm-source-grep-git
@@ -1220,7 +1220,7 @@ matching `helm-zgrep-file-extension-regexp' only."
;; Filename should always be provided as a local
;; path, if the root directory is remote, the
;; tramp prefix will be added before executing
- ;; action, see `helm-grep-action' and issue #2032.
+ ;; action, see `helm-grep-action' and Bug#2032.
(expand-file-name (car split)
(or (file-remote-p root 'localname)
root))
@@ -1265,7 +1265,7 @@ matching `helm-zgrep-file-extension-regexp' only."
(and (null (eq major-mode 'helm-grep-mode))
(helm-default-directory))
default-directory))))
- (pcre (helm-attr 'pcre source)))
+ (pcre (helm-get-attr 'pcre source)))
(cl-loop for c in candidates
collect (helm-grep--filter-candidate-1 c nil pcre))))
@@ -1274,7 +1274,7 @@ matching `helm-zgrep-file-extension-regexp' only."
(let (beg end)
(condition-case-unless-debug nil
(with-temp-buffer
- (insert (propertize str 'read-only nil)) ; Fix (#1176)
+ (insert (propertize str 'read-only nil)) ; Fix bug#1176
(goto-char (point-min))
(cl-loop for reg in
(cl-loop for r in (helm-mm-split-pattern
@@ -1624,8 +1624,8 @@ returns if available with current AG version."
(defvar helm-source-grep-ag nil)
-(defmethod helm--setup-source ((source helm-grep-ag-class))
- (call-next-method)
+(cl-defmethod helm--setup-source ((source helm-grep-ag-class))
+ (cl-call-next-method)
(helm-aif (and helm-follow-mode-persistent
helm-source-grep-ag
(assoc-default 'follow helm-source-grep-ag))
@@ -1721,10 +1721,4 @@ With a prefix arg ARG git-grep the whole repository."
(provide 'helm-grep)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-grep.el ends here
diff --git a/helm-help.el b/helm-help.el
index 6ffeaed2..097e6ae2 100644
--- a/helm-help.el
+++ b/helm-help.el
@@ -1,6 +1,6 @@
;;; helm-help.el --- Help messages for Helm. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -67,9 +67,10 @@ Find here the documentation of all documented sources."
(set-buffer buf)
(let ((inhibit-read-only t))
(erase-buffer)
- (cl-loop for elm in helm-help--string-list
- for str = (helm-interpret-value elm)
- do (insert (substitute-command-keys str) "\n\n"))
+ (save-excursion
+ (cl-loop for elm in helm-help--string-list
+ for str = (helm-interpret-value elm)
+ do (insert (substitute-command-keys str) "\n\n")))
(org-mode))
(setq buffer-read-only t)
(view-mode)))
@@ -111,13 +112,13 @@ Negation are supported i.e. \"!\".
When you specify more than one of such patterns, it will match
buffers with contents matching each of these patterns i.e. AND,
-not OR. That's mean that if you specify \"@foo @bar\" the
-contents of buffer will have to be matched by foo AND bar. If
-you specify \"@foo @!bar\" it means the contents of buffer have
-to be matched by foo but NOT bar.
+not OR. That means that if you specify \"@foo @bar\" the contents
+of buffer will have to be matched by foo AND bar. If you specify
+\"@foo @!bar\" it means the contents of the buffer have to be
+matched by foo but NOT bar.
If you enter a pattern prefixed with an escaped \"@\", Helm searches for a
-buffer matching \"@pattern\" but does not search inside.
+buffer matching \"@pattern\" but does not search inside the buffer.
**** Search by directory name
@@ -133,9 +134,11 @@ Starting from Helm v1.6.8, you can specify more than one directory.
**** Fuzzy matching
-`helm-buffers-fuzzy-matching' turns on fuzzy matching on buffer names, but not
-on directory names or major modes. A pattern starting with \"^\" disables fuzzy
-matching and matches by exact regexp.
+`helm-buffers-fuzzy-matching' turns on fuzzy matching on buffer
+names, but not on directory names or major modes. A pattern
+starting with \"^\" disables fuzzy matching and matching is done
+litteraly IOW do not use regexps (\"^\" or whatever special
+regexp character) when you want to fuzzy match.
**** Examples
@@ -195,8 +198,8 @@ If buffer is associated to a file and is modified, it is by default colorized in
see [[Meaning of colors and prefixes for buffers][Meaning of colors and prefixes for buffers]].
You can save these buffers with \\<helm-buffer-map>\\[helm-buffer-save-persistent].
If you want to save all these buffers, you can mark them with \\[helm-buffers-mark-similar-buffers]
-and save them with \\[helm-buffer-save-persistent], you can also do this in one step with
-\\[helm-buffer-run-save-some-buffers], note that you will not be asked for confirmation.
+and save them with \\[helm-buffer-save-persistent]. You can also do this in one step with
+\\[helm-buffer-run-save-some-buffers]. Note that you will not be asked for confirmation.
*** Meaning of colors and prefixes for buffers
@@ -209,27 +212,29 @@ Yellow => Tramp archive buffer.
** Commands
\\<helm-buffer-map>
-\\[helm-buffer-run-zgrep]\t\tGrep Buffer(s) works as zgrep too (`\\[universal-argument]' to grep all buffers but non-file buffers).
-\\[helm-buffers-run-multi-occur]\t\tMulti-Occur buffer or marked buffers (`\\[universal-argument]' to toggle force-searching current-buffer).
-\\[helm-buffer-switch-other-window]\t\tSwitch to other window.
-\\[helm-buffer-switch-other-frame]\t\tSwitch to other frame.
-\\[helm-buffers-run-browse-project]\t\tBrowse project from buffer.
-\\[helm-buffer-run-query-replace-regexp]\t\tQuery-replace-regexp in marked buffers.
-\\[helm-buffer-run-query-replace]\t\tQuery-replace in marked buffers.
-\\[helm-buffer-run-ediff]\t\tEdiff current buffer with candidate. With two marked buffers, ediff those buffers.
-\\[helm-buffer-run-ediff-merge]\t\tEdiff-merge current buffer with candidate. With two marked buffers, ediff-merge those buffers.
-\\[helm-buffer-diff-persistent]\t\tToggle Diff-buffer with saved file without leaving Helm.
-\\[helm-buffer-revert-persistent]\t\tRevert buffer without leaving Helm.
-\\[helm-buffer-save-persistent]\t\tSave buffer without leaving Helm.
-\\[helm-buffer-run-save-some-buffers]\t\tSave all unsaved buffers.
-\\[helm-buffer-run-kill-buffers]\t\tDelete marked buffers and leave Helm.
-\\[helm-buffer-run-kill-persistent]\t\tDelete buffer without leaving Helm.
-\\[helm-buffer-run-rename-buffer]\t\tRename buffer.
-\\[helm-toggle-all-marks]\t\tToggle all marks.
-\\[helm-mark-all]\t\tMark all.
-\\[helm-toggle-buffers-details]\t\tToggle details.
-\\[helm-buffers-toggle-show-hidden-buffers]\t\tShow hidden buffers.
-\\[helm-buffers-mark-similar-buffers]\t\tMark all buffers of the same type (color) as current buffer.")
+|Keys|Description|
+|-------------+----------|
+|\\[helm-buffer-run-zgrep]|Grep Buffer(s) works as zgrep too (`\\[universal-argument]' to grep all buffers but non-file buffers).
+|\\[helm-buffers-run-occur]|Multi-Occur buffer or marked buffers (`\\[universal-argument]' to toggle force-searching current-buffer).
+|\\[helm-buffer-switch-other-window]|Switch to other window.
+|\\[helm-buffer-switch-other-frame]|Switch to other frame.
+|\\[helm-buffers-run-browse-project]|Browse project from buffer.
+|\\[helm-buffer-run-query-replace-regexp]|Query-replace-regexp in marked buffers.
+|\\[helm-buffer-run-query-replace]|Query-replace in marked buffers.
+|\\[helm-buffer-run-ediff]|Ediff current buffer with candidate. With two marked buffers, ediff those buffers.
+|\\[helm-buffer-run-ediff-merge]|Ediff-merge current buffer with candidate. With two marked buffers, ediff-merge those buffers.
+|\\[helm-buffer-diff-persistent]|Toggle Diff-buffer with saved file without leaving Helm.
+|\\[helm-buffer-revert-persistent]|Revert buffer without leaving Helm.
+|\\[helm-buffer-save-persistent]|Save buffer without leaving Helm.
+|\\[helm-buffer-run-save-some-buffers]|Save all unsaved buffers.
+|\\[helm-buffer-run-kill-buffers]|Delete marked buffers and leave Helm.
+|\\[helm-buffer-run-kill-persistent]|Delete buffer without leaving Helm.
+|\\[helm-buffer-run-rename-buffer]|Rename buffer.
+|\\[helm-toggle-all-marks]|Toggle all marks.
+|\\[helm-mark-all]|Mark all.
+|\\[helm-toggle-buffers-details]|Toggle details.
+|\\[helm-buffers-toggle-show-hidden-buffers]|Show hidden buffers.
+|\\[helm-buffers-mark-similar-buffers]|Mark all buffers of the same type (color) as current buffer.")
;;; Find files help (`helm-find-files')
;;
@@ -259,21 +264,21 @@ On a symlinked directory a prefix argument expands to its true name.
***** `DEL' behavior
-`DEL' by default is deleting char backward.
+`DEL' by default deletes char backward.
But when `helm-ff-DEL-up-one-level-maybe' is non nil `DEL' behaves
-differently depending on the contents of helm-pattern. It goes up one
+differently depending on the contents of helm-pattern. It goes up one
level if the pattern is a directory ending with \"/\" or disables HFF
auto update and delete char backward if the pattern is a filename or
refers to a non existing path. Going up one level can be disabled
if necessary by deleting \"/\" at the end of the pattern using
\\<helm-map>\\[backward-char] and \\[helm-delete-minibuffer-contents].
-Note that when deleting char backward, helm takes care of
+Note that when deleting char backward, Helm takes care of
disabling update giving you the opportunity to edit your pattern for
e.g. renaming a file or creating a new file or directory.
When `helm-ff-auto-update-initial-value' is non nil you may want to
-disable it temporarily, see [[Toggle auto-completion with `C-c DEL'][Toggle auto-completion with `C-c DEL']] for this.
+disable it temporarily, see [[Toggle auto-completion][Toggle auto-completion]] for this.
**** Use `\\<helm-find-files-map>\\[helm-find-files-down-last-level]' to walk back the resulting tree of all the `\\<helm-find-files-map>\\[helm-find-files-up-one-level]' or DEL you did
@@ -289,10 +294,10 @@ It behaves differently depending on `helm-selection' (current candidate in helm-
- candidate is a file => Open it.
If you have marked candidates and you press RET on a directory,
-helm will navigate to this directory, if you want to exit with
-RET with default action with these marked candidates, press RET
-on a second time while you are on the root of this directory
-e.g. \"/home/you/dir/.\" or press RET on any file which is not a
+Helm will navigate to this directory. If you want to exit with
+RET with default action with these marked candidates, press RET a
+second time while you are on the root of this directory e.g.
+\"/home/you/dir/.\" or press RET on any file which is not a
directory. You can also exit with default action at any moment
with `f1'.
@@ -309,8 +314,8 @@ a new command for `TAB':
(define-key helm-find-files-map (kbd \"C-i\") 'helm-ff-TAB)
-It will then behave slighly differently
-depending of `helm-selection':
+It will then behave slighly differently depending of
+`helm-selection':
- candidate basename is \".\" => open the action menu.
- candidate is a directory => expand it (behave as \\<helm-map>\\[helm-execute-persistent-action]).
@@ -318,6 +323,13 @@ depending of `helm-selection':
Called with a prefix arg open menu unconditionally.
+*** Filter out files or directories
+
+You can show files or directories only with respectively
+\\<helm-find-files-map>\\[helm-ff-toggle-dirs-only] and \\<helm-find-files-map>\\[helm-ff-toggle-files-only].
+These are toggle commands i.e. filter/show_all.
+Changing directory disable filtering.
+
*** Sort directory contents
When listing a directory without narrowing its contents, i.e. when pattern ends with \"/\",
@@ -396,8 +408,6 @@ It starts from the third character of the pattern.
For instance \"fob\" or \"fbr\" will complete \"foobar\" but \"fb\" needs a
third character in order to complete it.
-*** Use `\\[universal-argument] \\[helm-execute-persistent-action]' or `\\[helm-follow-action-forward]' to display an image
-
*** `\\[helm-execute-persistent-action]' on a filename expands to that filename in the Helm buffer
Second hit displays the buffer filename.
@@ -406,10 +416,49 @@ Note: `\\[universal-argument] \\[helm-execute-persistent-action]' displays the b
*** Browse images directories with `helm-follow-mode' and navigate up/down
+Before Emacs-27 Helm was using image-dired that works with
+external ImageMagick tools. From Emacs-27 Helm use native
+display of images with image-mode by default for Emacs-27 (see `helm-ff-display-image-native'),
+this allows automatic resize when changing window size, zooming with `\\[helm-ff-increase-image-size-persistent]' and `\\[helm-ff-decrease-image-size-persistent]'
+and rotate images as before.
+
You can also use `helm-follow-action-forward' and `helm-follow-action-backward' with
`\\[helm-follow-action-forward]' and `\\[helm-follow-action-backward]' respectively.
+Note that these commands have different behavior when `helm-follow-mode'
+is enabled (go to next/previous line only).
+
+Use `\\[universal-argument] \\[helm-execute-persistent-action]' to display an image or kill its buffer.
+
+TIP: Use `\\<helm-map>\\[helm-toggle-resplit-and-swap-windows]' and `\\[helm-enlarge-window]' to display Helm window vertically
+and to enlarge it while viewing images.
+Note this may not work with exotic Helm windows settings such as the ones in Spacemacs.
+
+*** Open files externally
+
+- Open file with external program (`\\<helm-find-files-map>\\[helm-ff-run-open-file-externally]',`C-u' to choose).
+
+Helm is looking what is used by default to open file
+externally (mailcap files) but have its own variable
+`helm-external-programs-associations' to store external
+applications. If you call the action or its binding without
+prefix arg Helm will see if there is an application suitable in
+`helm-external-programs-associations', otherwise it will look in
+mailcap files. If you want to specify which external application
+to use (and its options) use a prefix arg.
+
+Note: What you configure for Helm in `helm-external-programs-associations'
+will take precedence on mailcap files.
+
+- Preview file with external program (`\\[helm-ff-run-preview-file-externally]').
+
+Same as above but doesn't quit Helm session, it is apersistent action.
+
+- Open file externally with default tool (`\\[helm-ff-run-open-file-with-default-tool]').
-*** Toggle auto-completion with `\\[helm-ff-run-toggle-auto-update]'
+This uses xdg-open which sucks most of the time, but perhaps it
+works fine on Windows. This is why it is kept in Helm.
+
+*** Toggle auto-completion
It is useful when trying to create a new file or directory and you don't want
Helm to complete what you are writing.
@@ -430,7 +479,7 @@ Note that when you enter a new name, this one is prefixed with
\[?] if you are in a writable directory. If you are in a directory
where you have no write permission the new file name is not
prefixed and is colored in red. There is not such distinction
-when using tramp, new filename just appear on top of buffer.
+when using Tramp, new filename just appears on top of buffer.
*** Recursive search from Helm-find-files
@@ -450,7 +499,7 @@ List all the files under this directory and other subdirectories
- With two prefix arguments:
Same but the cache is refreshed.
-**** You can start a recursive search with \"locate\" \"find\" or [[https://github.com/sharkdp/fd][Fd]]
+**** You can start a recursive search with \"locate\", \"find\" or [[https://github.com/sharkdp/fd][Fd]]
See \"Note\" in the [[Recursive completion on subdirectories][section on subdirectories]].
@@ -458,7 +507,7 @@ Using \"locate\", you can enable the local database with a prefix argument. If t
local database doesn't already exists, you will be prompted for its creation.
If it exists and you want to refresh it, give it two prefix args.
-When using locate the helm-buffer remains empty until you type something.
+When using locate the Helm buffer remains empty until you type something.
Regardless Helm uses the basename of the pattern entered in the helm-find-files
session by default. Hitting `\\[next-history-element]' should just kick in the
locate search with this pattern. If you want Helm to automatically do this, add
@@ -491,8 +540,9 @@ Examples:
- \"find %s -type d -name '*%s*'\"
- \"find %s -type d -regex .*%s.*$\"
-[[https://github.com/sharkdp/fd][Fd]] command is now also supported, it is regexp based and very fast, here is the
-command line to use:
+[[https://github.com/sharkdp/fd][Fd]] command is now also
+supported which is regexp based and very fast. Here is the command
+line to use:
- \"fd --hidden --type d .*%s.*$ %s\"
@@ -762,7 +812,10 @@ If Rsync is available, you can use it to copy/sync files or directories
with some restrictions though:
- Copying from/to tramp sudo method may not work (permissions).
-- Copying from remote to remote is not supported (rsync restriction).
+- Copying from remote to remote is not supported (rsync restriction)
+however you can mount a remote with sshfs and copy to it (best), otherwise you have to modify
+the command line with a prefix arg, see [[https://unix.stackexchange.com/questions/183504/how-to-rsync-files-between-two-remotes][how-to-rsync-files-between-two-remotes]]
+for the command line to use.
This command is mostly useful when copying large files as it is
fast, asynchronous and provide a progress bar in mode-line. Each
@@ -1068,74 +1121,81 @@ NOTE: This will slow down helm, be warned.
*** Helm-find-files is using a cache
Helm is caching each directory files list in a hash table for
-faster search. What is kept in the cache is defined by
-`helm-ff-keep-cached-candidates' variable. By default HFF keep
-all in the cache between its sessions but you can customize
-`helm-ff-keep-cached-candidates', do not use setq for this. When
-`helm-ff-keep-cached-candidates' is non nil HFF refreshes the
-cache automatically between its sessions when Emacs is idle, you
-should see a little icon brievly changing form when the cache is
-refreshed if you have set `helm-ff-cache-mode-lighter-updating'
-and `helm-ff-cache-mode-lighter-sleep' . You can also refresh a
-directory at anytime during your HFF sessions by hitting \\<helm-map>\\[helm-refresh].
+faster search, when a directory is modified it is removed from cache
+so that further visit in this directory refresh cache.
+You may have in some rare cases to refresh directory manually with `\\<helm-map>\\[helm-refresh]'
+for example when helm-find-files session is running and a file is modified/deleted
+in current visited directory by an external command from outside Emacs.
+
+NOTE: Helm is using file-notify to watch visited directories,
+nowaday most systems come with a notify package but if your
+system doesn't support this, you can turn off file notifications
+by customizing the variable `helm-ff-use-notify'. In this case
+you will have to refresh manually directories when needed with `\\<helm-map>\\[helm-refresh]'.
** Commands
\\<helm-find-files-map>
-\\[helm-ff-run-locate]\t\tRun `locate' (`\\[universal-argument]' to specify locate database, `M-n' to insert basename of candidate).
-\\[helm-ff-run-browse-project]\t\tBrowse project (`\\[universal-argument]' to recurse, `\\[universal-argument] \\[universal-argument]' to recurse and refresh database).
-\\[helm-ff-run-find-sh-command]\t\tRun `find' shell command from this directory.
-\\[helm-ff-run-grep]\t\tRun Grep (`\\[universal-argument]' to recurse).
-\\[helm-ff-run-pdfgrep]\t\tRun Pdfgrep on marked files.
-\\[helm-ff-run-zgrep]\t\tRun zgrep (`\\[universal-argument]' to recurse).
-\\[helm-ff-run-grep-ag]\t\tRun AG grep on current directory.
-\\[helm-ff-run-git-grep]\t\tRun git-grep on current directory.
-\\[helm-ff-run-gid]\t\tRun gid (id-utils).
-\\[helm-ff-run-etags]\t\tRun Etags (`\\[universal-argument]' to use thing-at-point, `\\[universal-argument] \\[universal-argument]' to reload cache).
-\\[helm-ff-run-rename-file]\t\tRename Files (`\\[universal-argument]' to follow).
-\\[helm-ff-run-query-replace-fnames-on-marked]\t\tQuery replace on marked files.
-\\[helm-ff-run-copy-file]\t\tCopy Files (`\\[universal-argument]' to follow).
-\\[helm-ff-run-rsync-file]\t\tRsync Files (`\\[universal-argument]' to edit command).
-\\[helm-ff-run-byte-compile-file]\t\tByte Compile Files (`\\[universal-argument]' to load).
-\\[helm-ff-run-load-file]\t\tLoad Files.
-\\[helm-ff-run-symlink-file]\t\tSymlink Files.
-\\[helm-ff-run-hardlink-file]\t\tHardlink files.
-\\[helm-ff-run-relsymlink-file]\t\tRelative symlink Files.
-\\[helm-ff-run-delete-file]\t\tDelete Files.
-\\[helm-ff-run-touch-files]\t\tTouch files.
-\\[helm-ff-run-kill-buffer-persistent]\t\tKill buffer candidate without leaving Helm.
-\\[helm-ff-persistent-delete]\t\tDelete file without leaving Helm.
-\\[helm-ff-run-switch-to-eshell]\t\tSwitch to Eshell.
-\\[helm-ff-run-eshell-command-on-file]\t\tEshell command on file (`\\[universal-argument]' to apply on marked files, otherwise treat them sequentially).
-\\[helm-ff-run-ediff-file]\t\tEdiff file.
-\\[helm-ff-run-ediff-merge-file]\t\tEdiff merge file.
-\\[helm-ff-run-complete-fn-at-point]\t\tComplete file name at point.
-\\[helm-ff-run-switch-other-window]\t\tSwitch to other window.
-\\[helm-ff-run-switch-other-frame]\t\tSwitch to other frame.
-\\[helm-ff-run-open-file-externally]\t\tOpen file with external program (`\\[universal-argument]' to choose).
-\\[helm-ff-run-preview-file-externally]\t\tPreview file with external program.
-\\[helm-ff-run-open-file-with-default-tool]\t\tOpen file externally with default tool.
-\\[helm-ff-rotate-left-persistent]\t\tRotate image left.
-\\[helm-ff-rotate-right-persistent]\t\tRotate image right.
-\\[helm-find-files-up-one-level]\t\tGo to parent directory.
-\\[helm-find-files-history]\t\tSwitch to the visited-directory history.
-\\[helm-ff-file-name-history]\t\tSwitch to file name history.
-\\[helm-ff-properties-persistent]\t\tShow file properties in a tooltip.
-\\[helm-mark-all]\t\tMark all visible candidates.
-\\[helm-ff-run-toggle-auto-update]\t\tToggle auto-expansion of directories.
-\\[helm-unmark-all]\t\tUnmark all candidates, visible and invisible ones.
-\\[helm-ff-run-mail-attach-files]\t\tAttach files to message buffer.
-\\[helm-ff-run-print-file]\t\tPrint file, (`\\[universal-argument]' to refresh printer list).
-\\[helm-enlarge-window]\t\tEnlarge Helm window.
-\\[helm-narrow-window]\t\tNarrow Helm window.
-\\[helm-ff-run-toggle-basename]\t\tToggle basename/fullpath.
-\\[helm-ff-run-find-file-as-root]\t\tFind file as root.
-\\[helm-ff-run-find-alternate-file]\t\tFind alternate file.
-\\[helm-ff-run-insert-org-link]\t\tInsert org link.
-\\[helm-ff-bookmark-set]\t\tSet bookmark to current directory.
-\\[helm-find-files-switch-to-bookmark]\t\tJump to bookmark list.
-\\[helm-ff-sort-alpha]\t\tSort alphabetically
-\\[helm-ff-sort-by-newest]\t\tSort by newest
-\\[helm-ff-sort-by-size]\t\tSort by size")
+|Keys|Description
+|-----------+----------|
+|\\[helm-ff-run-locate]|Run `locate' (`\\[universal-argument]' to specify locate database, `M-n' to insert basename of candidate).
+|\\[helm-ff-run-browse-project]|Browse project (`\\[universal-argument]' to recurse, `\\[universal-argument] \\[universal-argument]' to recurse and refresh database).
+|\\[helm-ff-run-find-sh-command]|Run `find' shell command from this directory.
+|\\[helm-ff-run-grep]|Run Grep (`\\[universal-argument]' to recurse).
+|\\[helm-ff-run-pdfgrep]|Run Pdfgrep on marked files.
+|\\[helm-ff-run-zgrep]|Run zgrep (`\\[universal-argument]' to recurse).
+|\\[helm-ff-run-grep-ag]|Run AG grep on current directory.
+|\\[helm-ff-run-git-grep]|Run git-grep on current directory.
+|\\[helm-ff-run-gid]|Run gid (id-utils).
+|\\[helm-ff-run-etags]|Run Etags (`\\[universal-argument]' to use thing-at-point, `\\[universal-argument] \\[universal-argument]' to reload cache).
+|\\[helm-ff-run-rename-file]|Rename Files (`\\[universal-argument]' to follow).
+|\\[helm-ff-run-query-replace-fnames-on-marked]|Query replace on marked files.
+|\\[helm-ff-run-copy-file]|Copy Files (`\\[universal-argument]' to follow).
+|\\[helm-ff-run-rsync-file]|Rsync Files (`\\[universal-argument]' to edit command).
+|\\[helm-ff-run-byte-compile-file]|Byte Compile Files (`\\[universal-argument]' to load).
+|\\[helm-ff-run-load-file]|Load Files.
+|\\[helm-ff-run-symlink-file]|Symlink Files.
+|\\[helm-ff-run-hardlink-file]|Hardlink files.
+|\\[helm-ff-run-relsymlink-file]|Relative symlink Files.
+|\\[helm-ff-run-delete-file]|Delete Files.
+|\\[helm-ff-run-touch-files]|Touch files.
+|\\[helm-ff-run-kill-buffer-persistent]|Kill buffer candidate without leaving Helm.
+|\\[helm-ff-persistent-delete]|Delete file without leaving Helm.
+|\\[helm-ff-run-switch-to-shell]|Switch to prefered shell.
+|\\[helm-ff-run-eshell-command-on-file]|Eshell command on file (`\\[universal-argument]' to apply on marked files, otherwise treat them sequentially).
+|\\[helm-ff-run-ediff-file]|Ediff file.
+|\\[helm-ff-run-ediff-merge-file]|Ediff merge file.
+|\\[helm-ff-run-complete-fn-at-point]|Complete file name at point.
+|\\[helm-ff-run-switch-other-window]|Switch to other window.
+|\\[helm-ff-run-switch-other-frame]|Switch to other frame.
+|\\[helm-ff-run-open-file-externally]|Open file with external program (`\\[universal-argument]' to choose).
+|\\[helm-ff-run-preview-file-externally]|Preview file with external program.
+|\\[helm-ff-run-open-file-with-default-tool]|Open file externally with default tool.
+|\\[helm-ff-rotate-left-persistent]|Rotate image left.
+|\\[helm-ff-rotate-right-persistent]|Rotate image right.
+|\\[helm-ff-increase-image-size-persistent]|Zoom in image.
+|\\[helm-ff-decrease-image-size-persistent]|Zoom out image.
+|\\[helm-find-files-up-one-level]|Go to parent directory.
+|\\[helm-find-files-history]|Switch to the visited-directory history.
+|\\[helm-ff-file-name-history]|Switch to file name history.
+|\\[helm-ff-properties-persistent]|Show file properties in a tooltip.
+|\\[helm-mark-all]|Mark all visible candidates.
+|\\[helm-ff-run-toggle-auto-update]|Toggle auto-expansion of directories.
+|\\[helm-unmark-all]|Unmark all candidates, visible and invisible ones.
+|\\[helm-ff-run-mail-attach-files]|Attach files to message buffer.
+|\\[helm-ff-run-print-file]|Print file, (`\\[universal-argument]' to refresh printer list).
+|\\[helm-enlarge-window]|Enlarge Helm window.
+|\\[helm-narrow-window]|Narrow Helm window.
+|\\[helm-ff-run-toggle-basename]|Toggle basename/fullpath.
+|\\[helm-ff-run-find-file-as-root]|Find file as root.
+|\\[helm-ff-run-find-alternate-file]|Find alternate file.
+|\\[helm-ff-run-insert-org-link]|Insert org link.
+|\\[helm-ff-bookmark-set]|Set bookmark to current directory.
+|\\[helm-find-files-switch-to-bookmark]|Jump to bookmark list.
+|\\[helm-ff-sort-alpha]|Sort alphabetically
+|\\[helm-ff-sort-by-newest]|Sort by newest
+|\\[helm-ff-sort-by-size]|Sort by size
+|\\[helm-ff-toggle-dirs-only]|Show only directories
+|\\[helm-ff-toggle-files-only]|Show only files")
;;; Help for file-name-history
;;
@@ -1151,7 +1211,7 @@ You can toggle the view of deleted files, see commands below.
** Commands
\\<helm-file-name-history-map>
-\\[helm-file-name-history-show-or-hide-deleted]\t\tToggle deleted files view.")
+\\[helm-file-name-history-show-or-hide-deleted]|Toggle deleted files view.")
;;; Help for `helm-read-file-name'
;;
@@ -1241,13 +1301,15 @@ It is useful when some commands are prompting continuously until you enter an em
** Commands
\\<helm-read-file-map>
-\\[helm-find-files-up-one-level]\t\tGo to parent directory.
-\\[helm-ff-run-toggle-auto-update]\t\tToggle auto-expansion of directories.
-\\[helm-ff-run-toggle-basename]\t\tToggle basename.
-\\[helm-ff-file-name-history]\t\tFile name history.
-C/\\[helm-cr-empty-string]\t\tReturn empty string unless `must-match' is non-nil.
-\\[helm-next-source]\t\tGo to next source.
-\\[helm-previous-source]\t\tGo to previous source."
+|Keys|Description
+|-----------+----------|
+|\\[helm-find-files-up-one-level]|Go to parent directory.
+|\\[helm-ff-run-toggle-auto-update]|Toggle auto-expansion of directories.
+|\\[helm-ff-run-toggle-basename]|Toggle basename.
+|\\[helm-ff-file-name-history]|File name history.
+|C/\\[helm-cr-empty-string]|Return empty string unless `must-match' is non-nil.
+|\\[helm-next-source]|Go to next source.
+|\\[helm-previous-source]|Go to previous source."
name name)))
;;; FD help
@@ -1264,32 +1326,298 @@ hard drive cache is \"cold\", then once the cache is initialized
searchs are very fast. You can pass any [[https://github.com/sharkdp/fd#command-line-options][Fd options]] before pattern, e.g. \"-e py foo\".
The [[https://github.com/sharkdp/fd][Fd]] command line can be customized with `helm-fd-switches' user variable.
-Always use --color always as option otherwise you will have no colors.
+Always use =--color always= as option otherwise you will have no colors.
To customize colors see [[https://github.com/sharkdp/fd#colorized-output][Fd colorized output]].
+NOTE:
+Starting from fd version 8.2.1, you have to provide the env var
+LS_COLORS to Emacs to have a colorized output, the easiest way is
+to add to your =~/.profile= file =eval $(dircolors)=.
+Another way is using =setenv= in your init file.
+This is not needed when running Emacs from a terminal either with =emacs -nw=
+or =emacs= because emacs inherit the env vars of this terminal.
+See [[https://github.com/sharkdp/fd/issues/725][fd bugref#725]]
+
Search is (pcre) regexp based (see [[https://docs.rs/regex/1.0.0/regex/#syntax][Regexp syntax]]), multi patterns are _not_ supported.
+** Man page
+
+NAME
+ fd - find entries in the filesystem
+
+SYNOPSIS
+ fd [-HIEsiaLp0hV] [-d depth] [-t filetype] [-e ext] [-E exclude] [-c
+ when] [-j num] [-x cmd] [pattern] [path...]
+
+DESCRIPTION
+ fd is a simple, fast and user-friendly alternative to find(1).
+
+OPTIONS
+ -H, --hidden
+ Include hidden files and directories in the search results
+ (default: hidden files and directories are skipped).
+
+ -I, --no-ignore
+ Show search results from files and directories that would other‐
+ wise be ignored by .gitignore, .ignore, .fdignore, or the global
+ ignore file.
+
+ -u, --unrestricted
+ Alias for '--no-ignore'. Can be repeated; '-uu' is an alias for
+ '--no-ignore --hidden'.
+
+ --no-ignore-vcs
+ Show search results from files and directories that would other‐
+ wise be ignored by .gitignore files.
+
+ -s, --case-sensitive
+ Perform a case-sensitive search. By default, fd uses case-insen‐
+ sitive searches, unless the pattern contains an uppercase char‐
+ acter (smart case).
+
+ -i, --ignore-case
+ Perform a case-insensitive search. By default, fd uses case-
+ insensitive searches, unless the pattern contains an uppercase
+ character (smart case).
+
+ -g, --glob
+ Perform a glob-based search instead of a regular expression
+ search.
+
+ --regex
+ Perform a regular-expression based seach (default). This can be
+ used to override --glob.
+
+ -F, --fixed-strings
+ Treat the pattern as a literal string instead of a regular
+ expression.
+
+ -a, --absolute-path
+ Shows the full path starting from the root as opposed to rela‐
+ tive paths.
+
+ -l, --list-details
+ Use a detailed listing format like 'ls -l'. This is basically an
+ alias for '--exec-batch ls -l' with some additional 'ls'
+ options. This can be used to see more metadata, to show symlink
+ targets and to achieve a deterministic sort order.
+
+ -L, --follow
+ By default, fd does not descend into symlinked directories.
+ Using this flag, symbolic links are also traversed.
+
+ -p, --full-path
+ By default, the search pattern is only matched against the file‐
+ name (or directory name). Using this flag, the pattern is
+ matched against the full path.
+
+ -0, --print0
+ Separate search results by the null character (instead of new‐
+ lines). Useful for piping results to xargs.
+
+ --max-results count
+ Limit the number of search results to 'count' and quit immedi‐
+ ately.
+
+ -1 Limit the search to a single result and quit immediately. This
+ is an alias for '--max-results=1'.
+
+ --show-errors
+ Enable the display of filesystem errors for situations such as
+ insufficient permissions or dead symlinks.
+
+ --one-file-system, --mount, --xdev
+ By default, fd will traverse the file system tree as far as
+ other options dictate. With this flag, fd ensures that it does
+ not descend into a different file system than the one it started
+ in. Comparable to the -mount or -xdev filters of find(1).
+
+ -h, --help
+ Print help information.
+
+ -V, --version
+ Print version information.
+
+ -d, --max-depth d
+ Limit directory traversal to at most d levels of depth. By
+ default, there is no limit on the search depth.
+
+ --min-depth d
+ Only show search results starting at the given depth. See also:
+ '--max-depth' and '--exact-depth'.
+
+ --exact-depth d
+ Only show search results at the exact given depth. This is an
+ alias for '--min-depth <depth> --max-depth <depth>'.
+
+ -t, --type filetype
+ Filter search by type:
+
+ f, file
+ regular files
+
+ d, directory
+ directories
+
+ l, symlink
+ symbolic links
+
+ x, executable
+ executable (files)
+
+ e, empty
+ empty files or directories
+
+ s, socket
+ sockets
+
+ p, pipe
+ named pipes (FIFOs)
+
+ This option can be used repeatedly to allow for multiple file
+ types.
+
+ -e, --extension ext
+ Filter search results by file extension ext. This option can be
+ used repeatedly to allow for multiple possible file extensions.
+
+ -E, --exclude pattern
+ Exclude files/directories that match the given glob pattern.
+ This overrides any other ignore logic. Multiple exclude pat‐
+ terns can be specified.
+
+ --ignore-file path
+ Add a custom ignore-file in '.gitignore' format. These files
+ have a low precedence.
+
+ -c, --color when
+ Declare when to colorize search results:
+
+ auto Colorize output when standard output is connected to terminal (default).
+
+ never Do not colorize output.
+
+ always Always colorize output.
+
+ -j, --threads num
+ Set number of threads to use for searching & executing (default:
+ number of available CPU cores).
+
+ -S, --size size
+ Limit results based on the size of files using the format
+ <+-><NUM><UNIT>
+
+ '+' file size must be greater than or equal to this
+
+ '-' file size must be less than or equal to this
+
+ 'NUM' The numeric size (e.g. 500)
+
+ 'UNIT' The units for NUM. They are not case-sensitive. Allowed
+ unit values:
+
+ 'b' bytes
+
+ 'k' kilobytes (base ten, 10^3 = 1000 bytes)
+
+ 'm' megabytes
+
+ 'g' gigabytes
+
+ 't' terabytes
+
+ 'ki' kibibytes (base two, 2^10 = 1024 bytes)
+
+ 'mi' mebibytes
+
+ 'gi' gibibytes
+
+ 'ti' tebibytes
+
+ --changed-within date|duration
+ Filter results based on the file modification time. The argument
+ can be provided as a specific point in time (YYYY-MM-DD
+ HH:MM:SS) or as a duration (10h, 1d, 35min). --change-newer-
+ than can be used as an alias.
+
+ Examples:
+ --changed-within 2weeks
+ --change-newer-than \"2018-10-27 10:00:00\"
+
+ --changed-before date|duration
+ Filter results based on the file modification time. The argument
+ can be provided as a specific point in time (YYYY-MM-DD
+ HH:MM:SS) or as a duration (10h, 1d, 35min). --change-older-
+ than can be used as an alias.
+
+ Examples:
+ --changed-before \"2018-10-27 10:00:00\"
+ --change-older-than 2weeks
+
+ -o, --owner [user][:group]
+ Filter files by their user and/or group. Format:
+ [(user|uid)][:(group|gid)]. Either side is optional. Precede
+ either side with a '!' to exclude files instead.
+
+ Examples:
+ --owner john
+ --owner :students
+ --owner \"!john:students\"
+
+ -x, --exec command
+ Execute command for each search result. The following placehold‐
+ ers are substituted by a path derived from the current search
+ result:
+
+ {} path
+
+ {/} basename
+
+ {//} parent directory
+
+ {.} path without file extension
+
+ {/.} basename without file extension
+
+ -X, --exec-batch command
+ Execute command with all search results at once. A single
+ occurence of the following placeholders is authorized and
+ sub stituted by the paths derived from the search results before the
+ command is executed:
+
+ {} path
+
+ {/} basename
+
+ {//} parent directory
+
+ {.} path without file extension
+
+ {/.} basename without file extension
+
** Commands
\\<helm-fd-map>
-\\[helm-ff-run-grep]\t\tRun grep (`\\[universal-argument]' to recurse).
-\\[helm-ff-run-zgrep]\t\tRun zgrep.
-\\[helm-ff-run-pdfgrep]\t\tRun PDFgrep on marked files.
-\\[helm-ff-run-copy-file]\t\tCopy file(s)
-\\[helm-ff-run-rename-file]\t\tRename file(s).
-\\[helm-ff-run-symlink-file]\t\tSymlink file(s).
-\\[helm-ff-run-hardlink-file]\t\tHardlink file(s).
-\\[helm-ff-run-delete-file]\t\tDelete file(s).
-\\[helm-ff-run-byte-compile-file]\t\tByte compile Elisp file(s) (`\\[universal-argument]' to load).
-\\[helm-ff-run-load-file]\t\tLoad Elisp file(s).
-\\[helm-ff-run-ediff-file]\t\tEdiff file.
-\\[helm-ff-run-ediff-merge-file]\t\tEdiff-merge file.
-\\[helm-ff-run-switch-other-window]\t\tSwitch to other window.
-\\[helm-ff-properties-persistent]\t\tShow file properties.
-\\[helm-ff-run-open-file-externally]\t\tOpen file with external program (`\\[universal-argument]' to choose).
-\\[helm-ff-run-open-file-with-default-tool]\t\tOpen file externally with default tool.
-\\[helm-ff-run-insert-org-link]\t\tInsert org link.
-\\[helm-fd-previous-directory]\t\tMove to previous directory.
-\\[helm-fd-next-directory]\tMove to next directory.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-ff-run-grep]|Run grep (`\\[universal-argument]' to recurse).
+|\\[helm-ff-run-zgrep]|Run zgrep.
+|\\[helm-ff-run-pdfgrep]|Run PDFgrep on marked files.
+|\\[helm-ff-run-copy-file]|Copy file(s)
+|\\[helm-ff-run-rename-file]|Rename file(s).
+|\\[helm-ff-run-symlink-file]|Symlink file(s).
+|\\[helm-ff-run-hardlink-file]|Hardlink file(s).
+|\\[helm-ff-run-delete-file]|Delete file(s).
+|\\[helm-ff-run-byte-compile-file]|Byte compile Elisp file(s) (`\\[universal-argument]' to load).
+|\\[helm-ff-run-load-file]|Load Elisp file(s).
+|\\[helm-ff-run-ediff-file]|Ediff file.
+|\\[helm-ff-run-ediff-merge-file]|Ediff-merge file.
+|\\[helm-ff-run-switch-other-window]|Switch to other window.
+|\\[helm-ff-properties-persistent]|Show file properties.
+|\\[helm-ff-run-open-file-externally]|Open file with external program (`\\[universal-argument]' to choose).
+|\\[helm-ff-run-open-file-with-default-tool]|Open file externally with default tool.
+|\\[helm-ff-run-insert-org-link]|Insert org link.
+|\\[helm-fd-previous-directory]|Move to previous directory.
+|\\[helm-fd-next-directory]|Move to next directory.")
;;; Generic file help - Used by locate.
;;
@@ -1339,24 +1667,26 @@ than 1 megabyte:
** Commands
\\<helm-generic-files-map>
-\\[helm-ff-run-toggle-basename]\t\tToggle basename.
-\\[helm-ff-run-grep]\t\tRun grep (`\\[universal-argument]' to recurse).
-\\[helm-ff-run-zgrep]\t\tRun zgrep.
-\\[helm-ff-run-pdfgrep]\t\tRun PDFgrep on marked files.
-\\[helm-ff-run-copy-file]\t\tCopy file(s)
-\\[helm-ff-run-rename-file]\t\tRename file(s).
-\\[helm-ff-run-symlink-file]\t\tSymlink file(s).
-\\[helm-ff-run-hardlink-file]\t\tHardlink file(s).
-\\[helm-ff-run-delete-file]\t\tDelete file(s).
-\\[helm-ff-run-byte-compile-file]\t\tByte compile Elisp file(s) (`\\[universal-argument]' to load).
-\\[helm-ff-run-load-file]\t\tLoad Elisp file(s).
-\\[helm-ff-run-ediff-file]\t\tEdiff file.
-\\[helm-ff-run-ediff-merge-file]\t\tEdiff-merge file.
-\\[helm-ff-run-switch-other-window]\t\tSwitch to other window.
-\\[helm-ff-properties-persistent]\t\tShow file properties.
-\\[helm-ff-run-open-file-externally]\t\tOpen file with external program (`\\[universal-argument]' to choose).
-\\[helm-ff-run-open-file-with-default-tool]\t\tOpen file externally with default tool.
-\\[helm-ff-run-insert-org-link]\t\tInsert org link.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-ff-run-toggle-basename]|Toggle basename.
+|\\[helm-ff-run-grep]|Run grep (`\\[universal-argument]' to recurse).
+|\\[helm-ff-run-zgrep]|Run zgrep.
+|\\[helm-ff-run-pdfgrep]|Run PDFgrep on marked files.
+|\\[helm-ff-run-copy-file]|Copy file(s)
+|\\[helm-ff-run-rename-file]|Rename file(s).
+|\\[helm-ff-run-symlink-file]|Symlink file(s).
+|\\[helm-ff-run-hardlink-file]|Hardlink file(s).
+|\\[helm-ff-run-delete-file]|Delete file(s).
+|\\[helm-ff-run-byte-compile-file]|Byte compile Elisp file(s) (`\\[universal-argument]' to load).
+|\\[helm-ff-run-load-file]|Load Elisp file(s).
+|\\[helm-ff-run-ediff-file]|Ediff file.
+|\\[helm-ff-run-ediff-merge-file]|Ediff-merge file.
+|\\[helm-ff-run-switch-other-window]|Switch to other window.
+|\\[helm-ff-properties-persistent]|Show file properties.
+|\\[helm-ff-run-open-file-externally]|Open file with external program (`\\[universal-argument]' to choose).
+|\\[helm-ff-run-open-file-with-default-tool]|Open file externally with default tool.
+|\\[helm-ff-run-insert-org-link]|Insert org link.")
;;; Grep help
;;
@@ -1493,13 +1823,15 @@ use a prefix argument.
** Commands
\\<helm-grep-map>
-\\[helm-goto-next-file]\t\tNext File.
-\\[helm-goto-precedent-file]\t\tPrevious File.
-\\[helm-yank-text-at-point]\t\tYank text at point in minibuffer.
-\\[helm-grep-run-other-window-action]\t\tJump to other window.
-\\[helm-grep-run-other-frame-action]\t\tJump to other frame.
-\\[helm-grep-run-default-action]\t\tRun default action (same as `RET').
-\\[helm-grep-run-save-buffer]\t\tSave to a `helm-grep-mode' enabled buffer.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-goto-next-file]|Next File.
+|\\[helm-goto-precedent-file]|Previous File.
+|\\[helm-yank-text-at-point]|Yank text at point in minibuffer.
+|\\[helm-grep-run-other-window-action]|Jump to other window.
+|\\[helm-grep-run-other-frame-action]|Jump to other frame.
+|\\[helm-grep-run-default-action]|Run default action (same as `RET').
+|\\[helm-grep-run-save-buffer]|Save to a `helm-grep-mode' enabled buffer.")
;;; PDF grep help
;;
@@ -1509,9 +1841,11 @@ use a prefix argument.
** Commands
\\<helm-pdfgrep-map>
-\\[helm-goto-next-file]\t\tNext file.
-\\[helm-goto-precedent-file]\t\tPrevious file.
-\\[helm-yank-text-at-point]\t\tYank text at point in minibuffer.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-goto-next-file]|Next file.
+|\\[helm-goto-precedent-file]|Previous file.
+|\\[helm-yank-text-at-point]|Yank text at point in minibuffer.")
;;; Etags help
;;
@@ -1521,9 +1855,11 @@ use a prefix argument.
** Commands
\\<helm-etags-map>
-\\[helm-goto-next-file]\t\tNext file.
-\\[helm-goto-precedent-file]\t\tPrevious file.
-\\[helm-yank-text-at-point]\t\tYank text at point in minibuffer.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-goto-next-file]|Next file.
+|\\[helm-goto-precedent-file]|Previous file.
+|\\[helm-yank-text-at-point]|Yank text at point in minibuffer.")
;;; UCS help
;;
@@ -1538,11 +1874,13 @@ leaving Helm.
** Commands
\\<helm-ucs-map>
-\\[helm-ucs-persistent-insert]\t\tInsert character.
-\\[helm-ucs-persistent-forward]\t\tForward character.
-\\[helm-ucs-persistent-backward]\t\tBackward character.
-\\[helm-ucs-persistent-delete]\t\tDelete character backward.
-\\[helm-ucs-persistent-insert-space]\t\tInsert space.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-ucs-persistent-insert]|Insert character.
+|\\[helm-ucs-persistent-forward]|Forward character.
+|\\[helm-ucs-persistent-backward]|Backward character.
+|\\[helm-ucs-persistent-delete]|Delete character backward.
+|\\[helm-ucs-persistent-insert-space]|Insert space.")
;;; Bookmark help
;;
@@ -1552,10 +1890,12 @@ leaving Helm.
** Commands
\\<helm-bookmark-map>
-\\[helm-bookmark-run-jump-other-window]\t\tJump other window.
-\\[helm-bookmark-run-delete]\t\tDelete bookmark.
-\\[helm-bookmark-run-edit]\t\tEdit bookmark.
-\\[helm-bookmark-toggle-filename]\t\tToggle bookmark location visibility.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-bookmark-run-jump-other-window]|Jump other window.
+|\\[helm-bookmark-run-delete]|Delete bookmark.
+|\\[helm-bookmark-run-edit]|Edit bookmark.
+|\\[helm-bookmark-toggle-filename]|Toggle bookmark location visibility.")
;;; Eshell command on file help
;;
@@ -1649,12 +1989,14 @@ prefix arg to ensure you run only one command on all marked async.
** Commands
\\<helm-buffers-ido-virtual-map>
-\\[helm-ff-run-switch-other-window]\t\tSwitch to other window.
-\\[helm-ff-run-switch-other-frame]\t\tSwitch to other frame.
-\\[helm-ff-run-grep]\t\tGrep file.
-\\[helm-ff-run-zgrep]\t\tZgrep file.
-\\[helm-ff-run-delete-file]\t\tDelete file.
-\\[helm-ff-run-open-file-externally]\t\tOpen file externally.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-ff-run-switch-other-window]|Switch to other window.
+|\\[helm-ff-run-switch-other-frame]|Switch to other frame.
+|\\[helm-ff-run-grep]|Grep file.
+|\\[helm-ff-run-zgrep]|Zgrep file.
+|\\[helm-ff-run-delete-file]|Delete file.
+|\\[helm-ff-run-open-file-externally]|Open file externally.")
;;; Moccur help
;;
@@ -1664,6 +2006,12 @@ prefix arg to ensure you run only one command on all marked async.
** Tips
+*** Searching in many buffers
+
+Start from `helm-buffers-list' or `helm-mini', mark some buffers and hit \\<helm-buffer-map\\[helm-buffers-run-occur].
+A prefix arg will change the behavior of `helm-occur-always-search-in-current'
+i.e. add current buffer or not to the list of buffers to search in.
+
*** Matching
Multiple regexp matching is allowed, simply enter a space to separate the regexps.
@@ -1674,11 +2022,26 @@ save and edit these results, i.e. add text to the empty line.
*** Automatically match symbol at point
-Helm can automatically match the symbol at point while keeping the minibuffer
-empty, ready to be written to. This behaviour is disabled by default. To
-enable this you need to add `helm-source-occur' and `helm-source-moccur' to
+Helm can automatically match the symbol at point while keeping
+the minibuffer empty, ready to be written to when
+`helm-source-occur' and `helm-source-moccur' are member of
`helm-sources-using-default-as-input'.
+*** Yank word at point in minibuffer
+
+Use `C-w' as many times as needed, undo with =C-_=. Note that
+=C-w= and =C-_= are not standard keybindings, but bindings
+provided with special helm feature
+`helm-define-key-with-subkeys'.
+
+*** Preselection
+
+When helm-occur search symbol at point the current line is
+preselected in the source related to current-buffer. When
+`helm-occur-keep-closest-position' is non nil helm-occur will
+select the line which is the closest from the current line in
+current-buffer after updating.
+
*** Jump to the corresponding line in the searched buffer
You can do this with `\\<helm-map>\\[helm-execute-persistent-action]' (persistent-action), to do it repeatedly
@@ -1732,9 +2095,11 @@ See [[Moving in `helm-buffer'][Moving in `helm-buffer']].
** Commands
\\<helm-occur-map>
-\\[helm-occur-run-goto-line-ow]\t\tGo to line in other window.
-\\[helm-occur-run-goto-line-of]\t\tGo to line in new frame.
-\\[helm-occur-run-save-buffer]\t\tSave results in new buffer.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-occur-run-goto-line-ow]|Go to line in other window.
+|\\[helm-occur-run-goto-line-of]|Go to line in new frame.
+|\\[helm-occur-run-save-buffer]|Save results in new buffer.")
;;; Helm Top
;;
;;
@@ -1743,10 +2108,12 @@ See [[Moving in `helm-buffer'][Moving in `helm-buffer']].
** Commands
\\<helm-top-map>
-\\[helm-top-run-sort-by-com]\t\tSort by commands.
-\\[helm-top-run-sort-by-cpu]\t\tSort by CPU usage.
-\\[helm-top-run-sort-by-user]\t\tSort alphabetically by user.
-\\[helm-top-run-sort-by-mem]\t\tSort by memory.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-top-run-sort-by-com]|Sort by commands.
+|\\[helm-top-run-sort-by-cpu]|Sort by CPU usage.
+|\\[helm-top-run-sort-by-user]|Sort alphabetically by user.
+|\\[helm-top-run-sort-by-mem]|Sort by memory.")
;;; Helm Elisp package
;;
@@ -1794,17 +2161,19 @@ marking it (`C-c u' or `RET') .
** Commands
\\<helm-el-package-map>
-\\[helm-el-package-show-all]\t\tShow all packages.
-\\[helm-el-package-show-installed]\t\tShow installed packages only.
-\\[helm-el-package-show-uninstalled]\t\tShow non-installed packages only.
-\\[helm-el-package-show-upgrade]\t\tShow upgradable packages only.
-\\[helm-el-package-show-built-in]\t\tShow built-in packages only.
-\\[helm-el-run-package-install]\t\tInstall package(s).
-\\[helm-el-run-package-reinstall]\t\tReinstall package(s).
-\\[helm-el-run-package-uninstall]\t\tUninstall package(s).
-\\[helm-el-run-package-upgrade]\t\tUpgrade package(s).
-\\[helm-el-run-package-upgrade-all]\t\tUpgrade all packages.
-\\[helm-el-run-visit-homepage]\t\tVisit package homepage.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-el-package-show-all]|Show all packages.
+|\\[helm-el-package-show-installed]|Show installed packages only.
+|\\[helm-el-package-show-uninstalled]|Show non-installed packages only.
+|\\[helm-el-package-show-upgrade]|Show upgradable packages only.
+|\\[helm-el-package-show-built-in]|Show built-in packages only.
+|\\[helm-el-run-package-install]|Install package(s).
+|\\[helm-el-run-package-reinstall]|Reinstall package(s).
+|\\[helm-el-run-package-uninstall]|Uninstall package(s).
+|\\[helm-el-run-package-upgrade]|Upgrade package(s).
+|\\[helm-el-run-package-upgrade-all]|Upgrade all packages.
+|\\[helm-el-run-visit-homepage]|Visit package homepage.")
;;; Helm M-x
;;
@@ -1832,11 +2201,6 @@ prefix arg will apply to `self-insert-command' (e.g. if you type
`C-u e' \"eeee\" will be inserted in prompt) so select the
command you want to execute before specifying prefix arg.
-*** Completion styles in helm-M-x
-
-By default helm-M-x use 'helm completion style, if you want to enable fuzzy matching aka flex,
-see [[Completion-styles][Completion-styles]].
-
*** Duplicate entries in helm-M-x history
helm-M-x history obey to history variables, if you have
@@ -1850,8 +2214,10 @@ duplicates in your helm-M-x history set `history-delete-duplicates' to non nil."
** Commands
\\<helm-imenu-map>
-\\[helm-imenu-next-section]\t\tGo to next section.
-\\[helm-imenu-previous-section]\t\tGo to previous section.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-imenu-next-section]|Go to next section.
+|\\[helm-imenu-previous-section]|Go to previous section.")
;;; Helm colors
;;
@@ -1861,10 +2227,12 @@ duplicates in your helm-M-x history set `history-delete-duplicates' to non nil."
** Commands
\\<helm-color-map>
-\\[helm-color-run-insert-name]\t\tInsert the entry name.
-\\[helm-color-run-kill-name]\t\tKill the entry name.
-\\[helm-color-run-insert-rgb]\t\tInsert entry in RGB format.
-\\[helm-color-run-kill-rgb]\t\tKill entry in RGB format.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-color-run-insert-name]|Insert the entry name.
+|\\[helm-color-run-kill-name]|Kill the entry name.
+|\\[helm-color-run-insert-rgb]|Insert entry in RGB format.
+|\\[helm-color-run-kill-rgb]|Kill entry in RGB format.")
;;; Helm Semantic
;;
@@ -1887,7 +2255,7 @@ duplicates in your helm-M-x history set `history-delete-duplicates' to non nil."
- End the kmacro recording with `f4'.
- Run `helm-execute-kmacro' to list all your kmacros.
-Use persistent action to run your kmacro as many time as needed.
+Use persistent action to run your kmacro as many times as needed.
You can browse the kmacros with `helm-next-line' and `helm-previous-line'.
Note: You can't record keys running Helm commands except `helm-M-x', under the
@@ -1941,11 +2309,13 @@ by using a prefix argument, i.e. `C-u RET', like the regular `yank' command does
** Commands
\\<helm-kill-ring-map>
-\\[helm-next-line]\t\tNext line.
-\\[helm-previous-line]\t\tPrevious line.
-\\[helm-kill-ring-delete]\t\tDelete entry.
-\\[helm-kill-ring-toggle-truncated]\t\tToggle truncated view of candidate.
-\\[helm-kill-ring-kill-selection]\t\tKill non-truncated of selection.")
+|Keys|Description
+|-----------+----------|
+|\\[helm-next-line]|Next line.
+|\\[helm-previous-line]|Previous line.
+|\\[helm-kill-ring-delete]|Delete entry.
+|\\[helm-kill-ring-toggle-truncated]|Toggle truncated view of candidate.
+|\\[helm-kill-ring-kill-selection]|Kill non-truncated of selection.")
;;; Completing-read
;;
@@ -1971,7 +2341,9 @@ It is useful when some commands are prompting continuously until you enter an em
** Commands
\\<helm-comp-read-map>
-\\[helm-cr-empty-string]\t\tExit minibuffer with empty string."
+|Keys|Description
+|-----------+----------|
+|\\[helm-cr-empty-string]|Exit minibuffer with empty string."
com com)))
@@ -2017,10 +2389,4 @@ f1/f2/f-n:NthAct \
(provide 'helm-help)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-help.el ends here
diff --git a/helm-id-utils.el b/helm-id-utils.el
index 12779226..05673582 100644
--- a/helm-id-utils.el
+++ b/helm-id-utils.el
@@ -1,6 +1,6 @@
;;; helm-id-utils.el --- Helm interface for id-utils. -*- lexical-binding: t -*-
-;; Copyright (C) 2015 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2015 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -79,7 +79,7 @@ MacPorts to install id-utils, it should be `gid32'."
((header-name
:initform
(lambda (name)
- (concat name " [" (helm-attr 'db-dir) "]")))
+ (concat name " [" (helm-get-attr 'db-dir) "]")))
(db-dir :initarg :db-dir
:initform nil
:custom string
@@ -122,10 +122,4 @@ See <https://www.gnu.org/software/idutils/>."
(provide 'helm-id-utils)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-id-utils ends here
diff --git a/helm-imenu.el b/helm-imenu.el
index 49ad81b3..89607668 100644
--- a/helm-imenu.el
+++ b/helm-imenu.el
@@ -1,6 +1,6 @@
;;; helm-imenu.el --- Helm interface for Imenu -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -258,7 +258,7 @@ string."
;; If value is an integer, convert it
;; to a marker, otherwise it is a cons cell
;; and it will be converted on next recursions.
- ;; (Issue #1060) [1].
+ ;; (Bug#1060) [1].
(if (integerp v) (copy-marker v) v)))))
((listp (cdr elm))
(and elm (list elm)))
@@ -266,7 +266,7 @@ string."
;; bug in imenu, should not be needed.
(and (cdr elm)
;; Semantic uses overlays whereas imenu uses
- ;; markers (issue #1706).
+ ;; markers (Bug#1706).
(setcdr elm (pcase (cdr elm) ; Same as [1].
((and ov (pred overlayp))
(copy-overlay ov))
@@ -351,7 +351,7 @@ i.e. `derived-mode-p' or it have an association in
:init (lambda ()
;; Use a cache to avoid repeatedly sending
;; progress-reporter message when updating
- ;; (Issue #1704).
+ ;; (Bug#1704).
(setq helm-imenu--in-all-buffers-cache
(helm-imenu-candidates-in-all-buffers)))
:candidates 'helm-imenu--in-all-buffers-cache
@@ -377,10 +377,4 @@ i.e. `derived-mode-p' or it have an association in
(provide 'helm-imenu)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-imenu.el ends here
diff --git a/helm-info.el b/helm-info.el
index 63598add..883e7f5f 100644
--- a/helm-info.el
+++ b/helm-info.el
@@ -1,6 +1,6 @@
;;; helm-info.el --- Browse info index with helm -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -50,7 +50,7 @@ files with `helm-info-at-point'."
;;; Build info-index sources with `helm-info-source' class.
-(cl-defun helm-info-init (&optional (file (helm-attr 'info-file)))
+(cl-defun helm-info-init (&optional (file (helm-get-attr 'info-file)))
;; Allow reinit candidate buffer when using edebug.
(helm-aif (and debug-on-error
(helm-candidate-buffer))
@@ -67,7 +67,7 @@ files with `helm-info-at-point'."
(while (search-forward "\n* " nil t)
(unless (search-forward "Menu:\n" (1+ (point-at-eol)) t)
(setq start (point-at-bol)
- ;; Fix issue #1503 by getting the invisible
+ ;; Fix Bug#1503 by getting the invisible
;; info displayed on next line in long strings.
;; e.g "* Foo.\n (line 12)" instead of
;; "* Foo.(line 12)"
@@ -92,7 +92,7 @@ files with `helm-info-at-point'."
(and (string-match
;; This regexp is stolen from Info-apropos-matches
"\\* +\\([^\n]*.+[^\n]*\\):[ \t]+\\([^\n]*\\)\\.\\(?:[ \t\n]*(line +\\([0-9]+\\))\\)?" line)
- (cons (format "(%s)%s" (helm-attr 'info-file) (match-string 2 line))
+ (cons (format "(%s)%s" (helm-get-attr 'info-file) (match-string 2 line))
(string-to-number (or (match-string 3 line) "1")))))
(defclass helm-info-source (helm-source-in-buffer)
@@ -154,7 +154,7 @@ Elements of the list are strings of Info file names without
extensions (e.g., \"emacs\" for file \"emacs.info.gz\"). Info
files are found by searching directories in
`Info-directory-list'."
- (info-initialize) ; Build Info-directory-list from INFOPATH (Issue #2118)
+ (info-initialize) ; Build Info-directory-list from INFOPATH (Bug#2118)
(let ((files (cl-loop for d in (or Info-directory-list
Info-default-directory-list)
when (file-directory-p d)
@@ -265,10 +265,4 @@ Info files are made available."
(provide 'helm-info)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-info.el ends here
diff --git a/helm-lib.el b/helm-lib.el
index 7b9825be..aa9e5e8c 100644
--- a/helm-lib.el
+++ b/helm-lib.el
@@ -1,6 +1,6 @@
;;; helm-lib.el --- Helm routines. -*- lexical-binding: t -*-
-;; Copyright (C) 2015 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2015 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; Author: Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; URL: http://github.com/emacs-helm/helm
@@ -32,8 +32,8 @@
(declare-function dired-mark-remembered "dired.el")
(declare-function ffap-file-remote-p "ffap.el")
(declare-function ffap-url-p "ffap.el")
-(declare-function helm-attr "helm.el")
-(declare-function helm-attrset "helm.el")
+(declare-function helm-get-attr "helm.el")
+(declare-function helm-set-attr "helm.el")
(declare-function helm-follow-mode-p "helm.el")
(declare-function helm-get-current-source "helm.el")
(declare-function helm-get-selection "helm.el")
@@ -47,6 +47,9 @@
(declare-function org-content "org.el")
(declare-function org-mark-ring-goto "org.el")
(declare-function org-mark-ring-push "org.el")
+(declare-function org-table-p "org-compat.el")
+(declare-function org-table-align "org-table.el")
+(declare-function org-table-end "org-table.el")
(declare-function org-open-at-point "org.el")
(declare-function wdired-change-to-dired-mode "wdired.el")
(declare-function wdired-do-perm-changes "wdired.el")
@@ -392,24 +395,27 @@ available APPEND is ignored."
;;; Command loop helper
;;
+(defconst helm-this-command-black-list
+ '(helm-maybe-exit-minibuffer
+ helm-confirm-and-exit-minibuffer
+ helm-exit-minibuffer
+ exit-minibuffer
+ helm-M-x))
+
(defun helm-this-command ()
"Return the actual command in action.
Like `this-command' but return the real command, and not
`exit-minibuffer' or other unwanted functions."
- (cl-loop with bl = '(helm-maybe-exit-minibuffer
- helm-confirm-and-exit-minibuffer
- helm-exit-minibuffer
- exit-minibuffer)
- for count from 1 to 50
+ (cl-loop for count from 1 to 50
for btf = (backtrace-frame count)
for fn = (cl-second btf)
if (and
;; In some case we may have in the way an
;; advice compiled resulting in byte-code,
- ;; ignore it (Issue #691).
+ ;; ignore it (Bug#691).
(symbolp fn)
(commandp fn)
- (not (memq fn bl)))
+ (not (memq fn helm-this-command-black-list)))
return fn
else
if (and (eq fn 'call-interactively)
@@ -646,9 +652,14 @@ displayed in BUFNAME."
(when helm-help-full-frame (delete-other-windows))
(delete-region (point-min) (point-max))
(org-mode)
- (org-mark-ring-push) ; Put mark at bob
(save-excursion
- (funcall insert-content-fn))
+ (funcall insert-content-fn)
+ (goto-char (point-min))
+ (while (re-search-forward "^[|]" nil t)
+ (when (org-table-p t)
+ (org-table-align)
+ (goto-char (org-table-end)))))
+ (org-mark-ring-push) ; Put mark at bob
(buffer-disable-undo)
(helm-help-event-loop))
(raise-frame hframe)
@@ -733,7 +744,7 @@ displayed in BUFNAME."
(not (memq fun helm-help-not-interactive-command)))
;; For movement of cursor in help buffer we need to
;; call interactively commands for impaired people
- ;; using a synthetizer (#1347).
+ ;; using a synthetizer (Bug#1347).
(call-interactively fun)
(funcall fun))))))))
@@ -742,13 +753,17 @@ displayed in BUFNAME."
If OVERRIDE is non nil, all bindings associated with FUNCTION are
removed and only (KEY . FUNCTION) is kept.
+If FUNCTION is nil (KEY . FUNCTION) is not added and removed from
+alist if already present.
See `helm-help-hkmap' for supported keys and functions."
(cl-assert (not (cdr (split-string key))) nil
(format "Error: Unsuported key `%s'" key))
(when override
(helm-awhile (rassoc function helm-help-hkmap)
(setq helm-help-hkmap (delete it helm-help-hkmap))))
- (add-to-list 'helm-help-hkmap `(,key . ,function)))
+ (helm-aif (and (null function) (assoc key helm-help-hkmap))
+ (setq helm-help-hkmap (delete it helm-help-hkmap))
+ (and function (add-to-list 'helm-help-hkmap `(,key . ,function)))))
;;; Multiline transformer
;;
@@ -784,21 +799,22 @@ See `helm-help-hkmap' for supported keys and functions."
;;; List processing
;;
-(defun helm-flatten-list (seq &optional omit-nulls)
- "Return a list of all single elements of sublists in SEQ."
+(defun helm-flatten-list (seq)
+ "Return a list of all single elements of sublists in SEQ.
+
+ Example:
+ (helm-flatten-list '(1 (2 . 3) nil (4 5 (6) 7) 8 (9 . 10)))
+ => (1 2 3 4 5 6 7 8 9 10)"
(let (result)
- (cl-labels ((flatten (seq)
- (cl-loop
- for elm in seq
- if (and (or elm
- (null omit-nulls))
- (or (atom elm)
- (functionp elm)
- (and (consp elm)
- (cdr elm)
- (atom (cdr elm)))))
- do (push elm result)
- else do (flatten elm))))
+ (cl-labels ((flatten
+ (seq)
+ (cl-loop for elm in seq
+ if (consp elm)
+ do (flatten
+ (if (atom (cdr elm))
+ (list (car elm) (cdr elm))
+ elm))
+ else do (and elm (push elm result)))))
(flatten seq))
(nreverse result)))
@@ -854,7 +870,7 @@ hashtable itself."
(helm-awhile (helm-basedir (directory-file-name
(expand-file-name directory)))
;; Break at root to avoid infloop, root is / or on Windows
- ;; C:/ i.e. <volume>:/ (issue #2308).
+ ;; C:/ i.e. <volume>:/ (Bug#2308).
(when (string-match-p "\\`[A-Za-z]?:?/\\'" it)
(cl-return nil))
(when (cl-loop for r in black-list
@@ -961,6 +977,15 @@ If NAME returns nil the pair is skipped.
do (setq name (funcall name))
when name
collect (cons name fn)))
+
+(defun helm-closest-number-in-list (num list)
+ "Return closest number to NUM found in LIST.
+LIST is a list of numbers and NUM a number."
+ (cl-loop for i in list
+ for diff = (if (> num i) (- num i) (- i num))
+ collect (cons diff i) into res
+ minimize diff into min
+ finally return (cdr (assq min res))))
;;; Strings processing.
;;
@@ -1169,8 +1194,8 @@ See `helm-elisp-show-help'."
(if name
(funcall fun candidate name)
(funcall fun candidate)))
- ((or (and (helm-attr 'help-running-p)
- (string= candidate (helm-attr 'help-current-symbol))))
+ ((or (and (helm-get-attr 'help-running-p)
+ (string= candidate (helm-get-attr 'help-current-symbol))))
(progn
;; When started from a help buffer,
;; Don't kill this buffer as it is helm-current-buffer.
@@ -1184,7 +1209,7 @@ See `helm-elisp-show-help'."
(if helm--buffer-in-new-frame-p
helm-current-buffer
helm-persistent-action-window-buffer)))
- (helm-attrset 'help-running-p nil))
+ (helm-set-attr 'help-running-p nil))
;; Force running update hook to may be delete
;; helm-persistent-action-display-window, this is done in
;; helm-persistent-action-display-window (the function).
@@ -1194,8 +1219,8 @@ See `helm-elisp-show-help'."
(if name
(funcall fun candidate name)
(funcall fun candidate))
- (helm-attrset 'help-running-p t)))
- (helm-attrset 'help-current-symbol candidate)))
+ (helm-set-attr 'help-running-p t)))
+ (helm-set-attr 'help-current-symbol candidate)))
(defun helm-find-function (func)
"FUNC is symbol or string."
@@ -1261,7 +1286,8 @@ Argument ALIST is an alist of associated major modes."
(defun helm-file-name-sans-extension (filename)
"Same as `file-name-sans-extension' but remove all extensions."
(helm-aif (file-name-sans-extension filename)
- ;; Start searching at index 1 for files beginning with a dot (#1335).
+ ;; Start searching at index 1 for files beginning with a dot
+ ;; (bug#1335).
(if (string-match "\\." (helm-basename it) 1)
(helm-file-name-sans-extension it)
it)))
@@ -1727,7 +1753,6 @@ broken."
'(("(\\<\\(with-helm-after-update-hook\\)\\>" 1 font-lock-keyword-face)
("(\\<\\(with-helm-temp-hook\\)\\>" 1 font-lock-keyword-face)
("(\\<\\(with-helm-window\\)\\>" 1 font-lock-keyword-face)
- ("(\\<\\(with-helm-quittable\\)\\>" 1 font-lock-keyword-face)
("(\\<\\(with-helm-current-buffer\\)\\>" 1 font-lock-keyword-face)
("(\\<\\(with-helm-buffer\\)\\>" 1 font-lock-keyword-face)
("(\\<\\(with-helm-show-completion\\)\\>" 1 font-lock-keyword-face)
@@ -1744,10 +1769,4 @@ broken."
(provide 'helm-lib)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-lib ends here
diff --git a/helm-locate.el b/helm-locate.el
index f220be5b..3e1eddef 100644
--- a/helm-locate.el
+++ b/helm-locate.el
@@ -1,6 +1,6 @@
;;; helm-locate.el --- helm interface for locate. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -356,7 +356,7 @@ Sort is done on basename of CANDIDATES."
(group :initform 'helm-locate)))
;; Override helm-type-file class keymap.
-(defmethod helm--setup-source :after ((source helm-locate-override-inheritor))
+(cl-defmethod helm--setup-source :after ((source helm-locate-override-inheritor))
(setf (slot-value source 'keymap) helm-locate-map))
(defvar helm-source-locate
@@ -422,14 +422,14 @@ Sort is done on basename of CANDIDATES."
(if (string-match-p "\\`fd" helm-locate-recursive-dirs-command)
(format helm-locate-recursive-dirs-command
;; fd pass path at end.
- (helm-attr 'subdir) (helm-attr 'basedir))
+ (helm-get-attr 'subdir) (helm-get-attr 'basedir))
(format helm-locate-recursive-dirs-command
(if (string-match-p "\\`es" helm-locate-recursive-dirs-command)
;; Fix W32 paths.
(replace-regexp-in-string
- "/" "\\\\\\\\" (helm-attr 'basedir))
- (helm-attr 'basedir))
- (helm-attr 'subdir)))
+ "/" "\\\\\\\\" (helm-get-attr 'basedir))
+ (helm-get-attr 'basedir))
+ (helm-get-attr 'subdir)))
nil t nil)
(buffer-string)))
@@ -473,10 +473,4 @@ Where db_path is a filename matched by
(provide 'helm-locate)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-locate.el ends here
diff --git a/helm-man.el b/helm-man.el
index 95d6c15a..5e37dfb8 100644
--- a/helm-man.el
+++ b/helm-man.el
@@ -1,6 +1,6 @@
;;; helm-man.el --- Man and woman UI -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -111,10 +111,4 @@ With a prefix arg reinitialize the cache."
(provide 'helm-man)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-man.el ends here
diff --git a/helm-misc.el b/helm-misc.el
index 70d7abfb..4a2bbf79 100644
--- a/helm-misc.el
+++ b/helm-misc.el
@@ -1,6 +1,6 @@
;;; helm-misc.el --- Various functions for helm -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -314,7 +314,7 @@ Default action change TZ environment variable locally to emacs."
:multiline t
:keymap helm-minibuffer-history-map
:allow-nest t)))
- ;; Fix issue #1667 with emacs-25+ `query-replace-from-to-separator'.
+ ;; Fix Bug#1667 with emacs-25+ `query-replace-from-to-separator'.
(when (and (boundp 'query-replace-from-to-separator) query-replace-p)
(let ((pos (string-match "\0" elm)))
(and pos
@@ -324,203 +324,8 @@ Default action change TZ environment variable locally to emacs."
elm))))
(delete-minibuffer-contents)
(insert elm)))
-
-;;; GPG keys
-;;
-;;
-(eval-when-compile (require 'epg))
-(defvar epa-protocol)
-(defvar epa-last-coding-system-specified)
-(defvar epg-key-validity-alist)
-(defvar mail-header-separator)
-(declare-function epg-list-keys "epg")
-(declare-function epg-make-context "epg")
-(declare-function epg-key-sub-key-list "epg")
-(declare-function epg-sub-key-id "epg")
-(declare-function epg-key-user-id-list "epg")
-(declare-function epg-user-id-string "epg")
-(declare-function epg-user-id-validity "epg")
-(declare-function epa-sign-region "epa")
-(declare-function epa--read-signature-type "epa")
-(declare-function epa-display-error "epa")
-(declare-function epg-export-keys-to-string "epg")
-(declare-function epg-context-armor "epg")
-(declare-function epg-context-set-armor "epg")
-
-(defvar helm-epa--list-only-secrets nil
- "[INTERNAL] Used to pass MODE argument to `epg-list-keys'.")
-
-(defcustom helm-epa-actions '(("Show key" . epa--show-key)
- ("encrypt file with key" . helm-epa-encrypt-file)
- ("Copy keys to kill ring" . helm-epa-kill-keys-armor))
- "Actions for `helm-epa-list-keys'."
- :type '(alist :key-type string :value-type symbol)
- :group 'helm-misc)
-(defclass helm-epa (helm-source-sync)
- ((init :initform (lambda ()
- (require 'epg)
- (require 'epa)))
- (candidates :initform 'helm-epa-get-key-list))
- "Allow building helm sources for GPG keys.")
-
-(defun helm-epa-get-key-list ()
- "Build candidate list for `helm-epa-list-keys'."
- (cl-loop with all-keys = (epg-list-keys (epg-make-context epa-protocol)
- nil helm-epa--list-only-secrets)
- for key in all-keys
- for sublist = (car (epg-key-sub-key-list key))
- for subkey-id = (epg-sub-key-id sublist)
- for uid-list = (epg-key-user-id-list key)
- for uid = (epg-user-id-string (car uid-list))
- for validity = (epg-user-id-validity (car uid-list))
- collect (cons (format " %s %s %s"
- (helm-aif (rassq validity epg-key-validity-alist)
- (string (car it))
- "?")
- (propertize
- subkey-id
- 'face (cl-case validity
- (none 'epa-validity-medium)
- ((revoked expired)
- 'epa-validity-disabled)
- (t 'epa-validity-high)))
- (propertize
- uid 'face 'font-lock-warning-face))
- key)))
-
-(defun helm-epa-select-keys (_context prompt &optional names secret)
- "A helm replacement for `epa-select-keys'."
- (let ((helm-epa--list-only-secrets secret))
- (helm :sources (helm-make-source "Epa select keys" 'helm-epa)
- :default (if (stringp names) names (regexp-opt names))
- :prompt (and prompt (helm-epa--format-prompt prompt))
- :buffer "*helm epa*")))
-
-(defun helm-epa--format-prompt (prompt)
- (let ((split (split-string prompt "\n")))
- (if (cdr split)
- (format "%s\n(%s): "
- (replace-regexp-in-string "\\.[\t ]*\\'" "" (car split))
- (replace-regexp-in-string "\\.[\t ]*\\'" "" (cadr split)))
- (format "%s: " (replace-regexp-in-string "\\.[\t ]*\\'" "" (car split))))))
-
-(defun helm-epa--read-signature-type ()
- "A helm replacement for `epa--read-signature-type'."
- (let ((answer (helm-read-answer "Signature type:
-(n - Create a normal signature)
-(c - Create a cleartext signature)
-(d - Create a detached signature)"
- '("n" "c" "d"))))
- (helm-acase answer
- ("n" 'normal)
- ("c" 'clear)
- ("d" 'detached))))
-
-;;;###autoload
-(define-minor-mode helm-epa-mode
- "Enable helm completion on gpg keys in epa functions."
- :group 'helm-misc
- :global t
- (require 'epa)
- (if helm-epa-mode
- (progn
- (advice-add 'epa-select-keys :override #'helm-epa-select-keys)
- (advice-add 'epa--read-signature-type :override #'helm-epa--read-signature-type))
- (advice-remove 'epa-select-keys #'helm-epa-select-keys)
- (advice-remove 'epa--read-signature-type #'helm-epa--read-signature-type)))
-
-(defun helm-epa-action-transformer (actions _candidate)
- "Helm epa action transformer function."
- (cond ((with-helm-current-buffer
- (derived-mode-p 'message-mode 'mail-mode))
- (helm-append-at-nth
- actions '(("Sign mail with key" . helm-epa-mail-sign)
- ("Encrypt mail with key" . helm-epa-mail-encrypt))
- 3))
- (t actions)))
-
-(defun helm-epa-encrypt-file (candidate)
- "Select a file to encrypt with key CANDIDATE."
- (let ((file (helm-read-file-name "Encrypt file: "))
- (key (epg-sub-key-id (car (epg-key-sub-key-list candidate))))
- (id (epg-user-id-string (car (epg-key-user-id-list candidate)))))
- (epa-encrypt-file file candidate)
- (message "File encrypted with key `%s %s'" key id)))
-
-(defun helm-epa-kill-keys-armor (_candidate)
- "Copy marked keys to kill ring."
- (let ((keys (helm-marked-candidates))
- (context (epg-make-context epa-protocol)))
- (with-no-warnings
- (setf (epg-context-armor context) t))
- (condition-case error
- (kill-new (epg-export-keys-to-string context keys))
- (error
- (epa-display-error context)
- (signal (car error) (cdr error))))))
-
-(defun helm-epa-mail-sign (candidate)
- "Sign email with key CANDIDATE."
- (let ((key (epg-sub-key-id (car (epg-key-sub-key-list candidate))))
- (id (epg-user-id-string (car (epg-key-user-id-list candidate))))
- start end mode)
- (save-excursion
- (goto-char (point-min))
- (if (search-forward mail-header-separator nil t)
- (forward-line))
- (setq epa-last-coding-system-specified
- (or coding-system-for-write
- (select-safe-coding-system (point) (point-max))))
- (let ((verbose current-prefix-arg))
- (setq start (point)
- end (point-max)
- mode (if verbose
- (epa--read-signature-type)
- 'clear))))
- ;; TODO Make non-interactive functions to replace epa-sign-region
- ;; and epa-encrypt-region and inline them.
- (with-no-warnings
- (epa-sign-region start end candidate mode))
- (message "Mail signed with key `%s %s'" key id)))
-
-(defun helm-epa-mail-encrypt (candidate)
- "Encrypt email with key CANDIDATE."
- (let (start end)
- (save-excursion
- (goto-char (point-min))
- (when (search-forward mail-header-separator nil t)
- (forward-line))
- (setq start (point)
- end (point-max))
- (setq epa-last-coding-system-specified
- (or coding-system-for-write
- (select-safe-coding-system start end))))
- ;; Don't let some read-only text stop us from encrypting.
- (let ((inhibit-read-only t)
- (key (epg-sub-key-id (car (epg-key-sub-key-list candidate))))
- (id (epg-user-id-string (car (epg-key-user-id-list candidate)))))
- (with-no-warnings
- (epa-encrypt-region start end candidate nil nil))
- (message "Mail encrypted with key `%s %s'" key id))))
-
-;;;###autoload
-(defun helm-epa-list-keys ()
- "List all gpg keys.
-This is the helm interface for `epa-list-keys'."
- (interactive)
- (helm :sources
- (helm-make-source "Epg list keys" 'helm-epa
- :action-transformer 'helm-epa-action-transformer
- :action 'helm-epa-actions)
- :buffer "*helm epg list keys*"))
(provide 'helm-misc)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-misc.el ends here
diff --git a/helm-mode.el b/helm-mode.el
index bcf02d5a..42198e68 100644
--- a/helm-mode.el
+++ b/helm-mode.el
@@ -1,6 +1,6 @@
;;; helm-mode.el --- Enable helm completion everywhere. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -241,7 +241,7 @@ Second call deletes backward char in current-buffer and quits helm completion,
letting the user start a new completion with a new prefix."
'(helm-mode-delete-char-backward-1 helm-mode-delete-char-backward-2) 1)
-(defcustom helm-completion-style 'emacs
+(defcustom helm-completion-style 'helm
"Style of completion to use in `completion-in-region'.
This affects only `completion-at-point' and friends, and
@@ -394,13 +394,17 @@ data would not be fully collected at init time.
If COLLECTION is an `obarray', a TEST should be needed. See `obarray'."
;; Ensure COLLECTION is computed from `helm-current-buffer'
;; because some functions used as COLLECTION work
- ;; only in the context of current-buffer (Issue #1030) .
+ ;; only in the context of current-buffer (Bug#1030) .
(with-helm-current-buffer
(let ((cands
- (cond ((vectorp collection)
+ (cond ((and alistp (hash-table-p collection))
+ (cl-loop for k being the hash-keys of collection
+ using (hash-values v)
+ collect (cons k v)))
+ ((vectorp collection)
(all-completions input collection test))
((and (symbolp collection) (boundp collection)
- ;; Issue #324 history is let-bounded and given
+ ;; Bug#324 history is let-bounded and given
;; quoted as hist argument of completing-read.
;; See example in `rcirc-browse-url'.
(symbolp (symbol-value collection)))
@@ -446,7 +450,7 @@ If COLLECTION is an `obarray', a TEST should be needed. See `obarray'."
(funcall collection input test t))
((and alistp (null test)) collection)
;; Next test ensure circular objects are removed
- ;; with `all-completions' (Issue #1530).
+ ;; with `all-completions' (Bug#1530).
(t (all-completions input collection test)))))
(if sort-fn (sort cands sort-fn) cands))))
@@ -459,7 +463,7 @@ If COLLECTION is an `obarray', a TEST should be needed. See `obarray'."
(defun helm-cr-default-transformer (candidates source)
"Default filter candidate function for `helm-comp-read'."
- (let ((must-match (helm-attr 'must-match source))
+ (let ((must-match (helm-get-attr 'must-match source))
unknown-pattern)
(unless (or (eq must-match t)
(string= helm-pattern "")
@@ -468,7 +472,7 @@ If COLLECTION is an `obarray', a TEST should be needed. See `obarray'."
(setq candidates (append (list
;; Unquote helm-pattern
;; when it is added
- ;; as candidate: Why? #2015
+ ;; as candidate: Why? (Bug#2015)
;; (replace-regexp-in-string
;; "\\s\\" "" helm-pattern)
helm-pattern)
@@ -498,7 +502,7 @@ If COLLECTION is an `obarray', a TEST should be needed. See `obarray'."
(defun helm-comp-read--move-to-first-real-candidate ()
(helm-aif (helm-get-selection nil 'withprop)
- ;; Avoid error with candidates with an image as display (#2296).
+ ;; Avoid error with candidates with an image as display (Bug#2296).
(when (equal (get-text-property 0 'display it) "[?]")
(helm-next-line))))
@@ -566,7 +570,9 @@ It is helm `completing-read' equivalent.
- PROMPT is the prompt name to use.
-- COLLECTION can be a list, vector, obarray or hash-table.
+- COLLECTION can be a list, alist, vector, obarray or hash-table.
+ For alists and hash-tables their car are use as real value of
+ candidate unless ALISTP is non-nil.
It can be also a function that receives three arguments:
the values string, predicate and t. See `all-completions' for more details.
@@ -640,7 +646,12 @@ Keys description:
- NOMARK: When non--nil don't allow marking candidates.
-- ALISTP: (default is non--nil) See `helm-comp-read-get-candidates'.
+- ALISTP:
+ When non-nil (default) pass the value of (DISPLAY . REAL)
+ candidate in COLLECTION to action when COLLECTION is an alist or a
+ hash-table, otherwise DISPLAY is always returned as result on exit,
+ which is the default when using `completing-read'.
+ See `helm-comp-read-get-candidates'.
- CANDIDATES-IN-BUFFER: when non--nil use a source build with
`helm-source-in-buffer' which is much faster.
@@ -687,7 +698,7 @@ that use `helm-comp-read'. See `helm-M-x' for example."
;; and :alistp is nil INPUT is passed to
;; `all-completions' which defeat helm
;; matching functions (multi match, fuzzy
- ;; etc...) issue #2134.
+ ;; etc...) Bug#2134.
collection test sort alistp
(if (and match-dynamic (null candidates-in-buffer))
helm-pattern ""))))
@@ -709,7 +720,7 @@ that use `helm-comp-read'. See `helm-M-x' for example."
;; Input is added to history in completing-read's
;; and may be regexp-quoted, so unquote it
;; but check if cand is a string (it may be at this stage
- ;; a symbol or nil) Issue #1553.
+ ;; a symbol or nil) Bug#1553.
when (stringp i)
collect (replace-regexp-in-string "\\s\\" "" i))))
(and hist-fc-transformer (helm-mklist hist-fc-transformer)))
@@ -793,7 +804,7 @@ that use `helm-comp-read'. See `helm-M-x' for example."
;; Avoid adding an incomplete input to history.
(when (and result history del-input)
(cond ((and (symbolp history) ; History is a symbol.
- (not (symbolp (symbol-value history)))) ; Fix Issue #324.
+ (not (symbolp (symbol-value history)))) ; Fix Bug#324.
;; Be sure history is not a symbol with a nil value.
(helm-aif (symbol-value history) (setcar it result)))
((consp history) ; A list with a non--nil value.
@@ -1041,15 +1052,17 @@ This handler uses dynamic matching which allows honouring `completion-styles'."
init hist default inherit-input-method
name buffer)
"Default `helm-mode' handler for all `completing-read'."
- (let* ((standard (memq helm-completion-style '(helm helm-fuzzy)))
+ (let* (;; Standard will be used as CANDS-IN-BUFFER arg.
+ (standard (and (memq helm-completion-style '(helm helm-fuzzy)) t))
(fn (if standard
#'helm-completing-read-default-1
#'helm-completing-read-default-2))
(helm-mode-fuzzy-match (eq helm-completion-style 'helm-fuzzy)))
- (apply fn
- prompt collection test require-match
- init hist default inherit-input-method
- name buffer standard)))
+ (funcall fn
+ prompt collection test require-match
+ init hist default inherit-input-method name buffer
+ ;; CANDS-IN-BUFFER
+ standard)))
(defun helm-mode--read-buffer-to-switch (prompt)
"[INTERNAL] This is used to advice `read-buffer-to-switch'.
@@ -1100,13 +1113,13 @@ See documentation of `completing-read' and `all-completions' for details."
;; Note: `minibuffer-with-setup-hook' may setup a lambda
;; calling `minibuffer-completion-help' or other minibuffer
;; functions we DONT WANT here, in these cases removing the hook
- ;; (a symbol) have no effect. Issue #448.
+ ;; (a symbol) have no effect. Bug#448.
;; Because `minibuffer-completion-table' and
;; `minibuffer-completion-predicate' are not bound
;; anymore here, these functions should have no effect now,
;; except in some rare cases like in `woman-file-name',
;; so remove all incompatible functions
- ;; from `minibuffer-setup-hook' (Issue #1205, #1240).
+ ;; from `minibuffer-setup-hook' (Bug#1205, Bug#1240).
;; otherwise helm have not the time to close its initial session.
(minibuffer-setup-hook
(cl-loop for h in minibuffer-setup-hook
@@ -1330,7 +1343,9 @@ Keys description:
(result (helm
:sources (if helm-mode-reverse-history
(reverse src-list) src-list)
- :input (expand-file-name initial-input)
+ :input (if (string-match helm-ff-url-regexp initial-input)
+ initial-input
+ (expand-file-name initial-input))
:prompt prompt
:candidate-number-limit candidate-number-limit
:resume 'noresume
@@ -1466,8 +1481,12 @@ Don't use it directly, use instead `helm-read-file-name' in your programs."
:buffer buf-name
:default default-filename
;; Helm handlers should always have a non nil INITIAL arg.
- :initial-input (expand-file-name init dir)
+ :initial-input (if (string-match helm-ff-url-regexp init)
+ init
+ (expand-file-name init dir))
:alistp nil
+ :nomark (null helm-comp-read-use-marked)
+ :marked-candidates helm-comp-read-use-marked
:must-match mustmatch
:test predicate
:noret reading-directory))))
@@ -1487,7 +1506,7 @@ Don't use it directly, use instead `helm-read-file-name' in your programs."
(file-name-as-directory fname)
fname)))
-;; Read file name handler with history (issue #1652)
+;; Read file name handler with history (Bug#1652)
(defun helm-read-file-name-handler-1 (prompt dir default-filename
mustmatch initial predicate
name buffer)
@@ -1579,8 +1598,9 @@ Actually does nothing."
(defun helm-completion-all-completions (string table pred point)
"The all completions function for `completing-styles-alist'."
;; FIXME: No need to bind all these value.
- (cl-multiple-value-bind (all _pattern prefix _suffix _carbounds)
- (helm-completion--multi-all-completions string table pred point)
+ ;; (cl-multiple-value-bind (all _pattern prefix _suffix _carbounds)
+ (pcase-let ((`(,all ,_pattern ,prefix ,_suffix ,_carbounds)
+ (helm-completion--multi-all-completions string table pred point)))
(when all (nconc all (length prefix)))))
(defun helm-completion--multi-all-completions-1 (string collection &optional predicate)
@@ -1620,11 +1640,11 @@ Actually does nothing."
(all-completions "" (or all collection)
(lambda (x &optional _y)
;; Second arg _y is needed when
- ;; COLLECTION is a hash-table issue
- ;; #2231 (C-x 8 RET).
+ ;; COLLECTION is a hash-table (Bug#2231)
+ ;; (C-x 8 RET).
;; Elements of COLLECTION may be
;; lists or alists, in this case consider the
- ;; car of element (issue #2219 org-refile).
+ ;; car of element (Bug#2219 org-refile).
(let ((elm (if (listp x) (car x) x)))
;; PREDICATE have been already called in
;; initial all-completions, no need to call
@@ -1647,7 +1667,12 @@ Actually does nothing."
(prefix (substring beforepoint 0 (car bounds)))
(suffix (substring afterpoint (cdr bounds)))
(all (helm-completion--multi-all-completions-1
- (regexp-quote string) table pred)))
+ ;; Using `regexp-quote' on STRING fixes bug#2355 but
+ ;; breaks regexp matching in multi match, actually with
+ ;; Helm-3.7.1 and emacs-27+ it seems using plain STRING
+ ;; works for both so use it.
+ ;;(regexp-quote string)
+ string table pred)))
(list all string prefix suffix point)))
;; The adjust-metadata functions run only in emacs-27, they are NOT
@@ -1673,8 +1698,8 @@ Actually does nothing."
;; It is needed here to make minibuffer-complete work in emacs-26,
;; e.g. with regular M-x.
(unless (string-match-p " " string)
- (cl-multiple-value-bind (all pattern prefix suffix _carbounds)
- (helm-completion--flex-all-completions string table pred point)
+ (pcase-let ((`(,all ,pattern ,prefix ,suffix ,_carbounds)
+ (helm-completion--flex-all-completions string table pred point)))
(when minibuffer-completing-file-name
(setq all (completion-pcm--filename-try-filter all)))
(completion-pcm--merge-try pattern all prefix suffix))))
@@ -1683,10 +1708,10 @@ Actually does nothing."
"The all completions function for `completing-styles-alist'."
;; FIXME: No need to bind all these value.
(unless (string-match-p " " string)
- (cl-multiple-value-bind (all pattern prefix _suffix _carbounds)
- (helm-completion--flex-all-completions
- string table pred point
- #'helm-completion--flex-transform-pattern)
+ (pcase-let ((`(,all ,pattern ,prefix ,_suffix ,_carbounds)
+ (helm-completion--flex-all-completions
+ string table pred point
+ #'helm-completion--flex-transform-pattern)))
(let ((regexp (completion-pcm--pattern->regex pattern 'group)))
(when all (nconc (helm-flex-add-score-as-prop all regexp)
(length prefix)))))))
@@ -1758,7 +1783,7 @@ Can be used for `completion-in-region-function' by advicing it with an
(if (cdr-safe it) (car it) it)))
;; This hook force usage of the display part of candidate with
;; its properties, this is needed for lsp-mode in its
- ;; :exit-function see issue #2265.
+ ;; :exit-function see Bug#2265.
(add-hook 'helm-before-action-hook 'helm-completion-in-region--selection)
(unwind-protect
(let* ((enable-recursive-minibuffers t)
@@ -1792,7 +1817,7 @@ Can be used for `completion-in-region-function' by advicing it with an
;; `afun' is a closure to call against each string in `data'.
;; it provide the annotation info for each string.
;; e.g "foo" => "foo <f>" where foo is a function.
- ;; See Issue #407.
+ ;; See Bug#407.
(afun (or (plist-get completion-extra-properties :annotation-function)
(completion-metadata-get metadata 'annotation-function)))
(init-space-suffix (unless (or (memq helm-completion-style '(helm-fuzzy emacs))
@@ -1910,14 +1935,19 @@ Can be used for `completion-in-region-function' by advicing it with an
(setq string (copy-sequence result))
(helm-completion-in-region--insert-result
result start point end base-size))
- ;; Allow running extra property `:exit-function' (Issues #2265,
- ;; #2356). Function is called with 'exact if for a unique
+ ;; Allow running extra property `:exit-function' (Bug#2265,
+ ;; Bug#2356). Function is called with 'exact if for a unique
;; match which is exact, the return value of `try-completion'
- ;; is t, otherwise it is called with 'finished.
+ ;; is t or a string ending with "/" i.e. possibly a directory
+ ;; (Bug#2274),
+ ;; otherwise it is called with 'finished.
(when (and (stringp string) exit-fun)
- (funcall exit-fun string
- (if (eq (try-completion initial-input collection) t)
- 'exact 'finished)))
+ (let ((tcomp (try-completion initial-input collection)))
+ (funcall exit-fun string
+ (if (or (eq tcomp t) ; Unique.
+ (and (stringp tcomp)
+ (string-match "/\\'" tcomp))) ; A directory.
+ 'exact 'finished))))
(remove-hook 'helm-before-action-hook 'helm-completion-in-region--selection)
(customize-set-variable 'helm-completion-style old--helm-completion-style)
(setq helm-completion--sorting-done nil)
@@ -1939,7 +1969,7 @@ Be sure to know what you are doing when modifying this.")
;; When RESULT have annotation, annotation is displayed
;; in it with a display property attached to a space
;; added at end of string, take care of removing this
- ;; space (issue #2360). However keep RESULT intact to
+ ;; space (Bug#2360). However keep RESULT intact to
;; pass it to `:exit-function' i.e. Don't store the
;; modified string in STRING.
(choose-completion-string
@@ -1958,7 +1988,7 @@ Be sure to know what you are doing when modifying this.")
(let ((beg (+ start base-size))
(sep (or (and
;; If `crm-separator' is a string of length 1
- ;; assume it can be used as separator (#2298),
+ ;; assume it can be used as separator (Bug#2298),
;; otherwise it is a regexp and use the value
;; it matches or default to "," if no match.
(eq (length crm-separator) 1)
@@ -1968,7 +1998,7 @@ Be sure to know what you are doing when modifying this.")
;; regexp use the string the regexp is matching.
;; If SEP is not a string, it have been probably bound to a
;; symbol or nil through `helm-crm-default-separator' that serve
- ;; as a flag to say "Please no separator" (Issue #2353 with
+ ;; as a flag to say "Please no separator" (Bug#2353 with
;; `magit-completing-read-multiple').
(if (stringp sep)
(save-excursion
@@ -2038,11 +2068,11 @@ Note: This mode is incompatible with Emacs23."
#'helm--completion-in-region))
;; If user have enabled ido-everywhere BEFORE enabling
;; helm-mode disable it and warn user about its
- ;; incompatibility with helm-mode (issue #2085).
+ ;; incompatibility with helm-mode (Bug#2085).
(helm-mode--disable-ido-maybe)
;; If ido-everywhere is not enabled yet anticipate and
;; disable it if user attempt to enable it while helm-mode
- ;; is running (issue #2085).
+ ;; is running (Bug#2085).
(add-hook 'ido-everywhere-hook #'helm-mode--ido-everywhere-hook)
(when (fboundp 'ffap-read-file-or-url-internal)
;; `ffap-read-file-or-url-internal' have been removed in
@@ -2062,10 +2092,4 @@ Note: This mode is incompatible with Emacs23."
(provide 'helm-mode)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-mode.el ends here
diff --git a/helm-multi-match.el b/helm-multi-match.el
index 8ad5d2b1..65dde0b9 100644
--- a/helm-multi-match.el
+++ b/helm-multi-match.el
@@ -3,7 +3,7 @@
;; Original Author: rubikitch
;; Copyright (C) 2008 ~ 2011 rubikitch
-;; Copyright (C) 2011 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2011 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; Author: Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; URL: http://github.com/emacs-helm/helm
@@ -126,7 +126,7 @@ If GREP-SPACE is used translate escaped space to \"\\s\" instead of \"\\s-\"."
(defun helm-mm-prefix-match (candidate &optional pattern)
;; In filename completion basename and basedir may be
- ;; quoted, unquote them for string comparison (Issue #1283).
+ ;; quoted, unquote them for string comparison (Bug#1283).
(setq pattern (replace-regexp-in-string
"\\\\" "" (or pattern helm-pattern)))
(let ((len (length pattern)))
@@ -202,7 +202,7 @@ previous value stored in `helm-mm--3-pattern-list'."
E.g., ((identity . \"foo\") (not . \"bar\"))."
(unless (string= pattern "")
(cl-loop for pat in (helm-mm-split-pattern pattern)
- collect (if (string= "!" (substring pat 0 1))
+ collect (if (char-equal ?! (aref pat 0))
(cons 'not (substring pat 1))
(cons 'identity pat)))))
@@ -368,10 +368,4 @@ E.g. \"bar foo baz\" will match \"barfoobaz\" or \"barbazfoo\" but not
(provide 'helm-multi-match)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-multi-match.el ends here
diff --git a/helm-net.el b/helm-net.el
index 9be00644..6af15523 100644
--- a/helm-net.el
+++ b/helm-net.el
@@ -1,6 +1,6 @@
;;; helm-net.el --- helm browse url and search web. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -241,7 +241,7 @@ Can be \"-new-tab\" (default) or \"-new-window\"."
:candidates (lambda ()
(funcall helm-google-suggest-default-function))
:action 'helm-google-suggest-actions
- :volatile t
+ :match-dynamic t
:keymap helm-map
:requires-pattern 3))
@@ -259,7 +259,7 @@ Can be \"-new-tab\" (default) or \"-new-window\"."
(defvar helm-browse-url-chromium-program "chromium-browser")
(defvar helm-browse-url-uzbl-program "uzbl-browser")
-(defvar helm-browse-url-next-program "next")
+(defvar helm-browse-url-nyxt-program "nyxt")
(defvar helm-browse-url-conkeror-program "conkeror")
(defvar helm-browse-url-opera-program "opera")
(defvar helm-browse-url-default-browser-alist
@@ -345,10 +345,10 @@ NOTE: Probably not supported on some systems (e.g., Windows)."
(helm-generic-browser url helm-browse-url-conkeror-program))
;;;###autoload
-(defun helm-browse-url-next (url &optional _ignore)
+(defun helm-browse-url-nyxt (url &optional _ignore)
"Browse URL with next browser."
(interactive "sURL: ")
- (helm-generic-browser url helm-browse-url-next-program))
+ (helm-generic-browser url helm-browse-url-nyxt-program))
(defun helm-browse-url-default-browser (url &rest args)
"Find the first available browser and ask it to load URL."
@@ -430,10 +430,4 @@ NOTE: Probably not supported on some systems (e.g., Windows)."
(provide 'helm-net)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-net.el ends here
diff --git a/helm-occur.el b/helm-occur.el
index 57d70b7f..40fa6180 100644
--- a/helm-occur.el
+++ b/helm-occur.el
@@ -1,6 +1,6 @@
;;; helm-occur.el --- Incremental Occur for Helm. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -31,7 +31,9 @@
;;; Internals
;;
-(defvar helm-source-occur nil)
+(defvar helm-source-occur nil
+ "This will be the name of the source related to `current-buffer'.
+Don't use it as it value changes always.")
(defvar helm-source-moccur nil
"This is just a flag to add to `helm-sources-using-default-as-input'.
Don't set it to any value, it will have no effect.")
@@ -41,7 +43,7 @@ Don't set it to any value, it will have no effect.")
(defvar helm-occur--search-buffer-regexp "\\`\\([0-9]*\\)\\s-\\{1\\}\\(.*\\)\\'"
"The regexp matching candidates in helm-occur candidate buffer.")
(defvar helm-occur-mode--last-pattern nil)
-
+(defvar helm-occur--initial-pos 0)
(defvar helm-occur-map
(let ((map (make-sparse-keymap)))
@@ -122,6 +124,11 @@ Note that when using `buffer-substring' initialization will be slower."
:value-type (radio (const :tag "With text properties" buffer-substring)
(const :tag "Without text properties" buffer-substring-no-properties))))
+(defcustom helm-occur-keep-closest-position t
+ "When non nil select closest candidate from point after update.
+This happen only in `helm-source-occur' which is always related to `current-buffer'."
+ :group 'helm-regexp
+ :type 'boolean)
(defface helm-moccur-buffer
`((t ,@(and (>= emacs-major-version 27) '(:extend t))
@@ -136,6 +143,38 @@ Note that when using `buffer-substring' initialization will be slower."
:group 'helm-occur)
+(defun helm-occur--select-closest-candidate ()
+ ;; Prevent error with `with-helm-window' when switching to help.
+ (unless (or (not (get-buffer-window helm-buffer 'visible))
+ (string-equal helm-pattern ""))
+ (with-helm-window
+ (let ((lst '())
+ (name (helm-get-attr 'name helm-source-occur))
+ closest beg end)
+ (while-no-input
+ (goto-char (point-min))
+ (if (string= name "Helm occur")
+ (setq beg (point)
+ end (point-max))
+ (helm-awhile (helm-get-next-header-pos)
+ (when (string= name (buffer-substring-no-properties
+ (point-at-bol) (point-at-eol)))
+ (forward-line 1)
+ (setq beg (point)
+ end (or (helm-get-next-header-pos) (point-max)))
+ (cl-return))))
+ (save-excursion
+ (when (and beg end)
+ (goto-char beg)
+ (while (re-search-forward "^[0-9]+" end t)
+ (push (string-to-number (match-string 0)) lst))
+ (setq closest (helm-closest-number-in-list
+ helm-occur--initial-pos lst))))
+ (when (and closest (re-search-forward (format "^%s" closest) end t))
+ (helm-mark-current-line)
+ (goto-char (overlay-start
+ helm-selection-overlay))))))))
+
;;;###autoload
(defun helm-occur ()
"Preconfigured helm for searching lines matching pattern in `current-buffer'.
@@ -159,6 +198,13 @@ engine beeing completely different and also much faster."
(helm-set-local-variable 'helm-occur--buffer-list (list (current-buffer))
'helm-occur--buffer-tick
(list (buffer-chars-modified-tick (current-buffer))))
+ (helm-set-attr 'header-name (lambda (_name)
+ (format "HO [%s]"
+ (buffer-name helm-current-buffer)))
+ helm-source-occur)
+ (when helm-occur-keep-closest-position
+ (setq helm-occur--initial-pos (line-number-at-pos))
+ (add-hook 'helm-after-update-hook 'helm-occur--select-closest-candidate))
(save-restriction
(let ((helm-sources-using-default-as-input
(unless (> (buffer-size) 2000000)
@@ -184,7 +230,8 @@ engine beeing completely different and also much faster."
(format "^%d:" (line-number-at-pos
(or pos (point)))))
:truncate-lines helm-occur-truncate-lines)
- (deactivate-mark t)))))
+ (deactivate-mark t)
+ (remove-hook 'helm-after-update-hook 'helm-occur--select-closest-candidate)))))
;;;###autoload
(defun helm-occur-visible-buffers ()
@@ -198,7 +245,7 @@ engine beeing completely different and also much faster."
(defun helm-occur-transformer (candidates source)
"Return CANDIDATES prefixed with line number."
- (cl-loop with buf = (helm-attr 'buffer-name source)
+ (cl-loop with buf = (helm-get-attr 'buffer-name source)
for c in candidates collect
(when (string-match helm-occur--search-buffer-regexp c)
(let ((linum (match-string 1 c))
@@ -220,12 +267,14 @@ engine beeing completely different and also much faster."
(defun helm-occur-build-sources (buffers &optional source-name)
"Build sources for `helm-occur' for each buffer in BUFFERS list."
(cl-loop for buf in buffers
+ for bname = (buffer-name buf)
collect
- (helm-make-source (or source-name
- (format "HO [%s]"
- (buffer-name buf)))
+ (helm-make-source (or source-name bname)
'helm-moccur-class
- :buffer-name (buffer-name buf)
+ :header-name (lambda (name)
+ (format "HO [%s]" (if (string= name "Helm occur")
+ bname name)))
+ :buffer-name bname
:match-part
(lambda (candidate)
;; The regexp should match what is in candidate buffer,
@@ -247,7 +296,7 @@ engine beeing completely different and also much faster."
helm-occur-buffer-substring-fn-for-modes))
#'buffer-substring-no-properties))
(contents (funcall bsfn (point-min) (point-max))))
- (helm-attrset 'get-line bsfn)
+ (helm-set-attr 'get-line bsfn)
(with-current-buffer (helm-candidate-buffer 'global)
(insert contents)
(goto-char (point-min))
@@ -284,7 +333,9 @@ Each buffer's result is displayed in a separated source."
do (setq total_size (buffer-size b))
finally return (> total_size 2000000))
helm-sources-using-default-as-input))
- (sources (helm-occur-build-sources bufs))
+ (sources (helm-occur-build-sources bufs (and (eql curbuf (car bufs))
+ (not (cdr bufs))
+ "Helm occur")))
(helm-maybe-use-default-as-input
(not (null (memq 'helm-source-moccur
helm-sources-using-default-as-input)))))
@@ -293,12 +344,23 @@ Each buffer's result is displayed in a separated source."
(cl-loop for b in bufs collect
(buffer-chars-modified-tick
(get-buffer b))))
- (helm :sources sources
- :buffer "*helm moccur*"
- :history 'helm-occur-history
- :default (helm-aif (thing-at-point 'symbol) (regexp-quote it))
- :input input
- :truncate-lines helm-occur-truncate-lines)))
+ (when (and helm-occur-always-search-in-current
+ helm-occur-keep-closest-position)
+ (setq helm-source-occur
+ (cl-loop for s in sources
+ when (eql helm-current-buffer
+ (get-buffer (helm-get-attr 'buffer-name s)))
+ return s))
+ (setq helm-occur--initial-pos (line-number-at-pos))
+ (add-hook 'helm-after-update-hook 'helm-occur--select-closest-candidate))
+ (unwind-protect
+ (helm :sources sources
+ :buffer "*helm moccur*"
+ :history 'helm-occur-history
+ :default (helm-aif (thing-at-point 'symbol) (regexp-quote it))
+ :input input
+ :truncate-lines helm-occur-truncate-lines)
+ (remove-hook 'helm-after-update-hook 'helm-occur--select-closest-candidate))))
;;; Actions
;;
@@ -309,7 +371,7 @@ METHOD can be one of buffer, buffer-other-window, buffer-other-frame."
(require 'helm-grep)
(let ((buf (if (eq major-mode 'helm-occur-mode)
(get-text-property (point) 'buffer-name)
- (helm-attr 'buffer-name)))
+ (helm-get-attr 'buffer-name)))
(split-pat (helm-mm-split-pattern helm-input)))
(cl-case method
(buffer (switch-to-buffer buf))
@@ -378,7 +440,7 @@ This is used when `helm-occur-use-ioccur-style-keys' is enabled.
If follow is enabled (default) go to next source, otherwise execute
persistent action."
(interactive)
- (if (helm-aand (helm-attr 'follow) (> it 0))
+ (if (helm-aand (helm-get-attr 'follow) (> it 0))
(helm-next-source)
(helm-execute-persistent-action)))
(put 'helm-occur-right 'helm-only t)
@@ -628,8 +690,8 @@ Special commands:
when (buffer-live-p (get-buffer b))
collect b))
(setq buffer-is-modified (/= (length helm-occur--buffer-list)
- (length (helm-attr 'moccur-buffers))))
- (helm-attrset 'moccur-buffers helm-occur--buffer-list)
+ (length (helm-get-attr 'moccur-buffers))))
+ (helm-set-attr 'moccur-buffers helm-occur--buffer-list)
(setq new-tick-ls (cl-loop for b in helm-occur--buffer-list
collect (buffer-chars-modified-tick
(get-buffer b))))
@@ -683,7 +745,10 @@ To use this bind it to a key in `isearch-mode-map'."
(let ((input (if isearch-regexp
isearch-string
(regexp-quote isearch-string)))
- (bufs (list (current-buffer))))
+ (bufs (list (current-buffer)))
+ ;; Use `helm-occur-always-search-in-current' as a flag for
+ ;; `helm-occur--select-closest-candidate'.
+ (helm-occur-always-search-in-current t))
(isearch-exit)
(helm-multi-occur-1 bufs input)))
@@ -718,10 +783,4 @@ To use this bind it to a key in `isearch-mode-map'."
(provide 'helm-occur)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-occur.el ends here
diff --git a/helm-pkg.el b/helm-pkg.el
index 8fbedc5f..ede1298b 100644
--- a/helm-pkg.el
+++ b/helm-pkg.el
@@ -1,11 +1,11 @@
;;; helm-pkg.el --- define helm for package.el
-(define-package "helm" "3.6.5"
+(define-package "helm" "3.8.0"
"Helm is an Emacs incremental and narrowing framework"
'((emacs "25.1")
(async "1.9.4")
(popup "0.5.3")
- (helm-core "3.6.5"))
+ (helm-core "3.8.0"))
:url "https://emacs-helm.github.io/helm/")
;; Local Variables:
diff --git a/helm-regexp.el b/helm-regexp.el
index 1d9bdcf3..f5dd4543 100644
--- a/helm-regexp.el
+++ b/helm-regexp.el
@@ -1,6 +1,6 @@
;;; helm-regexp.el --- In buffer regexp searching and replacement for helm. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -129,10 +129,4 @@ i.e. don't replace inside a word, regexp is surrounded with \\bregexp\\b."
(provide 'helm-regexp)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-regexp.el ends here
diff --git a/helm-ring.el b/helm-ring.el
index 4aae4294..aa44e4e5 100644
--- a/helm-ring.el
+++ b/helm-ring.el
@@ -1,6 +1,6 @@
;;; helm-ring.el --- kill-ring, mark-ring, and register browsers for helm. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -48,7 +48,8 @@ will not have separators between candidates any more."
(defcustom helm-kill-ring-actions
'(("Yank marked" . helm-kill-ring-action-yank)
- ("Delete marked" . helm-kill-ring-action-delete))
+ ("Delete marked" . helm-kill-ring-action-delete)
+ ("Search from candidate" . helm-kill-ring-search-from-string))
"List of actions for kill ring source."
:group 'helm-ring
:type '(alist :key-type string :value-type function))
@@ -72,6 +73,7 @@ will not have separators between candidates any more."
(define-key map (kbd "M-y") 'helm-next-line)
(define-key map (kbd "M-u") 'helm-previous-line)
(define-key map (kbd "M-D") 'helm-kill-ring-delete)
+ (define-key map (kbd "C-s") 'helm-kill-ring-run-search-from-string)
(define-key map (kbd "C-]") 'helm-kill-ring-toggle-truncated)
(define-key map (kbd "C-c C-k") 'helm-kill-ring-kill-selection)
(define-key map (kbd "C-c d") 'helm-kill-ring-run-persistent-delete)
@@ -81,8 +83,8 @@ will not have separators between candidates any more."
(defvar helm-source-kill-ring
(helm-build-sync-source "Kill Ring"
:init (lambda ()
- (helm-attrset 'last-command last-command)
- (helm-attrset 'multiline helm-kill-ring-max-offset))
+ (helm-set-attr 'last-command last-command)
+ (helm-set-attr 'multiline helm-kill-ring-max-offset))
:candidates #'helm-kill-ring-candidates
:filtered-candidate-transformer #'helm-kill-ring-transformer
:action 'helm-kill-ring-actions
@@ -97,7 +99,7 @@ will not have separators between candidates any more."
(defun helm-kill-ring-candidates ()
(cl-loop with cands = (helm-fast-remove-dups kill-ring :test 'equal)
- for kill in (if (eq (helm-attr 'last-command) 'yank)
+ for kill in (if (eq (helm-get-attr 'last-command) 'yank)
(cdr cands)
cands)
unless (or (< (length kill) helm-kill-ring-threshold)
@@ -120,7 +122,7 @@ will not have separators between candidates any more."
(let* ((cur-cand (helm-get-selection))
(presel-fn (lambda ()
(helm-kill-ring--preselect-fn cur-cand))))
- (helm-attrset 'multiline
+ (helm-set-attr 'multiline
(if helm-kill-ring--truncated-flag
15000000
helm-kill-ring-max-offset))
@@ -189,10 +191,10 @@ yanked string."
;; Adding a `delete-selection' property
;; to `helm-kill-ring-action' is not working
;; because `this-command' will be `helm-maybe-exit-minibuffer',
- ;; so use this workaround (Issue #1520).
+ ;; so use this workaround (Bug#1520).
(when (and (region-active-p) delete-selection-mode)
(delete-region (region-beginning) (region-end)))
- (if (not (eq (helm-attr 'last-command helm-source-kill-ring) 'yank))
+ (if (not (eq (helm-get-attr 'last-command helm-source-kill-ring) 'yank))
(progn
;; Ensure mark is at beginning of inserted text.
(push-mark)
@@ -214,6 +216,18 @@ yanked string."
(kill-new str)))))
(define-obsolete-function-alias 'helm-kill-ring-action 'helm-kill-ring-action-yank "2.4.0")
+(defun helm-kill-ring-search-from-string (candidate)
+ (let ((str (car (split-string candidate "\n"))))
+ (helm-multi-occur-1
+ (list (current-buffer))
+ (regexp-quote (substring-no-properties str)))))
+
+(defun helm-kill-ring-run-search-from-string ()
+ (interactive)
+ (with-helm-alive-p
+ (helm-exit-and-execute-action 'helm-kill-ring-search-from-string)))
+(put 'helm-kill-ring-run-search-from-string 'helm-only t)
+
(defun helm-kill-ring-action-delete (_candidate)
"Delete marked candidates from `kill-ring'."
(cl-loop for c in (helm-marked-candidates)
@@ -237,7 +251,7 @@ yanked string."
"Delete current candidate without quitting."
(interactive)
(with-helm-alive-p
- (helm-attrset 'quick-delete '(helm-kill-ring-persistent-delete . never-split))
+ (helm-set-attr 'quick-delete '(helm-kill-ring-persistent-delete . never-split))
(helm-execute-persistent-action 'quick-delete)))
(put 'helm-kill-ring-run-persistent-delete 'helm-only t)
@@ -358,8 +372,12 @@ This is a command for `helm-kill-ring-map'."
(defun helm-register-candidates ()
"Collecting register contents and appropriate commands."
- (cl-loop for (char . val) in register-alist
+ (cl-loop for (char . rval) in register-alist
for key = (single-key-description char)
+ for e27 = (registerv-p rval)
+ for val = (if e27 ; emacs-27
+ (registerv-data rval)
+ rval)
for string-actions =
(cond
((numberp val)
@@ -382,7 +400,7 @@ This is a command for `helm-kill-ring-map'."
'jump-to-register))
((and (vectorp val)
(fboundp 'undo-tree-register-data-p)
- (undo-tree-register-data-p (elt val 1)))
+ (undo-tree-register-data-p (if e27 val (elt val 1))))
(list
"Undo-tree entry."
'undo-tree-restore-state-from-register))
@@ -420,7 +438,7 @@ This is a command for `helm-kill-ring-map'."
'kill-new
'append-to-register
'prepend-to-register)))
- unless (null string-actions) ; Fix Issue #1107.
+ unless (null string-actions) ; Fix Bug#1107.
collect (cons (format "Register %3s:\n %s" key (car string-actions))
(cons char (cdr string-actions)))))
@@ -582,10 +600,4 @@ This command is useful when used with persistent action."
(provide 'helm-ring)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-ring.el ends here
diff --git a/helm-semantic.el b/helm-semantic.el
index a64ca3eb..07d15082 100644
--- a/helm-semantic.el
+++ b/helm-semantic.el
@@ -1,7 +1,7 @@
;;; helm-semantic.el --- Helm interface for Semantic -*- lexical-binding: t -*-
;; Copyright (C) 2012 ~ 2017 Daniel Hackney <dan@haxney.org>
-;; 2012 ~ 2019 Thierry Volpiatto<thierry.volpiatto@gmail.com>
+;; 2012 ~ 2020 Thierry Volpiatto<thierry.volpiatto@gmail.com>
;; Author: Daniel Hackney <dan@haxney.org>
@@ -229,10 +229,4 @@ Fill in the symbol at point by default."
(provide 'helm-semantic)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-semantic.el ends here
diff --git a/helm-shell.el b/helm-shell.el
index 5f946dc5..ce707517 100644
--- a/helm-shell.el
+++ b/helm-shell.el
@@ -1,6 +1,6 @@
;;; helm-shell.el --- Shell prompt navigation for helm. -*- lexical-binding: t -*-
-;; Copyright (C) 2019 Pierre Neidhardt <mail@ambrevar.xyz>
+;; Copyright (C) 2020 Pierre Neidhardt <mail@ambrevar.xyz>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -35,10 +35,4 @@
(provide 'helm-shell)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-shell ends here
diff --git a/helm-source.el b/helm-source.el
index deceb26f..951bebb8 100644
--- a/helm-source.el
+++ b/helm-source.el
@@ -1,6 +1,6 @@
;;; helm-source.el --- Helm source creation. -*- lexical-binding: t -*-
-;; Copyright (C) 2015 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2015 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; Author: Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; URL: http://github.com/emacs-helm/helm
@@ -53,10 +53,10 @@
(insert "\n* " (apply #'format format row) "\n"))))
-(defgeneric helm--setup-source (source)
+(cl-defgeneric helm--setup-source (source)
"Prepare slots and handle slot errors before creating a helm source.")
-(defgeneric helm-setup-user-source (source)
+(cl-defgeneric helm-setup-user-source (source)
"Allow users modifying slots in SOURCE just before creation.")
@@ -204,7 +204,7 @@
\"Delete current candidate without quitting.\"
(interactive)
(with-helm-alive-p
- (helm-attrset 'quick-delete '(helm-ff-quick-delete . never-split))
+ (helm-set-attr 'quick-delete '(helm-ff-quick-delete . never-split))
(helm-execute-persistent-action 'quick-delete)))
This function is then bound in `helm-find-files-map'.")
@@ -353,7 +353,15 @@
Avoid recomputing all candidates with candidate-transformer
or filtered-candidate-transformer to give a new value to REAL,
instead the selected candidate is transformed only when passing it
- to action.
+ to action. This works (and make sense) only with plain string
+ candidates, it will NOT work when candidate is a cons cell, in this
+ case the real value of candidate will be used.
+ Example:
+
+ (helm :sources (helm-build-sync-source \"test\"
+ :candidates '(a b c d e)
+ :display-to-real (lambda (c) (concat c \":modified by d-t-r\")))
+ :buffer \"*helm test*\")
Note that this is NOT a transformer,
so the display will not be modified by this function.")
@@ -367,10 +375,16 @@
Function called with one parameter, the selected candidate.
- The real value of candidates will be shown in display.
- Note: This have nothing to do with display-to-real.
- It is unuseful as the same can be performed by using more than
- one function in transformers, it is kept only for backward compatibility.")
+ The real value of candidates will be shown in display and of course
+ be used by action.
+ Example:
+
+ (helm :sources (helm-build-sync-source \"test\"
+ :candidates '((\"foo\" . 1) (\"bar\" . 2) (\"baz\". 3))
+ :real-to-display (lambda (c) (format \"%s\" (1+ c))))
+ :buffer \"*helm test*\")
+
+ Mostly deprecated, kept only for backward compatibility.")
(marked-with-props
:initarg :marked-with-props
@@ -877,7 +891,7 @@ See `helm-candidates-in-buffer' for more infos.")
(defclass helm-source-in-file (helm-source-in-buffer)
((init :initform (lambda ()
- (let ((file (helm-attr 'candidates-file))
+ (let ((file (helm-get-attr 'candidates-file))
(count 1))
(with-current-buffer (helm-candidate-buffer 'global)
(insert-file-contents file)
@@ -915,7 +929,8 @@ See `helm-candidates-in-buffer' for more infos.")
(defun helm--create-source (object)
"[INTERNAL] Build a helm source from OBJECT.
Where OBJECT is an instance of an eieio class."
- (cl-loop for s in (object-slots object)
+ (cl-loop for sd in (eieio-class-slots (eieio-object-class object))
+ for s = (eieio-slot-descriptor-name sd)
for slot-val = (slot-value object s)
when slot-val
collect (cons s slot-val)))
@@ -1007,38 +1022,45 @@ an eieio class."
(slot-value source 'header-line)))))
(defun helm-source--header-line (source)
+ "Compute a default header line for SOURCE.
+
+The header line is based on one of `persistent-action-if',
+`persistent-action', or `action' (in this order of precedence)."
(substitute-command-keys
(concat "\\<helm-map>\\[helm-execute-persistent-action]: "
- (helm-aif (or (slot-value source 'persistent-action)
- (slot-value source 'action))
- (cond ((and (symbolp it)
- (functionp it)
- (eq it 'identity))
- "Do Nothing")
- ((and (symbolp it)
- (boundp it)
- (listp (symbol-value it))
- (stringp (caar (symbol-value it))))
- (caar (symbol-value it)))
- ((or (symbolp it) (functionp it))
- (helm-symbol-name it))
- ((listp it)
- (let ((action (car it)))
- ;; It comes from :action ("foo" . function).
- (if (stringp (car action))
- (car action)
- ;; It comes from :persistent-action
- ;; (function . 'nosplit) Fix Issue #788.
- (if (or (symbolp action)
- (functionp action))
- (helm-symbol-name action)))))
- (t ""))
- "")
+ (helm-acond
+ ((slot-value source 'persistent-action-if)
+ (helm-symbol-name it))
+ ((or (slot-value source 'persistent-action)
+ (slot-value source 'action))
+ (cond ((and (symbolp it)
+ (functionp it)
+ (eq it 'identity))
+ "Do Nothing")
+ ((and (symbolp it)
+ (boundp it)
+ (listp (symbol-value it))
+ (stringp (caar (symbol-value it))))
+ (caar (symbol-value it)))
+ ((or (symbolp it) (functionp it))
+ (helm-symbol-name it))
+ ((listp it)
+ (let ((action (car it)))
+ ;; It comes from :action ("foo" . function).
+ (if (stringp (car action))
+ (car action)
+ ;; It comes from :persistent-action
+ ;; (function . 'nosplit) Fix Bug#788.
+ (if (or (symbolp action)
+ (functionp action))
+ (helm-symbol-name action)))))
+ (t "")))
+ (t ""))
" (keeping session)")))
-(defmethod helm--setup-source :primary ((_source helm-source)))
+(cl-defmethod helm--setup-source ((_source helm-source)))
-(defmethod helm--setup-source :before ((source helm-source))
+(cl-defmethod helm--setup-source :before ((source helm-source))
(unless (slot-value source 'group)
(setf (slot-value source 'group) 'helm))
(when (slot-value source 'delayed)
@@ -1087,9 +1109,9 @@ an eieio class."
it)))
(setf (slot-value source 'requires-pattern) val))))
-(defmethod helm-setup-user-source ((_source helm-source)))
+(cl-defmethod helm-setup-user-source ((_source helm-source)))
-(defmethod helm--setup-source ((source helm-source-sync))
+(cl-defmethod helm--setup-source ((source helm-source-sync))
(when (slot-value source 'fuzzy-match)
(helm-aif (slot-value source 'match)
(setf (slot-value source 'match)
@@ -1112,7 +1134,7 @@ an eieio class."
(setf (slot-value source 'fuzzy-match) nil)
(setf (slot-value source 'volatile) t)))
-(defmethod helm--setup-source ((source helm-source-in-buffer))
+(cl-defmethod helm--setup-source ((source helm-source-in-buffer))
(cl-assert (eq (slot-value source 'candidates) 'helm-candidates-in-buffer)
nil
(format "Wrong usage of `candidates' attr in `%s' use `data' or `init' instead"
@@ -1155,7 +1177,7 @@ an eieio class."
(cl-assert (eq (slot-value source 'volatile) t)
nil "Invalid slot value for `volatile'")))
-(defmethod helm--setup-source ((source helm-source-async))
+(cl-defmethod helm--setup-source ((source helm-source-async))
(cl-assert (null (slot-value source 'candidates))
nil "Incorrect use of `candidates' use `candidates-process' instead")
(cl-assert (null (slot-value source 'multimatch))
@@ -1163,7 +1185,7 @@ an eieio class."
(cl-assert (null (slot-value source 'fuzzy-match))
nil "`fuzzy-match' not supported in async sources."))
-(defmethod helm--setup-source ((source helm-source-dummy))
+(cl-defmethod helm--setup-source ((source helm-source-dummy))
(let ((mtc (slot-value source 'match)))
(cl-assert (or (equal '(identity) mtc)
(eq 'identity mtc))
@@ -1215,10 +1237,4 @@ Args ARGS are keywords provided by `helm-source-in-file'."
(provide 'helm-source)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-source ends here
diff --git a/helm-sys.el b/helm-sys.el
index 4d31d62a..d4ec6053 100644
--- a/helm-sys.el
+++ b/helm-sys.el
@@ -1,6 +1,6 @@
;;; helm-sys.el --- System related functions for helm. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -119,7 +119,7 @@ This affects also sorting functions in the same way."
(when (and (helm--alive-p) (null no-update))
;; Fix quitting while process is running
;; by binding `with-local-quit' in init function
- ;; Issue #1521.
+ ;; Bug#1521.
(helm-force-update
(cl-ecase helm-top-poll-preselection
(candidate (replace-regexp-in-string
@@ -340,7 +340,7 @@ Show actions only on line starting by a PID."
(interactive)
(helm-top-set-mode-line "CPU")
;; Force sorting by CPU even if some versions of top are using by
- ;; default CPU sorting (Issue #1908).
+ ;; default CPU sorting (Bug#1908).
(setq helm-top-sort-fn 'helm-top-sort-by-cpu)
(helm-update (helm-top--preselect-fn)))
@@ -453,10 +453,4 @@ Show actions only on line starting by a PID."
(provide 'helm-sys)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-sys.el ends here
diff --git a/helm-tags.el b/helm-tags.el
index e82a0aaa..47a2ad82 100644
--- a/helm-tags.el
+++ b/helm-tags.el
@@ -1,6 +1,6 @@
;;; helm-tags.el --- Helm for Etags. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -343,10 +343,4 @@ Create with etags shell command, or visit with `find-tag' or `visit-tags-table'.
(provide 'helm-tags)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-tags.el ends here
diff --git a/helm-types.el b/helm-types.el
index 10eaffce..3ec05d90 100644
--- a/helm-types.el
+++ b/helm-types.el
@@ -1,6 +1,6 @@
;;; helm-types.el --- Helm types classes and methods. -*- lexical-binding: t -*-
-;; Copyright (C) 2015 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2015 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; Author: Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; URL: http://github.com/emacs-helm/helm
@@ -23,6 +23,7 @@
(require 'cl-lib)
(require 'eieio)
+(eval-when-compile (require 'helm-source))
(defvar helm-map)
(defvar helm-mode-line-string)
@@ -36,7 +37,7 @@
(defclass helm-type-file (helm-source) ()
"A class to define helm type file.")
-(defmethod helm-source-get-action-from-type ((object helm-type-file))
+(cl-defmethod helm-source-get-action-from-type ((object helm-type-file))
(slot-value object 'action))
(defun helm-actions-from-type-file ()
@@ -75,7 +76,7 @@
(defcustom helm-type-file-actions
(helm-make-actions
- "Find file" 'helm-find-many-files
+ "Find file" 'helm-find-file-or-marked
"Find file as root" 'helm-find-file-as-root
"Find file other window" 'helm-find-files-other-window
"Find file other frame" 'find-file-other-frame
@@ -105,9 +106,9 @@
:group 'helm-files
:type '(alist :key-type string :value-type function))
-(defmethod helm--setup-source :primary ((_source helm-type-file)))
+(cl-defmethod helm--setup-source ((_source helm-type-file)))
-(defmethod helm--setup-source :before ((source helm-type-file))
+(cl-defmethod helm--setup-source :before ((source helm-type-file))
(setf (slot-value source 'action) 'helm-type-file-actions)
(setf (slot-value source 'persistent-help) "Show this file")
(setf (slot-value source 'action-transformer)
@@ -145,12 +146,12 @@
:type '(alist :key-type string
:value-type function))
-(defmethod helm-source-get-action-from-type ((object helm-type-bookmark))
+(cl-defmethod helm-source-get-action-from-type ((object helm-type-bookmark))
(slot-value object 'action))
-(defmethod helm--setup-source :primary ((_source helm-type-bookmark)))
+(cl-defmethod helm--setup-source ((_source helm-type-bookmark)))
-(defmethod helm--setup-source :before ((source helm-type-bookmark))
+(cl-defmethod helm--setup-source :before ((source helm-type-bookmark))
(setf (slot-value source 'action) 'helm-type-bookmark-actions)
(setf (slot-value source 'keymap) helm-bookmark-map)
(setf (slot-value source 'mode-line) (list "Bookmark(s)" helm-mode-line-string))
@@ -173,7 +174,7 @@
'switch-to-buffer-other-frame
(lambda () (and (fboundp 'tab-bar-mode)
"Switch to buffer other tab `C-c C-t'"))
- 'switch-to-buffer-other-tab
+ 'helm-buffers-switch-to-buffer-other-tab
"Switch to buffer at line number"
'helm-switch-to-buffer-at-linum
"Browse project `C-x C-d'"
@@ -200,18 +201,18 @@
:group 'helm-buffers
:type '(alist :key-type string :value-type function))
-(defmethod helm-source-get-action-from-type ((object helm-type-buffer))
+(cl-defmethod helm-source-get-action-from-type ((object helm-type-buffer))
(slot-value object 'action))
-(defmethod helm--setup-source :primary ((_source helm-type-buffer)))
+(cl-defmethod helm--setup-source ((_source helm-type-buffer)))
-(defmethod helm--setup-source :before ((source helm-type-buffer))
+(cl-defmethod helm--setup-source :before ((source helm-type-buffer))
(setf (slot-value source 'action) 'helm-type-buffer-actions)
(setf (slot-value source 'persistent-help) "Show this buffer")
(setf (slot-value source 'mode-line)
;; Use default-value of `helm-mode-line-string' in case user
;; starts with a helm buffer as current-buffer otherwise the
- ;; local value of this helm buffer is used (issues #1517,#2377).
+ ;; local value of this helm buffer is used (bug#1517, bug#2377).
(list "Buffer(s)" (default-value 'helm-mode-line-string)))
(setf (slot-value source 'filtered-candidate-transformer)
'(helm-skip-boring-buffers
@@ -226,7 +227,9 @@
(defcustom helm-type-function-actions
(helm-make-actions
"Describe function" 'helm-describe-function
- "Find function" 'find-function
+ "Find function" (if (fboundp 'xref-find-definitions)
+ ;; Find-function is broken in emacs-27.
+ 'xref-find-definitions 'find-function)
"Info lookup" 'helm-info-lookup-symbol
"Debug on entry" 'debug-on-entry
"Cancel debug on entry" 'cancel-debug-on-entry
@@ -239,7 +242,7 @@
;; autoloaded (like untrace-function).
:type '(alist :key-type string :value-type symbol))
-(defmethod helm-source-get-action-from-type ((object helm-type-function))
+(cl-defmethod helm-source-get-action-from-type ((object helm-type-function))
(slot-value object 'action))
(defun helm-actions-from-type-function ()
@@ -247,9 +250,9 @@
(helm--setup-source source)
(helm-source-get-action-from-type source)))
-(defmethod helm--setup-source :primary ((_source helm-type-function)))
+(cl-defmethod helm--setup-source ((_source helm-type-function)))
-(defmethod helm--setup-source :before ((source helm-type-function))
+(cl-defmethod helm--setup-source :before ((source helm-type-function))
(setf (slot-value source 'action) 'helm-type-function-actions)
(setf (slot-value source 'action-transformer)
'helm-transform-function-call-interactively)
@@ -276,9 +279,9 @@
:group 'helm-command
:type '(alist :key-type string :value-type symbol))
-(defmethod helm--setup-source :primary ((_source helm-type-command)))
+(cl-defmethod helm--setup-source ((_source helm-type-command)))
-(defmethod helm--setup-source :before ((source helm-type-command))
+(cl-defmethod helm--setup-source :before ((source helm-type-command))
(setf (slot-value source 'action) 'helm-type-command-actions)
(setf (slot-value source 'coerce) 'helm-symbolify)
(setf (slot-value source 'persistent-action) 'helm-M-x-persistent-action)
@@ -306,9 +309,9 @@
:group 'helm-elisp
:type '(alist :key-type string :value-type function))
-(defmethod helm--setup-source :primary ((_source helm-type-timers)))
+(cl-defmethod helm--setup-source ((_source helm-type-timers)))
-(defmethod helm--setup-source :before ((source helm-type-timers))
+(cl-defmethod helm--setup-source :before ((source helm-type-timers))
(setf (slot-value source 'action) 'helm-type-timers-actions)
(setf (slot-value source 'persistent-action)
(lambda (tm)
@@ -328,10 +331,4 @@
(provide 'helm-types)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-types.el ends here
diff --git a/helm-utils.el b/helm-utils.el
index d42443fe..ca3cd905 100644
--- a/helm-utils.el
+++ b/helm-utils.el
@@ -1,6 +1,6 @@
;;; helm-utils.el --- Utilities Functions for helm. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -20,14 +20,14 @@
(require 'cl-lib)
(require 'helm)
(require 'helm-help)
-(eval-when-compile (require 'dired))
(declare-function helm-find-files-1 "helm-files" (fname &optional preselect))
(declare-function helm-grep-split-line "helm-grep" (line))
(declare-function popup-tip "ext:popup")
-(declare-function markdown-show-subtree "outline")
+(declare-function markdown-show-entry "ext:markdown-mode.el")
(declare-function outline-show-subtree "outline")
(declare-function org-reveal "org")
+(declare-function hs-show-block "hideshow.el")
(declare-function tab-bar-tabs "tab-bar")
(declare-function tab-bar-select-tab "tab-bar")
(declare-function dired-goto-file "dired")
@@ -35,14 +35,18 @@
(declare-function package-installed-p "package")
(declare-function package-desc-dir "package")
+(defvar hs-minor-mode)
+(defvar hs-show-hook)
(defvar org-directory)
(defvar winner-boring-buffers)
(defvar bookmark-alist)
+(defvar dired-buffers)
(defvar helm-show-completion-overlay)
(defvar helm-buffers-maybe-switch-to-tab)
(defvar helm-ff-transformer-show-only-basename)
(defvar helm-popup-tip-mode)
+
(defgroup helm-utils nil
"Utilities routines for Helm."
@@ -93,8 +97,7 @@ Possible value are:
:group 'helm-utils
:type 'integer)
-(defcustom helm-sources-using-help-echo-popup '("Moccur" "Imenu in all buffers"
- "Ack-Grep" "AG" "RG" "Gid" "Git-Grep")
+(defcustom helm-sources-using-help-echo-popup '("Ack-Grep" "AG" "RG" "Gid" "Git-Grep")
"Show the buffer name or the filename in a popup at selection."
:group 'helm-utils
:type '(repeat (choice string)))
@@ -139,6 +142,7 @@ last position is added to the register `helm-save-pos-before-jump-register'.")
("&brvbar;" . 166) ;; ¦
("&sect;" . 167) ;; §
("&uml;" . 32) ;; SPC
+ ("&nbsp;" . 160) ;;   (non breaking space)
("&copy;" . 169) ;; ©
("&ordf;" . 97) ;; a
("&laquo;" . 171) ;; «
@@ -227,7 +231,8 @@ last position is added to the register `helm-save-pos-before-jump-register'.")
("&reg;" . 174) ;; ®
("&shy;" . 173)) ;; ­
- "Table of html character entities and values.")
+ "Table of html character entities and values.
+See https://www.freeformatter.com/html-entities.html")
(defvar helm-find-many-files-after-hook nil
"Hook that runs at end of `helm-find-many-files'.")
@@ -480,12 +485,16 @@ Default is `helm-current-buffer'."
((and (boundp 'outline-minor-mode)
outline-minor-mode)
#'outline-show-subtree)
+ ((and (boundp 'hs-minor-mode)
+ hs-minor-mode)
+ #'hs-show-block)
((and (boundp 'markdown-mode-map)
(derived-mode-p 'markdown-mode))
- #'markdown-show-subtree))))
+ #'markdown-show-entry)))
+ (hs-show-hook (list (lambda () (goto-char loc)))))
;; outline may fail in some conditions e.g. with markdown enabled
- ;; (issue #1919).
- (condition-case nil
+ ;; (Bug#1919).
+ (condition-case-unless-debug nil
(and fn (funcall fn))
(error nil))))
@@ -589,7 +598,7 @@ from its directory."
(grep-line (and (stringp sel)
(helm-grep-split-line sel)))
(occur-fname (helm-aand (numberp sel)
- (helm-attr 'buffer-name)
+ (helm-get-attr 'buffer-name)
(buffer-file-name (get-buffer it))))
(bmk-name (and (stringp sel)
(not grep-line)
@@ -1055,6 +1064,7 @@ Assume regexp is a pcre based regexp."
(defun helm-open-dired (file)
"Open a dired buffer in FILE's directory.
If FILE is a directory, open this directory."
+ (require 'dired)
(if (file-directory-p file)
(dired file)
(dired (file-name-directory file))
@@ -1139,10 +1149,4 @@ When unable to decode ENTITY returns nil."
(provide 'helm-utils)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-utils.el ends here
diff --git a/helm-x-files.el b/helm-x-files.el
index b613ad2e..dad5876e 100644
--- a/helm-x-files.el
+++ b/helm-x-files.el
@@ -1,6 +1,6 @@
;;; helm-x-files.el --- helm auxiliary functions and sources. -*- lexical-binding: t -*-
-;; Copyright (C) 2012 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; Copyright (C) 2012 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -26,7 +26,7 @@
;;
;;
(defvar dired-buffers)
-(defvar dired-re-no-dot)
+(defvar directory-files-no-dot-files-regexp)
(defun helm-files-in-all-dired-candidates ()
"Return a list of files from live `dired' buffers."
(save-excursion
@@ -34,7 +34,7 @@
when (buffer-live-p b)
append (let ((dir (with-current-buffer b dired-directory)))
(if (listp dir) (cdr dir)
- (directory-files f t dired-re-no-dot))))))
+ (directory-files f t directory-files-no-dot-files-regexp))))))
;; (dired '("~/" "~/.emacs.d/.emacs-custom.el" "~/.emacs.d/.emacs.bmk"))
@@ -124,10 +124,4 @@ with the tracker desktop search.")
(provide 'helm-x-files)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm-x-files.el ends here
diff --git a/helm.el b/helm.el
index 1d4dbf9c..3241ec02 100644
--- a/helm.el
+++ b/helm.el
@@ -5,7 +5,7 @@
;; Copyright (C) 2007 Tamas Patrovics
;; 2008 ~ 2011 rubikitch <rubikitch@ruby-lang.org>
-;; 2011 ~ 2019 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+;; 2011 ~ 2020 Thierry Volpiatto <thierry.volpiatto@gmail.com>
;; This is a fork of anything.el wrote by Tamas Patrovics.
@@ -251,7 +251,7 @@ and vectors, so don't use strings to define them."
(define-key map (kbd "C-c %") 'helm-exchange-minibuffer-and-header-line)
(define-key map (kbd "C-c C-y") 'helm-yank-selection)
(define-key map (kbd "C-c C-k") 'helm-kill-selection-and-quit)
- (define-key map (kbd "C-c C-i") 'helm-copy-to-buffer)
+ (define-key map (kbd "C-c C-i") 'helm-insert-or-copy)
(define-key map (kbd "C-c C-f") 'helm-follow-mode)
(define-key map (kbd "C-c C-u") 'helm-refresh)
(define-key map (kbd "C-c >") 'helm-toggle-truncate-line)
@@ -306,7 +306,7 @@ and vectors, so don't use strings to define them."
Default to Helm group when group is not defined in source."
(interactive)
- (helm-run-after-exit 'helm-customize-group-1 (helm-attr 'group)))
+ (helm-run-after-exit 'helm-customize-group-1 (helm-get-attr 'group)))
(put 'helm-customize-group 'helm-only t)
(defun helm--action-at-nth-set-fn-1 (value &optional negative)
@@ -887,6 +887,11 @@ You can toggle later `truncate-lines' with
\\<helm-map>\\[helm-toggle-truncate-line]."
:group 'helm
:type 'boolean)
+
+(defcustom helm-visible-mark-prefix "*"
+ "Prefix used in margin for marked candidates."
+ :group 'helm
+ :type 'string)
;;; Faces
;;
@@ -1019,6 +1024,11 @@ You can toggle later `truncate-lines' with
"Face for empty line at end of sources in the Helm buffer.
Allow specifying the height of this line."
:group 'helm-faces)
+
+(defface helm-mark-prefix
+ `((t :inherit default))
+ "Face for string `helm-visible-mark-prefix'."
+ :group 'helm-faces)
;;; Variables.
;;
@@ -1089,7 +1099,8 @@ minibuffer abnormally (e.g. via `helm-keyboard-quit').")
"Runs after pre-selection in `helm-buffer'.")
(defvar helm-window-configuration-hook nil
- "Runs when switching to and from the action buffer.")
+ "Runs when switching to and from the action buffer.
+Should run also at end of `helm-display-function'.")
(defvar helm-execute-action-at-once-if-one nil
"When non-nil execute the default action and then exit if only one candidate.
@@ -1191,8 +1202,8 @@ wiki]] for more infos.
You will find in Helm sources already built and bound to a
variable called generally `helm-source-<something>'. In this case
it is an alist and you can change the attributes (keys) values
-using `helm-attrset' function in your configuration. Of course
-you have to ensure before calling `helm-attrset' that the file
+using `helm-set-attr' function in your configuration. Of course
+you have to ensure before calling `helm-set-attr' that the file
containing source is loaded, e.g. with `with-eval-after-load'. Of
course you can also completely redefine the source but this is
generally not elegant as it duplicate for its most part code
@@ -1205,7 +1216,7 @@ Helm session. In this case you can add a defmethod called
#+begin_src elisp
- (defmethod helm-setup-user-source ((source helm-moccur-class))
+ (cl-defmethod helm-setup-user-source ((source helm-moccur-class))
(setf (slot-value source 'follow) -1))
#+end_src
@@ -1240,6 +1251,13 @@ match everything but this.
*** Completion-styles
+UPDATE: At version 3.8.0 Helm default is now to NOT use
+`completion-styles' i.e. now `helm-completion-style' default to
+'helm and no more to 'emacs.
+
+If you want to use `completion-styles' in Helm customize
+`helm-completion-style' to 'emacs.
+
Helm generally fetches its candidates with the :candidates
function up to `helm-candidate-number-limit' and then applies
match functions to these candidates according to `helm-pattern'.
@@ -1249,11 +1267,12 @@ Helm provides 'helm completion style but also 'helm-flex
completion style for Emacs<27 that don't have 'flex completion
style, otherwise (emacs-27) 'flex completion style is used to
provide fuzzy aka flex completion.
-By default, like in Emacs vanilla, all completion commands \(e.g.,
-`completion-at-point') using `completion-in-region' or
-`completing-read' use `completion-styles'.
-Some Helm native commands like `helm-M-x' do use
-`completion-styles'. Any Helm sources can use `completion-styles'
+
+When using helm-fuzzy as `helm-completion-style' helm use its own
+fuzzy implementation which have nothing to do with emacs `flex'
+style.
+
+Any Helm sources can use `completion-styles'
by using :match-dynamic slot and building their :candidates
function with `helm-dynamic-completion'.
@@ -1280,7 +1299,7 @@ emacs-26. Anyway, 'helm-flex is not provided in
Finally Helm provides two user variables to control
`completion-styles' usage: `helm-completion-style' and
-`helm-completion-syles-alist'. Both variables are customizable.
+`helm-completion-styles-alist'. Both variables are customizable.
The former allows retrieving previous Helm behavior if needed, by
setting it to `helm' or `helm-fuzzy', default being `emacs' which
allows dynamic completion and usage of `completion-styles'. The
@@ -1292,7 +1311,7 @@ helmized commands. File completion in `read-file-name' family
doesn't obey completion-styles and has its own file completion
implementation. Native Helm commands using `completion-styles'
doesn't obey `helm-completion-style' and
-`helm-completion-syles-alist' (e.g., helm-M-x).
+`helm-completion-styles-alist' (e.g., helm-M-x).
Also for a better control of styles in native Helm sources (not
helmized by helm-mode) using :match-dynamic,
@@ -1344,7 +1363,7 @@ matching or fuzzy matching (see [[Matching in Helm][Matching in
Helm]]).
Completion is not done dynamically (against `helm-pattern')
-because backend functions (i.e. `competion-at-point-functions')
+because backend functions (i.e. `completion-at-point-functions')
are not aware of Helm matching methods.
By behaving like this, the benefit is that you can fully use Helm
@@ -1421,13 +1440,26 @@ the `helm' group.
You can display the Helm completion buffer in many different
window configurations, see the custom interface to discover the
-different windows configurations available (See [[Customize
-Helm][Customize Helm]] to jump to custom interface). When using
-Emacs in a graphic display (i.e. not in a terminal) you can as
+different windows configurations available (See [[Customize Helm][Customize Helm]] to jump to custom interface).
+When using Emacs in a graphic display (i.e. not in a terminal) you can as
well display your Helm buffers in separated frames globally for
-all Helm commands or separately for specific Helm commands. See
-[[https://github.com/emacs-helm/helm/wiki/frame][helm wiki]] for
-more infos.
+all Helm commands or separately for specific Helm commands.
+See `helm-display-function' and `helm-commands-using-frame'.
+See also [[https://github.com/emacs-helm/helm/wiki/frame][helm wiki]] for more infos.
+
+There is a variable to allow reusing frame instead of deleting
+and creating a new one at each session, see `helm-display-buffer-reuse-frame'.
+Normally you don't have to use this, it have been made to workaround
+slow frame popup in Emacs-26, to workaround this slowness in Emacs-26 use instead
+
+#+begin_src elisp
+ (when (= emacs-major-version 26)
+ (setq x-wait-for-event-timeout nil))
+#+end_src
+
+WARNING:
+There is a package called posframe and also one called helm-posframe,
+you DO NOT need these packages to display helm buffers in frames.
** Helm's basic operations and default key bindings
@@ -1577,17 +1609,19 @@ line without executing the persistent action.
** Frequently Used Commands
-\\[helm-toggle-resplit-and-swap-windows]\t\tToggle vertical/horizontal split on first hit and swap Helm window on second hit.
-\\[helm-exchange-minibuffer-and-header-line]\t\tExchange minibuffer and header-line.
-\\[helm-quit-and-find-file]\t\tDrop into `helm-find-files'.
-\\[helm-kill-selection-and-quit]\t\tKill display value of candidate and quit (with prefix arg, kill the real value).
-\\[helm-yank-selection]\t\tYank current selection into pattern.
-\\[helm-copy-to-buffer]\t\tCopy selected candidate at point in current buffer.
-\\[helm-follow-mode]\t\tToggle automatic execution of persistent action.
-\\[helm-follow-action-forward]\tRun persistent action then select next line.
-\\[helm-follow-action-backward]\t\tRun persistent action then select previous line.
-\\[helm-refresh]\t\tRecalculate and redisplay candidates.
-\\[helm-toggle-suspend-update]\t\tToggle candidate updates.
+|Keys|Description
+|-----------+----------|
+|\\[helm-toggle-resplit-and-swap-windows]|Toggle vertical/horizontal split on first hit and swap Helm window on second hit.
+|\\[helm-exchange-minibuffer-and-header-line]|Exchange minibuffer and header-line.
+|\\[helm-quit-and-find-file]|Drop into `helm-find-files'.
+|\\[helm-kill-selection-and-quit]|Kill display value of candidate and quit (with prefix arg, kill the real value).
+|\\[helm-yank-selection]|Yank current selection into pattern.
+|\\[helm-insert-or-copy]|Insert or copy marked candidates (C-u) .
+|\\[helm-follow-mode]|Toggle automatic execution of persistent action.
+|\\[helm-follow-action-forward]|Run persistent action then select next line.
+|\\[helm-follow-action-backward]|Run persistent action then select previous line.
+|\\[helm-refresh]|Recalculate and redisplay candidates.
+|\\[helm-toggle-suspend-update]|Toggle candidate updates.
** Special yes, no or yes for all answers
@@ -1764,7 +1798,6 @@ in `helm-initialize'.")
"Internal, store locally `helm-pattern' value for later use in `helm-resume'.")
(defvar helm--source-name nil)
(defvar helm-current-source nil)
-(defvar helm-tick-hash (make-hash-table :test 'equal))
(defvar helm-issued-errors nil)
(defvar helm--last-log-file nil
"The name of the log file of the last Helm session.")
@@ -1788,7 +1821,7 @@ Knowing this exit-status could help restore a window config when
Helm aborts in some special circumstances. See
`helm-exit-minibuffer' and `helm-keyboard-quit'.")
(defvar helm-minibuffer-confirm-state nil)
-(defvar helm-quit nil)
+(defvar helm--quit nil)
(defvar helm-buffers nil
"Helm buffers listed in order of most recently used.")
(defvar helm-current-position nil
@@ -1870,6 +1903,7 @@ session just like resume would do.")
It is generally `helm-current-buffer', but when this one is displayed
in a dedicated buffer, helm can't start in this window and use another
window handling a buffer, it is this one we store.")
+(defvar helm--tramp-archive-maybe-loaded nil)
;; Utility: logging
(defun helm-log (format-string &rest args)
@@ -2039,7 +2073,7 @@ End:")
;;; helm-attributes
;;
-(defun helm-attr (attribute-name &optional source compute)
+(defun helm-get-attr (attribute-name &optional source compute)
"Get the value of ATTRIBUTE-NAME of SRC.
If SRC is omitted, use current source.
@@ -2052,7 +2086,7 @@ value unchanged, but will eval a symbol which is bound.
You can use `setf' to modify value of ATTRIBUTE-NAME unless
COMPUTE is specified, if attribute ATTRIBUTE-NAME is not found in
SOURCE `setf' will create new attribute ATTRIBUTE-NAME with
-specified value. You can also use `helm-attrset' to modify
+specified value. You can also use `helm-set-attr' to modify
ATTRIBUTE-NAME."
(declare (gv-setter
(lambda (val)
@@ -2072,17 +2106,10 @@ ATTRIBUTE-NAME."
(helm-interpret-value (cdr it) src compute)
(cdr it)))))
-;; (helm-aif (assq attribute-name src)
-;; (let* ((val (cdr it))
-;; When attr exists but have no cdr it is equal to `t'.
-;; (attrval (or val t)))
-;; Attributes with a boolean value have no cdr, so no need
-;; to compute a value == to t.
-;; (if (and compute val)
-;; (helm-interpret-value val src compute)
-;; attrval)))))
-
-(cl-defun helm-attrset (attribute-name value
+(defalias 'helm-attr 'helm-get-attr)
+(make-obsolete 'helm-attr 'helm-get-attr "3.7.0")
+
+(cl-defun helm-set-attr (attribute-name value
&optional
(src (helm-get-current-source)))
"Set the value of ATTRIBUTE-NAME of source SRC to VALUE.
@@ -2091,9 +2118,11 @@ If ATTRIBUTE-NAME doesn't exists in source it is created with
value VALUE. If SRC is omitted, use current source. If operation
succeed, return value, otherwise nil.
-Note that `setf' on `helm-attr' can be used instead of this
-function."
- (setf (helm-attr attribute-name src) value))
+Using this function is same as using `setf' on `helm-get-attr'."
+ (setf (helm-get-attr attribute-name src) value))
+
+(defalias 'helm-attrset 'helm-set-attr)
+(make-obsolete 'helm-attrset 'helm-set-attr "3.7.0")
(defun helm-add-action-to-source (name fn source &optional index)
"Add new action NAME linked to function FN to SOURCE.
@@ -2104,11 +2133,11 @@ If INDEX is specified, action is added to the action list at INDEX,
otherwise added at end.
This allows users to add specific actions to an existing source
without modifying source code."
- (let ((actions (helm-attr 'action source 'ignorefn))
+ (let ((actions (helm-get-attr 'action source 'ignorefn))
(new-action (list (cons name fn))))
(when (functionp actions)
(setq actions (list (cons "Default action" actions))))
- (helm-attrset 'action
+ (helm-set-attr 'action
(if index
(helm-append-at-nth actions new-action index)
(append actions new-action))
@@ -2118,11 +2147,11 @@ without modifying source code."
"Delete ACTION-OR-NAME from SOURCE.
ACTION-OR-NAME can either be the name of action or the symbol
function associated to name."
- (let* ((actions (helm-attr 'action source 'ignorefn))
+ (let* ((actions (helm-get-attr 'action source 'ignorefn))
(del-action (if (symbolp action-or-name)
(rassoc action-or-name actions)
(assoc action-or-name actions))))
- (helm-attrset 'action (delete del-action actions) source)))
+ (helm-set-attr 'action (delete del-action actions) source)))
(cl-defun helm-add-action-to-source-if (name fn source predicate
&optional (index 4) test-only)
@@ -2150,8 +2179,8 @@ when predicate helm-ff-candidates-lisp-p returns non-nil:
'async-byte-compile-file
helm-source-find-files
'helm-ff-candidates-lisp-p\)."
- (let* ((actions (helm-attr 'action source 'ignorefn))
- (action-transformers (helm-attr 'action-transformer source))
+ (let* ((actions (helm-get-attr 'action source 'ignorefn))
+ (action-transformers (helm-get-attr 'action-transformer source))
(new-action (list (cons name fn)))
(transformer (lambda (actions candidate)
(cond ((funcall predicate candidate)
@@ -2159,12 +2188,12 @@ when predicate helm-ff-candidates-lisp-p returns non-nil:
actions new-action index))
(t actions)))))
(when (functionp actions)
- (helm-attrset 'action (list (cons "Default action" actions)) source))
+ (helm-set-attr 'action (list (cons "Default action" actions)) source))
(when (or (symbolp action-transformers) (functionp action-transformers))
(setq action-transformers (list action-transformers)))
(if test-only ; debug
(delq nil (append (list transformer) action-transformers))
- (helm-attrset 'action-transformer
+ (helm-set-attr 'action-transformer
(helm-fast-remove-dups
(delq nil (append (list transformer) action-transformers))
:test 'equal)
@@ -2229,42 +2258,47 @@ If NO-UPDATE is non-nil, skip executing `helm-update'."
(unless no-update (helm-update)))
(defun helm-get-selection (&optional buffer force-display-part source)
- "Return the currently selected item or nil.
+ "Return the currently selected candidate from BUFFER.
If BUFFER is nil or unspecified, use `helm-buffer' as default value.
-If FORCE-DISPLAY-PART is non-nil, return the display string.
-If FORCE-DISPLAY-PART value is `withprop' the display string is returned
-with its properties."
- (setq buffer (or buffer helm-buffer))
- (unless (or (helm-empty-buffer-p buffer)
- (helm-pos-header-line-p))
- (with-current-buffer buffer
- (let* ((disp-fn (if (eq force-display-part 'withprop)
+
+If FORCE-DISPLAY-PART is non-nil, return the display part of candidate.
+
+If FORCE-DISPLAY-PART value is `withprop' the display part of
+candidate is returned with its properties.
+
+When FORCE-DISPLAY-PART is nil the real part of candidate is returned.
+
+SOURCE default to current-source when unspecified but it is better to
+specify SOURCE when it is already available to avoid to call
+`helm-get-current-source' uselessly.
+
+Note that FORCE-DISPLAY-PART when specified takes precedence over
+`display-to-real' attribute, that's mean don't use FORCE-DISPLAY-PART
+when you want the `display-to-real' function(s) to be applied."
+ (with-current-buffer (or buffer helm-buffer)
+ (unless (or (helm-empty-buffer-p (current-buffer))
+ (helm-pos-header-line-p))
+ (let* ((beg (overlay-start helm-selection-overlay))
+ (end (overlay-end helm-selection-overlay))
+ (disp-fn (if (eq force-display-part 'withprop)
'buffer-substring
'buffer-substring-no-properties))
- (selection
- (or (and (not force-display-part)
- (get-text-property (overlay-start
- helm-selection-overlay)
- 'helm-realvalue))
- ;; It is needed to return properties of DISP in some case,
- ;; e.g for `helm-confirm-and-exit-minibuffer',
- ;; so use `buffer-substring' here when 'withprop is specified.
- (let* ((beg (overlay-start helm-selection-overlay))
- (end (overlay-end helm-selection-overlay))
- ;; If there is no selection at point, the
- ;; overlay is at its initial pos, (point-min)
- ;; (point-min), that's mean the helm-buffer
- ;; is not empty but have no selection yet,
- ;; this happen with grep sentinel sending an
- ;; error message in helm-buffer when no matches.
- (disp (unless (= beg end) (funcall disp-fn beg (1- end))))
- (src (or source (helm-get-current-source))))
- (helm-aif (and src disp
- (not force-display-part)
- (assoc-default 'display-to-real src))
- (helm-apply-functions-from-source source it disp)
- disp)))))
+ ;; If there is no selection at point, the
+ ;; overlay is at its initial pos, (point-min)
+ ;; (point-min), that's mean the helm-buffer
+ ;; is not empty but have no selection yet,
+ ;; this happen with grep sentinel sending an
+ ;; error message in helm-buffer when no matches.
+ (disp (unless (= beg end) (funcall disp-fn beg (1- end))))
+ (src (or source (helm-get-current-source)))
+ (selection (helm-acond (force-display-part disp)
+ ;; helm-realvalue always takes precedence
+ ;; over display-to-real.
+ ((get-text-property beg 'helm-realvalue) it)
+ ((assoc-default 'display-to-real src)
+ (helm-apply-functions-from-source source it disp))
+ (t disp))))
(unless (equal selection "")
(helm-log "selection = %S" selection)
selection)))))
@@ -2275,10 +2309,10 @@ It is a function symbol (sole action) or list
of (action-display . function)."
(unless (helm-empty-buffer-p (helm-buffer-get))
(let ((src (helm-get-current-source)))
- (helm-aif (helm-attr 'action-transformer)
+ (helm-aif (helm-get-attr 'action-transformer)
(helm-apply-functions-from-source
(or source src) it
- (helm-attr 'action nil 'ignorefn)
+ (helm-get-attr 'action nil 'ignorefn)
;; Check if the first given transformer
;; returns the same set of actions for each
;; candidate in marked candidates.
@@ -2291,7 +2325,7 @@ of (action-display . function)."
always (equal (funcall act nil c) acts))
(car (helm-marked-candidates))
(helm-get-selection nil nil src)))
- (helm-attr 'action nil 'ignorefn)))))
+ (helm-get-attr 'action nil 'ignorefn)))))
(defun helm-get-current-source ()
"Return the source for the current selection.
@@ -2313,22 +2347,6 @@ Return nil when `helm-buffer' is empty."
(and (equal (assoc-default 'name source) source-name)
source)))))))))
-(defun helm-buffer-is-modified (buffer)
- "Return non-nil when BUFFER is modified since Helm was invoked."
- (let* ((buf (get-buffer buffer))
- (key (concat (buffer-name buf) "/" (helm-attr 'name)))
- (source-tick (or (gethash key helm-tick-hash) 0))
- (buffer-tick (buffer-chars-modified-tick buf))
- (modifiedp (/= source-tick buffer-tick)))
- (puthash key buffer-tick helm-tick-hash)
- (helm-log "buffer = %S" buffer)
- (helm-log "modifiedp = %S" modifiedp)
- modifiedp))
-
-(defun helm-current-buffer-is-modified ()
- "Check if `helm-current-buffer' is modified since Helm was invoked."
- (helm-buffer-is-modified helm-current-buffer))
-
(defun helm-run-after-exit (function &rest args)
"Execute FUNCTION with ARGS after exiting Helm.
The action is to call FUNCTION with arguments ARGS.
@@ -2576,24 +2594,11 @@ of current source only."
while (not (if in-current-source
(or (helm-pos-header-line-p) (eobp))
(eobp)))
- ;; Don't count empty lines maybe added by popup (#1370).
+ ;; Don't count empty lines maybe added by popup (bug#1370).
unless (or (eq (point-at-bol) (point-at-eol))
(helm-pos-header-line-p))
do (cl-incf ln)
do (forward-line 1) finally return ln))))))
-
-(defmacro with-helm-quittable (&rest body)
- "If an error occurs in execution of BODY, safely quit helm."
- (declare (indent 0) (debug t))
- `(condition-case _v
- (let (inhibit-quit)
- ,@body)
- (quit (setq quit-flag t)
- (setq helm-quit t)
- (exit-minibuffer)
- (keyboard-quit)
- ;; See comment about this in `with-local-quit'.
- (eval '(ignore nil)))))
;; Entry point
;; `:allow-nest' is not in this list because it is treated before.
@@ -2796,6 +2801,17 @@ in the source.
unless (memq key helm-argument-keys)
collect (cons sym value)))
+(defun helm--maybe-load-tramp-archive ()
+ ;; Should fix bug#2393 and bug#2394. `while-no-input-ignore-events'
+ ;; is also let-bounded in `helm--maybe-use-while-no-input'.
+ (let ((while-no-input-ignore-events
+ (cons 'dbus-event while-no-input-ignore-events)))
+ (unless helm--tramp-archive-maybe-loaded
+ ;; This for Emacs-27 not requiring tramp-archive.
+ (and (boundp 'tramp-archive-enabled)
+ (require 'tramp-archive nil t))
+ (setq helm--tramp-archive-maybe-loaded t))))
+
;;; Entry point helper
(defun helm-internal (&optional
sources input
@@ -2810,6 +2826,8 @@ HISTORY args see `helm'."
nil "Error in %S buffer: Initial input should be a string or nil"
buffer)
(unless helm--nested (setq helm-initial-frame (selected-frame)))
+ ;; Launch tramp-archive with dbus-event in `while-no-input-ignore-events'.
+ (helm--maybe-load-tramp-archive)
;; Activate the advices.
;; Advices will be available only in >=emacs-24.4, but
;; allow compiling without errors on lower emacs.
@@ -2819,7 +2837,7 @@ HISTORY args see `helm'."
(advice-add 'epa-passphrase-callback-function
:around #'helm--suspend-read-passwd)
;; Ensure linum-mode is disabled in Helm buffers to preserve
- ;; performances (Issue #1894).
+ ;; performances (Bug#1894).
(advice-add 'linum-on :override #'helm--advice-linum-on '((depth . 100))))
(helm-log (concat "[Start session] " (make-string 41 ?+)))
(helm-log "prompt = %S" prompt)
@@ -2831,7 +2849,7 @@ HISTORY args see `helm'."
(setq helm--prompt (or prompt "pattern: "))
(let ((non-essential t)
;; Prevent mouse jumping to the upper-right
- ;; hand corner of the frame (#1538).
+ ;; hand corner of the frame (bug#1538).
mouse-autoselect-window
focus-follows-mouse
mode-line-in-non-selected-windows
@@ -2849,7 +2867,7 @@ HISTORY args see `helm'."
helm--source-name
helm-current-source
helm-in-persistent-action
- helm-quit
+ helm--quit
(helm-buffer (or buffer helm-buffer)))
(helm-initialize
resume input default sources)
@@ -2858,26 +2876,28 @@ HISTORY args see `helm'."
;; only one candidate (this avoid having the helm frame
;; flashing), lets first compute candidates and if more
;; than one display helm-buffer (this is done later in
- ;; helm-read-pattern-maybe).
+ ;; helm-read-from-minibuffer).
(unless helm-execute-action-at-once-if-one
(helm-display-buffer helm-buffer resume)
- (select-window (helm-window)))
+ (select-window (helm-window))
+ (when (and resume helm-visible-mark-overlays)
+ (set-window-margins (selected-window) 1)))
;; We are now in helm-buffer.
(unless helm-allow-mouse
(helm--remap-mouse-mode 1)) ; Disable mouse bindings.
(add-hook 'post-command-hook 'helm--maybe-update-keymap)
;; Add also to update hook otherwise keymap is not updated
- ;; until a key is hitted (Issue #1670).
+ ;; until a key is hitted (Bug#1670).
(add-hook 'helm-after-update-hook 'helm--maybe-update-keymap)
(add-hook 'post-command-hook 'helm--update-header-line)
(helm-log "show prompt")
(unwind-protect
- (helm-read-pattern-maybe
+ (helm-read-from-minibuffer
prompt input preselect
resume keymap default history)
(helm-cleanup))
(prog1
- (unless helm-quit (helm-execute-selection-action))
+ (unless helm--quit (helm-execute-selection-action))
(helm-log (concat "[End session] " (make-string 41 ?-)))))
(quit
(helm-restore-position-on-quit)
@@ -3177,7 +3197,7 @@ frame configuration as per `helm-save-configuration-functions'."
;;
;; Since they don't know about the new timestamp,
;; their keyboard handling can break after a helm
- ;; user quits emacs, as reported in #1641.
+ ;; user quits emacs, as reported in bug#1641.
;;
;; Fortunately for us, we really don't need this
;; XSetInputFocus call, since we already have focus
@@ -3524,47 +3544,6 @@ For RESUME INPUT DEFAULT and SOURCES see `helm'."
(overlay-put helm-selection-overlay 'face 'helm-selection)
(overlay-put helm-selection-overlay 'priority 1)))
-(defun helm-restore-position-on-quit ()
- "Restore position in `helm-current-buffer' when quitting."
- (helm-current-position 'restore))
-
-(defun helm--push-and-remove-dups (elm sym)
- "Move ELM of SYM value on top and set SYM to this new value."
- (set sym (cons elm (delete elm (symbol-value sym)))))
-
-(defun helm--current-buffer ()
- "[INTERNAL] Return `current-buffer' BEFORE `helm-buffer' is initialized.
-Note that it returns the minibuffer in use after Helm has started
-and is intended for `helm-initial-setup'. To get the buffer where
-Helm was started, use `helm-current-buffer' instead."
- (if (minibuffer-window-active-p (minibuffer-window))
- ;; If minibuffer is active be sure to use it's buffer
- ;; as `helm-current-buffer', this allow to use helm
- ;; from an already active minibuffer (M-: etc...)
- (window-buffer (active-minibuffer-window))
- ;; Fix Issue #456
- ;; Use this instead of `current-buffer' to ensure
- ;; helm session started in helm-mode from a completing-read
- ;; Use really the buffer where we started and not the one
- ;; where the completing-read is wrapped. i.e
- ;; (with-current-buffer SOME-OTHER-BUFFER (completing-read [...])
- (window-buffer (with-selected-window (minibuffer-window)
- (minibuffer-selected-window)))))
-
-(defun helm--run-init-hooks (hook sources)
- "Run after and before init hooks local to source.
-See :after-init-hook and :before-init-hook in `helm-source'."
- (cl-loop with sname = (cl-ecase hook
- (before-init-hook "h-before-init-hook")
- (after-init-hook "h-after-init-hook"))
- with h = (cl-gensym sname)
- for s in sources
- for hv = (assoc-default hook s)
- if (and hv (not (symbolp hv)))
- do (set h hv)
- and do (helm-log-run-hook h)
- else do (helm-log-run-hook hv)))
-
(defun helm-initial-setup (default sources)
"Initialize Helm settings and set up the Helm buffer."
;; Run global hook.
@@ -3618,6 +3597,47 @@ See :after-init-hook and :before-init-hook in `helm-source'."
;; Run local source hook.
(helm--run-init-hooks 'after-init-hook sources))
+(defun helm--run-init-hooks (hook sources)
+ "Run after and before init hooks local to source.
+See :after-init-hook and :before-init-hook in `helm-source'."
+ (cl-loop with sname = (cl-ecase hook
+ (before-init-hook "h-before-init-hook")
+ (after-init-hook "h-after-init-hook"))
+ with h = (cl-gensym sname)
+ for s in sources
+ for hv = (assoc-default hook s)
+ if (and hv (not (symbolp hv)))
+ do (set h hv)
+ and do (helm-log-run-hook h)
+ else do (helm-log-run-hook hv)))
+
+(defun helm-restore-position-on-quit ()
+ "Restore position in `helm-current-buffer' when quitting."
+ (helm-current-position 'restore))
+
+(defun helm--push-and-remove-dups (elm sym)
+ "Move ELM of SYM value on top and set SYM to this new value."
+ (set sym (cons elm (delete elm (symbol-value sym)))))
+
+(defun helm--current-buffer ()
+ "[INTERNAL] Return `current-buffer' BEFORE `helm-buffer' is initialized.
+Note that it returns the minibuffer in use after Helm has started
+and is intended for `helm-initial-setup'. To get the buffer where
+Helm was started, use `helm-current-buffer' instead."
+ (if (minibuffer-window-active-p (minibuffer-window))
+ ;; If minibuffer is active be sure to use it's buffer
+ ;; as `helm-current-buffer', this allow to use helm
+ ;; from an already active minibuffer (M-: etc...)
+ (window-buffer (active-minibuffer-window))
+ ;; Fix Bug#456
+ ;; Use this instead of `current-buffer' to ensure
+ ;; helm session started in helm-mode from a completing-read
+ ;; Use really the buffer where we started and not the one
+ ;; where the completing-read is wrapped. i.e
+ ;; (with-current-buffer SOME-OTHER-BUFFER (completing-read [...])
+ (window-buffer (with-selected-window (minibuffer-window)
+ (minibuffer-selected-window)))))
+
(define-derived-mode helm-major-mode
fundamental-mode "Hmm"
"[INTERNAL] Provide major-mode name in Helm buffers.
@@ -3637,7 +3657,10 @@ Unuseful when used outside Helm, don't use it.")
(set (make-local-variable 'buffer-read-only) nil)
(buffer-disable-undo)
(erase-buffer)
- (set (make-local-variable 'helm-map) helm-map)
+ ;; Use this instead of setting helm-map local ensure we have all
+ ;; our keys when helm loose minibuffer focus. And the map is
+ ;; made local as well AFAIU.
+ (use-local-map helm-map)
(set (make-local-variable 'helm-source-filter) nil)
(make-local-variable 'helm-sources)
(set (make-local-variable 'helm-display-function) nil)
@@ -3673,7 +3696,7 @@ please don't use it outside of Helm.
(setq helm-pattern "")
(setq helm-maybe-use-default-as-input nil))
-(defun helm-read-pattern-maybe (prompt
+(defun helm-read-from-minibuffer (prompt
input preselect resume
keymap default history)
"Read pattern with prompt PROMPT and initial input INPUT.
@@ -3696,7 +3719,17 @@ For PRESELECT RESUME KEYMAP DEFAULT HISTORY, see `helm'."
resize-mini-windows))
(first-src (car helm-sources))
(source-process-p (or (assq 'candidates-process src)
- (assq 'candidates-process first-src))))
+ (assq 'candidates-process first-src)))
+ ;; As we are using `helm-keyboard-quit' for `C-g' we have
+ ;; to prevent emacs command loop redefining `C-g' during
+ ;; helm-session. This happen only on async source with
+ ;; large output after a certain delay. The effect is that
+ ;; the minibuffer is exited but the helm async process
+ ;; continue running, and because minibuffer is lost `C-g'
+ ;; have no more effect. By binding `inhibit-quit' here we
+ ;; prevent this and allow `C-g' (the helm one aka
+ ;; `helm-keyboard-quit') to quit immediately.
+ (inhibit-quit source-process-p))
(helm-log "helm-get-candidate-number => %S"
(helm-get-candidate-number))
(helm-log "helm-execute-action-at-once-if-one = %S"
@@ -3737,7 +3770,7 @@ For PRESELECT RESUME KEYMAP DEFAULT HISTORY, see `helm'."
(ignore)) ; Don't enter the minibuffer loop.
((and helm-quit-if-no-candidate
(= (helm-get-candidate-number) 0))
- (setq helm-quit t)
+ (setq helm--quit t)
(and (functionp helm-quit-if-no-candidate)
(funcall helm-quit-if-no-candidate)))
(t ; Enter now minibuffer and wait for input.
@@ -3858,7 +3891,7 @@ map)."
;; e.g C-x C-f M-y C-g
;; => *find-files have now the bindings of *kill-ring.
;; It is no more true now we are using `minor-mode-overriding-map-alist'
- ;; and `helm--minor-mode' thus it fix issue #1076 for emacs-24.3
+ ;; and `helm--minor-mode' thus it fix Bug#1076 for emacs-24.3
;; where concurrent timers are not supported.
;; i.e update keymap+check input.
(with-current-buffer (window-buffer (minibuffer-window))
@@ -3893,11 +3926,17 @@ WARNING: Do not use this mode yourself, it is internal to Helm."
(defun helm-cleanup ()
"Clean up the mess when Helm exit or quit."
(helm-log "start cleanup")
- (with-current-buffer helm-buffer
+ (with-selected-window
+ ;; When exiting with `helm-execute-action-at-once-if-one',
+ ;; `helm-window' may not be created and we endup with an error
+ ;; e.g. in eshell completion when only one candidate to complete
+ ;; so fallback to selected-window in such cases.
+ (or (get-buffer-window helm-buffer)
+ (selected-window))
(let ((frame (selected-frame)))
(setq cursor-type t)
;; Ensure restoring default-value of mode-line to allow user
- ;; using the mouse when helm is inactive (issues #1517,#2377).
+ ;; using the mouse when helm is inactive (Bug#1517,Bug#2377).
(setq mode-line-format (default-value 'mode-line-format))
(remove-hook 'post-command-hook 'helm--maybe-update-keymap)
(remove-hook 'post-command-hook 'helm--update-header-line)
@@ -3956,10 +3995,9 @@ WARNING: Do not use this mode yourself, it is internal to Helm."
;;
(defun helm-check-minibuffer-input ()
"Check minibuffer content."
- (with-helm-quittable
- (with-selected-window (or (active-minibuffer-window)
- (minibuffer-window))
- (helm-check-new-input (minibuffer-contents)))))
+ (with-selected-window (or (active-minibuffer-window)
+ (minibuffer-window))
+ (helm-check-new-input (minibuffer-contents))))
(defun helm-check-new-input (input)
"Check INPUT string and update the helm buffer if necessary."
@@ -3987,7 +4025,7 @@ WARNING: Do not use this mode yourself, it is internal to Helm."
"Retrieve and return the list of candidates from SOURCE."
(let* ((candidate-fn (assoc-default 'candidates source))
(candidate-proc (assoc-default 'candidates-process source))
- ;; See comment in helm-get-cached-candidates (Issue 2113).
+ ;; See comment in helm-get-cached-candidates (Bug#2113).
(inhibit-quit candidate-proc)
cfn-error
(notify-error
@@ -4024,7 +4062,7 @@ WARNING: Do not use this mode yourself, it is internal to Helm."
;; Can happen when the output of a process
;; is empty, and the candidates function call
;; something like (split-string (buffer-string) "\n")
- ;; which result in a list of one empty string (Issue #938).
+ ;; which result in a list of one empty string (Bug#938).
;; e.g (completing-read "test: " '(""))
(equal candidates '("")))
nil)
@@ -4036,23 +4074,16 @@ WARNING: Do not use this mode yourself, it is internal to Helm."
(helm-transform-candidates candidates source))
(t (funcall notify-error)))))
-(defmacro helm-while-no-input (&rest body)
- "Same as `while-no-input' but without the `input-pending-p' test."
- (declare (debug t) (indent 0))
- (let ((catch-sym (make-symbol "input")))
- `(with-local-quit
- (catch ',catch-sym
- (let ((throw-on-input ',catch-sym))
- ,@body)))))
-
(defun helm-get-cached-candidates (source)
"Return the cached value of candidates for SOURCE.
Cache the candidates if there is no cached value yet."
(let* ((name (assoc-default 'name source))
(candidate-cache (gethash name helm-candidate-cache))
;; Bind inhibit-quit to ensure function terminate in case of
- ;; quit from helm-while-no-input and processes are added to
- ;; helm-async-processes for further deletion (Issue 2113).
+ ;; quit from `helm-while-no-input' and processes are added to
+ ;; helm-async-processes for further deletion (Bug#2113).
+ ;; FIXME: Is this still needed now `helm-while-no-input'
+ ;; handles quit-flag?
(inhibit-quit (assoc-default 'candidates-process source)))
(helm-aif candidate-cache
(prog1 it (helm-log "Use cached candidates"))
@@ -4161,7 +4192,7 @@ If \(candidate-number-limit\) is in SOURCE, show all candidates in SOURCE.
If \(candidate-number-limit . 123\) is in SOURCE limit candidate to 123."
(helm-aif (assq 'candidate-number-limit source)
;; When assoc value is nil use by default 99999999 otherwise use
- ;; the assoc value, when it is a symbol interpret its value (#1831).
+ ;; the assoc value, when it is a symbol interpret its value (bug#1831).
(or (helm-aand (cdr it) (helm-interpret-value it)) 99999999)
(or helm-candidate-number-limit 99999999)))
@@ -4394,7 +4425,7 @@ to the matching method in use."
(with-temp-buffer
;; Insert the whole display part and remove non--match-part
;; to keep their original face properties.
- (insert (propertize (or mp display) 'read-only nil)) ; Fix (#1176)
+ (insert (propertize (or mp display) 'read-only nil)) ; Fix (bug#1176)
(goto-char (point-min))
(condition-case nil
(progn
@@ -4517,7 +4548,9 @@ emacs-27 to provide such scoring in emacs<27."
for dup = (gethash c hash)
for disp = (helm-candidate-get-display c)
while (< count limit)
- for target = (if (helm-attr 'match-on-real source)
+ for target = (if (helm-get-attr 'match-on-real source)
+ ;; Let's fails on error in
+ ;; case next block returns nil.
(or (cdr-safe c)
(get-text-property 0 'helm-realvalue disp))
disp)
@@ -4618,6 +4651,23 @@ emacs-27 to provide such scoring in emacs<27."
(put-text-property start (point)
'helm-multiline t)))))
+(defmacro helm-while-no-input (&rest body)
+ "Same as `while-no-input' but returns either BODY or nil.
+Unlike `while-no-input' this macro ensure to not returns `t'."
+ (declare (debug t) (indent 0))
+ (let ((catch-sym (make-symbol "input")))
+ `(with-local-quit
+ (catch ',catch-sym
+ (let ((throw-on-input ',catch-sym)
+ val)
+ (setq val (progn ,@body))
+ ;; See comments in `while-no-input' about resetting
+ ;; quit-flag.
+ (cond ((eq quit-flag throw-on-input)
+ (setq quit-flag nil))
+ (quit-flag nil)
+ (t val)))))))
+
(defmacro helm--maybe-use-while-no-input (&rest body)
"Wrap BODY in `helm-while-no-input' unless initializing a remote connection."
`(progn
@@ -4626,7 +4676,13 @@ emacs-27 to provide such scoring in emacs<27."
;; Tramp will ask for passwd, don't use `helm-while-no-input'.
,@body
(helm-log "Using here `helm-while-no-input'")
- (helm-while-no-input ,@body))))
+ ;; Emacs bug <https://debbugs.gnu.org/47205>, unexpected
+ ;; dbus-event is triggered on dbus init.
+ ;; Ignoring the dbus-event work on emacs28+; for emacs27 or older
+ ;; version, require tramp-archive can workaround the issue.
+ (let ((while-no-input-ignore-events
+ (cons 'dbus-event while-no-input-ignore-events)))
+ (helm-while-no-input ,@body)))))
(defun helm--collect-matches (src-list)
"Return a list of matches for each source in SRC-LIST.
@@ -4718,13 +4774,13 @@ without recomputing them, it should be a list of lists."
(setq matches (or candidates (helm--collect-matches sources))))
;; If computing matches finished and is not interrupted
;; erase the helm-buffer and render results (Fix #1157).
- (when matches ;; nil only when interrupted by helm-while-no-input.
+ (when matches ;; nil only when interrupted by while-no-input.
(erase-buffer) ; [1]
(cl-loop for src in sources
for mtc in matches
do (helm-render-source src mtc))
;; Move to first line only when there is matches
- ;; to avoid cursor moving upside down (issue #1703).
+ ;; to avoid cursor moving upside down (Bug#1703).
(helm--update-move-first-line)))
;; When there is only one async source, update mode-line and run
;; `helm-after-update-hook' in `helm-output-filter--post-process',
@@ -4758,8 +4814,9 @@ without recomputing them, it should be a list of lists."
(helm-aif (assq 'requires-pattern source) (or (cdr it) 1) 0))
;; Entering repeatedly these strings (*, ?) takes 100% CPU
;; and hang emacs on MacOs preventing deleting backward those
- ;; characters (issue #1802).
- (not (string-match-p "\\`[*]+\\'" helm-pattern))
+ ;; characters (Bug#1802). Update: it seems it is no more true,
+ ;; thus this affect bug#2423, so let's remove this for now.
+ ;; (not (string-match-p "\\`[*]+\\'" helm-pattern))
;; These incomplete regexps hang helm forever
;; so defer update. Maybe replace spaces quoted when using
;; multi-match.
@@ -4812,7 +4869,7 @@ passed as argument to `recenter'."
"Reinit SOURCE by calling its update and init functions."
;; When using a specific buffer as cache, don't kill it.
(helm-aif (and (null (bufferp (assoc-default
- (helm-attr 'name source)
+ (helm-get-attr 'name source)
helm--candidate-buffer-alist)))
(helm-apply-functions-from-source
source 'helm-candidate-buffer))
@@ -5041,7 +5098,7 @@ This will work only in Emacs-26+, i.e. Emacs versions that have
;;
(defun helm-output-filter (process output-string)
"The `process-filter' function for Helm async sources."
- (with-helm-quittable
+ (with-local-quit
(helm-output-filter-1 (assoc process helm-async-processes) output-string)))
(defun helm-output-filter-1 (process-assoc output-string)
@@ -5107,7 +5164,7 @@ This will work only in Emacs-26+, i.e. Emacs versions that have
;; incomplete-line-info assumed output was truncated in
;; only two chunks. But output could be large and
;; truncated in more than two chunks. Therefore store
- ;; 'newline' to contain the previous chunks (Issue #1187).
+ ;; 'newline' to contain the previous chunks (Bug#1187).
finally do (setcdr incomplete-line-info newline))))
(defun helm-output-filter--post-process ()
@@ -5250,7 +5307,7 @@ If action buffer is selected, back to the Helm buffer."
(helm-subr-native-elisp-p actions))
"Anonymous" actions))
(helm-show-action-buffer actions)
- ;; Be sure the minibuffer is entirely deleted (#907).
+ ;; Be sure the minibuffer is entirely deleted (bug#907).
(helm--delete-minibuffer-contents-from "")
(helm--set-action-prompt)
(helm-check-minibuffer-input))))
@@ -5444,7 +5501,7 @@ mode and header lines."
(with-selected-window (minibuffer-window)
(when helm-display-header-line
;; Prevent cursor movement over the overlay displaying
- ;; persistent-help in minibuffer (issue #2108).
+ ;; persistent-help in minibuffer (Bug#2108).
(setq-local disable-point-adjustment t))
(let* ((beg (save-excursion (vertical-motion 0 (helm-window)) (point)))
(end (save-excursion (end-of-visual-line) (point)))
@@ -5460,11 +5517,11 @@ mode and header lines."
"->"
'face 'helm-header-line-left-margin))))
(pos (- (point) beg)))
- ;; Increment pos each time we find a "%" up to current-pos (#1648).
+ ;; Increment pos each time we find a "%" up to current-pos (bug#1648).
(cl-loop for c across (buffer-substring-no-properties beg (point))
when (eql c ?%) do (cl-incf pos))
;; Increment pos when cursor is on a "%" to make it visible in header-line
- ;; i.e "%%|" and not "%|%" (#1649).
+ ;; i.e "%%|" and not "%|%" (bug#1649).
(when (eql (char-after) ?%) (setq pos (1+ pos)))
(setq cont (replace-regexp-in-string "%" "%%" cont))
(with-helm-buffer
@@ -5514,7 +5571,7 @@ It has no effect if `helm-echo-input-in-header-line' is nil."
(let ((ov (make-overlay (point-min) (point-max) nil nil t)))
(overlay-put ov 'window (selected-window))
(helm-aif (and helm-display-header-line
- (helm-attr 'persistent-help))
+ (helm-get-attr 'persistent-help))
(progn
(overlay-put ov 'display
(truncate-string-to-width
@@ -5685,7 +5742,7 @@ Key arg DIRECTION can be one of:
(forward-line 1) (eobp)))
;; Empty source at eob are just
;; not displayed unless they are dummy.
- ;; Issue #1117.
+ ;; Bug#1117.
(helm-get-next-header-pos))
(point-min))))
@@ -5791,6 +5848,17 @@ If SOURCE-OR-NAME is empty string or nil go to the first
candidate of first source."
(helm-move-selection-common :where 'source :direction source-or-name))
+(defvar helm-follow-action-white-list-commands
+ '(helm-ff-decrease-image-size-persistent
+ helm-ff-increase-image-size-persistent
+ helm-ff-rotate-left-persistent
+ helm-ff-rotate-right-persistent)
+ "Allow `helm-follow-action-forward/backward' switching to next file
+when one of these commands is the `last-command'.
+
+For example when browsing files with `C-<down>` and rotate the current file,
+hitting `C-<down>` again will not switch to next file but kill its buffer.")
+
(defun helm--follow-action (arg)
(let ((helm--temp-follow-flag t) ; Needed in HFF.
(in-follow-mode (helm-follow-mode-p)))
@@ -5799,6 +5867,7 @@ candidate of first source."
(when (or (eq last-command 'helm-follow-action-forward)
(eq last-command 'helm-follow-action-backward)
(eq last-command 'helm-execute-persistent-action)
+ (memq last-command helm-follow-action-white-list-commands)
in-follow-mode)
(if (> arg 0)
(helm-move-selection-common :where 'line
@@ -5912,7 +5981,7 @@ message 'no match'."
(defun helm--set-minibuffer-completion-confirm (src)
(with-helm-buffer
- (helm-aif (helm-attr 'must-match src)
+ (helm-aif (helm-get-attr 'must-match src)
(setq minibuffer-completion-confirm it))))
(defun helm-read-string (prompt &optional initial-input history
@@ -6037,14 +6106,6 @@ to a list of forms.\n\n")
;; Misc
-(defun helm-kill-buffer-hook ()
- "Remove tick entry from `helm-tick-hash' and remove buffer from
-`helm-buffers' when killing a buffer."
- (cl-loop for key being the hash-keys in helm-tick-hash
- if (string-match (format "^%s/" (regexp-quote (buffer-name))) key)
- do (remhash key helm-tick-hash))
- (setq helm-buffers (remove (buffer-name) helm-buffers)))
-(add-hook 'kill-buffer-hook 'helm-kill-buffer-hook)
(defun helm-preselect (candidate-or-regexp &optional source)
"Move selection to CANDIDATE-OR-REGEXP on Helm start.
@@ -6074,7 +6135,7 @@ Optional argument SOURCE is a Helm source object."
(re-search-forward (cdr candidate-or-regexp) nil t))
(re-search-forward candidate-or-regexp nil t))
;; If search fall on an header line continue loop
- ;; until it match or fail (Issue #1509).
+ ;; until it match or fail (Bug#1509).
(unless (helm-pos-header-line-p) (cl-return (setq mp it))))
(goto-char (or mp start)))))
(forward-line 0) ; Avoid scrolling right on long lines.
@@ -6248,7 +6309,7 @@ To customize `helm-candidates-in-buffer' behaviour, use `search',
(or (assoc-default 'search src)
'(helm-candidates-in-buffer-search-default-fn))
(helm-candidate-number-limit src)
- (helm-attr 'match-part)
+ (helm-get-attr 'match-part)
src)))
(defun helm-candidates-in-buffer-search-default-fn (pattern)
@@ -6478,7 +6539,7 @@ before running again the init function."
(global global-bname)
(local local-bname)))
;; We need a buffer not read-only to perhaps insert later
- ;; text coming from read-only buffers (issue #1176).
+ ;; text coming from read-only buffers (Bug#1176).
(set (make-local-variable 'buffer-read-only) nil)
;; Undo is automatically disabled in buffer names starting
;; with a space, so no need to disable it.
@@ -6818,7 +6879,7 @@ unsuitable window to display persistent action buffer."
((and helm--buffer-in-new-frame-p helm-initial-frame)
(with-selected-frame helm-initial-frame (selected-window)))
((and split (not (eq split 'never))) (split-window))
- ;; Fix Issue #2050 with dedicated window.
+ ;; Fix Bug#2050 with dedicated window.
((and (window-dedicated-p
(setq prev-win (previous-window (selected-window) 1)))
(not (eq split 'never)))
@@ -6915,7 +6976,7 @@ Meaning of prefix ARG is the same as in `reposition-window'."
(defun helm-make-visible-mark (&optional src selection)
(let* ((source (or src (helm-get-current-source)))
(sel (or selection (helm-get-selection
- nil (helm-attr 'marked-with-props source)
+ nil (helm-get-attr 'marked-with-props source)
source)))
(selection-end (if (helm-pos-multiline-p)
;; Stays within source
@@ -6927,10 +6988,16 @@ Meaning of prefix ARG is the same as in `reposition-window'."
(o (make-overlay (point-at-bol) selection-end)))
(overlay-put o 'priority 0)
(overlay-put o 'face 'helm-visible-mark)
- (overlay-put o 'source (assoc-default 'name source))
+ (overlay-put o 'source source)
(overlay-put o 'string (buffer-substring (overlay-start o) (overlay-end o)))
(overlay-put o 'real sel)
+ (overlay-put o 'before-string (propertize " " 'display
+ `((margin left-margin)
+ ,(propertize
+ helm-visible-mark-prefix
+ 'face 'helm-mark-prefix))))
(overlay-put o 'visible-mark t)
+ (overlay-put o 'evaporate t)
(cl-pushnew o helm-visible-mark-overlays)
(push (cons source sel) helm-marked-candidates)))
@@ -6956,7 +7023,9 @@ If ARG is negative toggle backward."
(progn
(helm-display-mode-line (helm-get-current-source))
(cl-return nil))
- (funcall (cdr next-fns))))))))))
+ (funcall (cdr next-fns)))))
+ (set-window-margins (selected-window)
+ (if helm-visible-mark-overlays 1 0)))))))
(put 'helm-toggle-visible-mark 'helm-only t)
(defun helm-toggle-visible-mark-forward ()
@@ -6982,7 +7051,9 @@ With a prefix arg mark all visible unmarked candidates in all
sources."
(interactive "P")
(with-helm-alive-p
- (with-helm-window ; Using `with-helm-buffer' for some unknow reasons infloop.
+ (with-helm-window ; Using `with-helm-buffer' for some unknow
+ ; reasons infloop.
+ (set-window-margins (selected-window) 1)
(if (null all)
(helm-mark-all-1 t)
(let ((pos (point)))
@@ -7033,7 +7104,7 @@ starting it is not needed."
(helm-mark-current-line)
(let* ((prefix (get-text-property (point-at-bol) 'display))
(cand (helm-get-selection
- nil (helm-attr 'marked-with-props src)
+ nil (helm-get-attr 'marked-with-props src)
src))
(bn (and filecomp-p (helm-basename cand))))
;; Don't mark possibles directories ending with . or ..
@@ -7043,7 +7114,7 @@ starting it is not needed."
;; Non existing files in HFF and
;; RFN. Display may be an image. See
;; https://github.com/yyoncho/helm-treemacs-icons/issues/5
- ;; and also issue #2296.
+ ;; and also Bug#2296.
(equal prefix "[?]")
(and filecomp-p
(or
@@ -7069,7 +7140,8 @@ starting it is not needed."
(helm-clear-visible-mark))
(setq helm-marked-candidates nil)
(helm-mark-current-line)
- (helm-display-mode-line (helm-get-current-source)))))
+ (helm-display-mode-line (helm-get-current-source))
+ (set-window-margins (selected-window) 0))))
(put 'helm-unmark-all 'helm-only t)
(defun helm-toggle-all-marks (&optional all)
@@ -7128,7 +7200,7 @@ sources."
sel)
(unless candidates
(setq sel (helm-get-selection
- nil (helm-attr 'marked-with-props
+ nil (helm-get-attr 'marked-with-props
current-src)
current-src))
(setq candidates
@@ -7155,18 +7227,29 @@ sources."
(with-current-buffer helm-buffer
(save-excursion
(cl-dolist (o helm-visible-mark-overlays)
- (let ((o-src-str (overlay-get o 'source))
- (o-str (overlay-get o 'string))
- beg end)
+ (let* ((source (overlay-get o 'source))
+ (ov-src-name (assoc-default 'name source))
+ (ov-str (overlay-get o 'string))
+ (ov-real (overlay-get o 'real))
+ (ov-ml-str (helm-aif (helm-get-attr 'multiline source)
+ (if (numberp it)
+ ;; Assume display have been computed
+ ;; against real e.g. kill-ring.
+ (helm--multiline-get-truncated-candidate
+ ov-real it)
+ ov-str)
+ ov-str))
+ beg end)
;; Move point to end of source header line.
(goto-char (point-min))
- (search-forward o-src-str nil t)
- (while (and (search-forward o-str nil t)
+ (search-forward ov-src-name nil t)
+ (while (and (search-forward ov-ml-str nil t)
(cl-loop for ov in (overlays-at (point-at-bol 0))
never (overlay-get ov 'visible-mark))
- (helm-current-source-name= o-src-str))
+ (helm-current-source-name= ov-src-name))
(setq beg (match-beginning 0)
- end (match-end 0))
+ end (if (string= ov-ml-str ov-str)
+ (match-end 0) (1+ (match-end 0))))
;; Calculate real value of candidate.
;; It can be nil if candidate have only a display value.
(let ((real (get-text-property (point-at-bol 0) 'helm-realvalue)))
@@ -7175,10 +7258,10 @@ sources."
;; than the one stored in overlay.
;; This is needed when some cands have same display names.
;; Using equal allow testing any type of value for real cand.
- ;; Issue (#706).
- (and (equal (overlay-get o 'real) real)
+ ;; bug#706.
+ (and (equal ov-real real)
(move-overlay o beg end))
- (and (equal o-str (buffer-substring beg end))
+ (and (equal ov-str (buffer-substring beg end))
(move-overlay o beg end))))))))))
(add-hook 'helm-after-update-hook 'helm-revive-visible-mark)
@@ -7252,20 +7335,22 @@ perform actions."
(format "%s" (helm-get-selection nil (not arg))))))
(put 'helm-kill-selection-and-quit 'helm-only t)
-(defun helm-copy-to-buffer ()
- "Copy selection or marked candidates to `helm-current-buffer'.
-Note that the real values of candidates are copied and not the
-display values."
- (interactive)
+(defun helm-insert-or-copy (&optional arg)
+ "Insert selection or marked candidates in current buffer.
+
+With a prefix arg copy marked candidates to kill-ring.
+The real value of each candidate is used."
+ (interactive "P")
(with-helm-alive-p
(helm-run-after-exit
(lambda (cands)
(with-helm-current-buffer
- (insert (mapconcat (lambda (c)
- (format "%s" c))
- cands "\n"))))
+ (let ((sels (mapconcat (lambda (c)
+ (format "%s" c))
+ cands "\n")))
+ (if arg (kill-new sels) (insert sels)))))
(helm-marked-candidates))))
-(put 'helm-copy-to-buffer 'helm-only t)
+(put 'helm-insert-or-copy 'helm-only t)
;;; Follow-mode: Automatic execution of persistent-action
@@ -7375,11 +7460,11 @@ source or `helm-follow-input-idle-delay' or
(defun helm-follow-mode-p (&optional source)
(with-helm-buffer
- (eq (helm-attr 'follow (or source (helm-get-current-source))) 1)))
+ (eq (helm-get-attr 'follow (or source (helm-get-current-source))) 1)))
(defun helm-follow-mode-set-source (value &optional source)
(with-helm-buffer
- (helm-attrset 'follow value (or source (helm-get-current-source)))))
+ (helm-set-attr 'follow value (or source (helm-get-current-source)))))
;;; Auto-resize mode
;;
@@ -7455,10 +7540,4 @@ help."
(provide 'helm)
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
-
;;; helm.el ends here